在Linux内核中,由于早期的x86体系结构中没有NX位,所以页表条目(PTE)只包含读写位,而不包含eXecute位。
我不明白为什么PTE中的X位需要硬件支持。
如我所见,我们可以在内核源代码中定义一个位来将PTE结构化为X位。当访问页表时,内核将在PTE中检查此位。
任何解释都将不胜感激。谢谢!
发布于 2015-09-25 13:37:09
因为你的方案一旦在does not use that bit for NX的架构上运行就会崩溃。
发布于 2015-09-25 13:38:51
软件中的NX?假设内核可以确定陷阱的原因是来自指令队列的内存加载,而不是任何任意的内存访问,则必须始终使所有页面无效,以保证来自某个任意"jmp 0x1231231“指令的陷阱。这对于其他任何事情来说都太昂贵了,除了学术练习。
(代码页可以被列入白名单,但数据页不能)
发布于 2015-09-25 13:39:00
硬件需要区分“读取数据”和“读取代码”。在NX-bit支持之前,如果一个页面是可读的,你就可以开始使用它了。
Aki的回答是我所说的硬币的另一面。在没有硬件支持的情况下进行NX将需要单步执行每个正在运行的进程来检查其跳转/调用指令。或者通过解析指令流,或者通过在每条指令之前使所有非代码页无效。(如果发现访问是加载而不是跳转,则将它们标记为有效。)
https://stackoverflow.com/questions/32775266
复制相似问题