为啥内存 NX 需要 Linux 内核中的硬件支持?
Posted
技术标签:
【中文标题】为啥内存 NX 需要 Linux 内核中的硬件支持?【英文标题】:Why does memory NX need hardware support in Linux kernel?为什么内存 NX 需要 Linux 内核中的硬件支持? 【发布时间】:2015-09-25 05:15:03 【问题描述】:在 Linux 内核中,页表项 (PTE) 包含 R/W 位,但没有执行位,因为早期的 x86 架构中没有 NX 位。
我不明白为什么 PTE 中的 X 位需要硬件支持。
正如我所见,我们可以在内核源代码中定义一个位来将 PTE 结构为 X 位。内核在访问页表时会检查PTE中的这个位。
任何解释将不胜感激。谢谢!
【问题讨论】:
【参考方案1】:因为您的方案一旦在 does not use that bit for NX 的架构上运行就会中断。
【讨论】:
【参考方案2】:软件中的 NX?假设内核可以识别陷阱的原因是指令队列中的内存加载而不是任何任意内存访问,则必须始终使所有页面*无效以保证来自某个任意“jmp 0x1231231”指令的陷阱。除了学术活动之外,这对于其他任何事情来说都太昂贵了。
(代码页可以列入白名单,但数据页不能)
【讨论】:
在声称“做不到”之后,下一个问题是:“反正怎么做?”也许指令流的部分(循环?)可以被分析为安全并在没有每条指令保护的情况下运行。【参考方案3】:硬件需要区分“读取数据”和“读取代码”。在 NX 位支持之前,如果页面完全可读,则可以跳转。
Aki 的回答与我所说的相反。在没有硬件支持的情况下进行 NX 需要单步执行每个正在运行的进程来检查其跳转/调用指令。通过解析指令流,或者在每条指令之前使所有非代码页无效。 (如果发现访问是负载而不是跳转,则将它们标记为有效。)
【讨论】:
以上是关于为啥内存 NX 需要 Linux 内核中的硬件支持?的主要内容,如果未能解决你的问题,请参考以下文章
安卓智能手机的基于ARM架构的处理器,为啥能够支持基于Linux内核的操作系统?
Linux 内核 内存管理内存管理架构 ③ ( Linux 内核中的内存管理模块 | 页分配器 | 不连续页分配器 | 内存控制组 | 硬件设备内存管理 | MMU | 页表缓存 | 高速缓存 )