【发布时间】:2015-09-25 05:15:03
【问题描述】:
在 Linux 内核中,页表项 (PTE) 包含 R/W 位,但没有执行位,因为早期的 x86 架构中没有 NX 位。
我不明白为什么 PTE 中的 X 位需要硬件支持。
正如我所见,我们可以在内核源代码中定义一个位来将 PTE 结构为 X 位。内核在访问页表时会检查PTE中的这个位。
任何解释将不胜感激。谢谢!
【问题讨论】:
标签: linux linux-kernel x86
在 Linux 内核中,页表项 (PTE) 包含 R/W 位,但没有执行位,因为早期的 x86 架构中没有 NX 位。
我不明白为什么 PTE 中的 X 位需要硬件支持。
正如我所见,我们可以在内核源代码中定义一个位来将 PTE 结构为 X 位。内核在访问页表时会检查PTE中的这个位。
任何解释将不胜感激。谢谢!
【问题讨论】:
标签: linux linux-kernel x86
因为您的方案一旦在 does not use that bit for NX 的架构上运行就会中断。
【讨论】:
软件中的 NX?假设内核可以识别陷阱的原因是指令队列中的内存加载而不是任何任意内存访问,则必须始终使所有页面*无效以保证来自某个任意“jmp 0x1231231”指令的陷阱。除了学术活动之外,这对于其他任何事情来说都太昂贵了。
(代码页可以列入白名单,但数据页不能)
【讨论】:
硬件需要区分“读取数据”和“读取代码”。在 NX 位支持之前,如果页面完全可读,则可以跳转。
Aki 的回答与我所说的相反。在没有硬件支持的情况下进行 NX 需要单步执行每个正在运行的进程来检查其跳转/调用指令。通过解析指令流,或者在每条指令之前使所有非代码页无效。 (如果发现访问是负载而不是跳转,则将它们标记为有效。)
【讨论】: