答案 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)也许页面“不可见”