为什么内存NX在Linux内核中需要硬件支持?

时间:2015-09-25 05:15:04

标签: linux linux-kernel x86

在Linux内核中,页表项(PTE)包含R / W位但没有eXecute位,因为早期x86架构中没有NX位。

我不明白为什么PTE中的X位需要硬件支持。

正如我所看到的,我们可以定义一个位来将PTE结构化为内核源代码中的X位。访问页表时,内核将在PTE中检查此位。

任何解释将不胜感激。谢谢!

3 个答案:

答案 0 :(得分:0)

因为您的方案会在does not use that bit for NX

的架构上运行后立即中断

答案 1 :(得分:0)

NX在软件中?假设内核可以确定陷阱的原因是来自指令队列的内存加载而不是任何任意内存访问,则必须始终使所有页面*无效以保证来自某些任意“jmp 0x1231231”指令的陷阱。对于其他任何事情而言,这都是代价太高,但这是一项学术活动。

(代码页可以列入白名单,但数据页不能)

答案 2 :(得分:0)

硬件需要区分“读取数据”和“读取代码”。在NX-bit支持之前,如果页面完全可读,您可以跳转到它。

<答案> Aki的回答是我所说的硬币的另一面。在没有硬件支持的情况下执行NX将需要单步执行每个正在运行的进程来检查其跳转/调用指令。通过解析指令流,或通过在每条指令之前使所有非代码页无效。 (然后标记它们是有效的,如果结果是访问是一个负载,而不是跳转。)