Memory management 当我们出现分段错误时,是否会出现页面错误?

Memory management 当我们出现分段错误时,是否会出现页面错误?,memory-management,operating-system,Memory Management,Operating System,每当出现分段错误时,我们是否总是有页面错误 任何有linux内核代码经验的人都可以在这里指出代码吗 我已经看到:在以下情况下也会出现分段错误: a) 错误的程序/命令,只能通过应用补丁来修复 b) 在C编程中,当您试图访问数组末尾以外的数组时,也会出现此错误 c) 在chrooted监狱中,当关键共享lib、配置文件或/dev/entry丢失时,可能会发生这种情况 d) 有时,硬件或故障内存或驱动程序也会造成问题 e) 为所有计算机设备维护建议的环境(过热也会产生此问题) 出现页面错误的原因:

每当出现分段错误时,我们是否总是有页面错误

任何有linux内核代码经验的人都可以在这里指出代码吗


我已经看到:

在以下情况下也会出现分段错误:

a) 错误的程序/命令,只能通过应用补丁来修复

b) 在C编程中,当您试图访问数组末尾以外的数组时,也会出现此错误

c) 在chrooted监狱中,当关键共享lib、配置文件或/dev/entry丢失时,可能会发生这种情况

d) 有时,硬件或故障内存或驱动程序也会造成问题

e) 为所有计算机设备维护建议的环境(过热也会产生此问题)

出现页面错误的原因:

a) 正在尝试访问虚拟内存地址

b) 指令操作数/指令地址

c) 读取数据/写入数据,或获取指令

d) 也许佩奇“不在场”

e) 可能页面“不可读”

f) 可能页面“不可写”


g) 可能页面“不可见”

在以下情况下也会出现分段错误:

a) 错误的程序/命令,只能通过应用补丁来修复

b) 在C编程中,当您试图访问数组末尾以外的数组时,也会出现此错误

c) 在chrooted监狱中,当关键共享lib、配置文件或/dev/entry丢失时,可能会发生这种情况

d) 有时,硬件或故障内存或驱动程序也会造成问题

e) 为所有计算机设备维护建议的环境(过热也会产生此问题)

出现页面错误的原因:

a) 正在尝试访问虚拟内存地址

b) 指令操作数/指令地址

c) 读取数据/写入数据,或获取指令

d) 也许佩奇“不在场”

e) 可能页面“不可读”

f) 可能页面“不可写”

g) 可能页面“不可见”

Pagefault(也称为#PF)是导致segfault的常见原因(在不存在的页面上寻址某些数据,在没有相应权限级别的情况下尝试从受保护的页面读取或写入数据,从不执行页面获取代码,…)

但是,由于其他一些罕见的原因,可能会发生断层。例如,如果您尝试在没有请求的当前特权级别(CPL)的情况下执行特权指令。检查此示例:

% cat segfault.c && gcc segfault.c -o segfault
int     main(void)
{
  __asm__("invd");

  return 0;
}

% ./segfault
Segmentation fault
在此示例中,segfault与内存无关。
invd
指令是特权指令(仅当CPL为0时可执行)。因此,您无法从用户空间执行它。执行此指令时,会发生一般保护故障(aka#GP)异常。内核捕获异常并向故障程序发送终止信号。

Pagefault(也称为#PF)是导致segfault的常见原因(在不存在的页面上寻址某些数据,尝试在没有相应权限级别的情况下从受保护页面读取或写入数据,从不执行页面获取代码,…)

但是,由于其他一些罕见的原因,可能会发生断层。例如,如果您尝试在没有请求的当前特权级别(CPL)的情况下执行特权指令。检查此示例:

% cat segfault.c && gcc segfault.c -o segfault
int     main(void)
{
  __asm__("invd");

  return 0;
}

% ./segfault
Segmentation fault

在此示例中,segfault与内存无关。
invd
指令是特权指令(仅当CPL为0时可执行)。因此,您无法从用户空间执行它。执行此指令时,会发生一般保护故障(aka#GP)异常。内核捕获异常并将kill信号发送到故障程序。

Thnx Benoit,这是我期待的精确澄清。Thnx Benoit,这是我期待的精确澄清。酷,这两个都是很好的详尽列表!酷,这是一个很好的详尽的清单!