根据各种恶意,x86上的Linux试图通过将所有4个段(用户代码,用户数据,内核代码,内核数据)设置为基本0x00000000并限制0xfffff来摆脱分段,并在寻呼级别处理内存访问。
使用此设置,为什么仍然可以获得SIGSEGV(segfault)?
或者SIGSEGV在更广泛的“访问冲突”中使用意味着这里和实际原因是页面错误?
答案 0 :(得分:2)
如果访问没有支持内存的页面,页面错误只会导致分段违规;否则MM将尝试从磁盘或交换加载页面。如果进程试图访问底部的64KiB内存,也可以进行分段违规,因为它受到保护以捕获愚蠢的程序员错误,例如NULL解除引用。
答案 1 :(得分:2)
正如您所说,SIGSEGV被用作“访问冲突” 实际原因是您访问了指向当前进程中未映射的内存的指针 这有几种变体(例如,不存在的页面,没有现有的段,内核页面,写入只读页面),它们都以SIGSEGV结束。