Linuxx86_64和x86中内存段权限是怎么设置的

How are memory segment permissions set in Linux x86_64 and x86

我想弄清楚这个问题已经有一段时间了。我读到 Linux 使用分页,并且通过将页面标记为非 executable 来强制实施 DEP。但是权限 read/write 呢?全局描述符 table 和段寄存器如何发挥作用?我读到全局和局部描述符 tables 包含每个段的权限。那么是控制权限的tables还是内核维护的VM区域结构?

x86 段寄存器 在这里发挥作用(线程本地存储的 FS 或 GS​​ 除外)。分段不用于控制 read/write,它是在每页的基础上使用 page-table 条目完成的。

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

硬件页面 table 条目(每页一个)具有只读与读写的位。在新的(PAE 和 x86-64 长模式)页面 table 格式为 DEP 引入 No-eXecute 位之前,这甚至存在于旧版页面-table 格式中。

有关 x86-64 页面 table 格式的图表以及指向更多文档的链接,请参阅

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