每当我们遇到分段错误时是否会发生页面错误?

时间:2012-06-08 12:34:17

标签: memory-management operating-system

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

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

我已经看过:segmentation fault vs page fault

2 个答案:

答案 0 :(得分:7)

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 ring0 时才可执行)。因此,您无法从用户空间执行它。执行此指令时,会发生通用保护错误(又称#GP)异常。内核捕获异常并将kill信号发送给错误的程序。

答案 1 :(得分:0)

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

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

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

c)在chrooted jail中,当关键的共享库,配置文件或/ dev / entry丢失时,就会发生这种情况。

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

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

为什么会发生页面错误:

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

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

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

d)也许页面“不存在”

e)也许页面“不可读”

f)也许页面“不可写”

g)也许页面“不可见”