如何在 Linux x86_64 和 x86 中设置内存段权限



我一直在试图解决这个问题。我读过 Linux 使用分页,DEP 是通过将页面标记为不可执行来强制执行的。但是读/写权限呢?全局描述符表和段寄存器如何发挥作用?我读到全局和本地描述符表包含每个段的权限。那么是控制权限的表还是内核维护的 VM 区域结构?

x86 段寄存器在这里不起作用(线程本地存储的 FS 或 GS 除外(。 分段不用于控制读/写,而是按页表条目按页完成。

Linux 在自己的数据结构中跟踪与硬件页表分开的映射,以确定要放入硬件页表中的内容。

硬件页表条目(每页一个(具有只读与读写的位。 这甚至在旧的页表格式中也存在,在新的(PAE 和 x86-64 长模式(页表格式为 DEP 引入无执行位之前。

有关 x86-64 页表格式的图表以及指向更多文档的链接,请参阅为什么在 64 位中,虚拟地址比物理地址短 4 位(48 位长(?。

32 位模式 PAE 页表基本相同。有关位的细分,请参阅 https://wiki.osdev.org/Paging#MMU,特别是每个硬件 PTE 中的 R 位控制硬件的功能。

最新更新