每当发生分段错误时,我们总是有页面错误吗?
任何有Linux内核代码经验的人都可以在这里指出代码吗?
我已经看到了:分段错误与页面错误
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)异常。内核捕获异常并将终止信号发送给故障程序。
在以下情况下也可能发生分段错误:
a) 一个有缺陷的程序/命令,只能通过应用补丁来修复。
b) 当您尝试在 C 编程下访问超出数组末尾的数组时,它也会出现。
c) 在 chrooted jail 中,当关键共享库、配置文件或 /dev/ 条目丢失时,可能会发生这种情况。
d) 有时硬件或内存或驱动程序故障也会产生问题。
e) 维护所有计算机设备的建议环境(过热也会产生此问题)。
为什么会出现页面错误:
a) 试图访问一个虚拟内存地址
b)指令操作数/指令地址
c) 读数据/写数据,或取指令
d)也许页面“不存在”
e) 可能页面“不可读”</p>
f)也许页面是“不可写”</p>
g) 可能页面“不可见”</p>