1

每当发生分段错误时,我们总是有页面错误吗?

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

我已经看到了:分段错误与页面错误

4

2 回答 2

8

Pagefault(又名#PF)是段错误的常见原因(在不存在的页面上处理一些数据,试图在没有相应权限级别的情况下从受保护的页面读取或写入数据,从非执行页面获取代码,. ..)。

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

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

  return 0;
}

% ./segfault
Segmentation fault

在此示例中,段错误与内存无关。该invd指令是特权指令(仅在 CPL 为ring0时可执行)。因此,您无法从用户空间执行它。执行此指令时,会发生一般保护错误(又名#GP)异常。内核捕获异常并将终止信号发送给故障程序。

于 2012-06-08T13:14:10.997 回答
0

在以下情况下也可能发生分段错误:

a) 一个有缺陷的程序/命令,只能通过应用补丁来修复。

b) 当您尝试在 C 编程下访问超出数组末尾的数组时,它也会出现。

c) 在 chrooted jail 中,当关键共享库、配置文件或 /dev/ 条目丢失时,可能会发生这种情况。

d) 有时硬件或内存或驱动程序故障也会产生问题。

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

为什么会出现页面错误:

a) 试图访问一个虚拟内存地址

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

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

d)也许页面“不存在”

e) 可能页面“不可读”</p>

f)也许页面是“不可写”</p>

g) 可能页面“不可见”</p>

于 2012-06-08T12:37:07.643 回答