x86-64页表全局位

时间:2017-02-01 18:19:09

标签: x86 x86-64 page-tables

此设置中的每个PTE(页表条目)都有一个G位(G =全局), 它控制此条目映射的物理页面的范围。

如果设置了G位,则该条目对所有进程都是全局的,它们可以 所有访问它映射的物理页面,受其他访问权限的限制。 如果G位为零,则该条目不是全局的,而是对进程是私有的。 [内核为其页面设置G位,但阻止用户模式访问 通过在其页面上禁用U位(U =用户模式)。]

如果G-bit设置在用户模式PTE上 - 那个设置了U位的PTE - 不是 安全漏洞,因为系统上的每个进程现在都可以访问该页面了 PTE地图?

我错过了什么吗?有没有办法在用户模式PTE上设置G位 但只在一组受信任的进程中使其成为全局,而不是全部 系统上的进程?我们可以在PTE中设置G和U位吗?

1 个答案:

答案 0 :(得分:1)

是的,在x86上,G-bit仅在存在其他类型的控制(例如将其限制为内核使用的Ring 0)或未受保护的操作系统 1 <时才有用。 / SUP>

将G-bit视为系统调用的优化:内核将其页面映射为全局,因此不需要进行TLB刷新。您仍然需要在进程之间的上下文切换上进行TLB刷新,但这些通常比内核&lt; - &gt;用户模式切换少几个数量级。

您可以想象 G页面对用户进程有用的场景,例如共享内存:在两个进程之间切换不需要使共享内存的TLB条目无效如果意识到了这一点,并为这两个进程使用了​​G==1映射。这些天TLB笔芯实际上并不是那么糟糕,因为现代x86缓存了许多表条目甚至超出TLB以允许快速重新填充。

我认为不允许设置G和U位,但内核不会以这种方式实际设置它。

作为最后一点,你可以想象一下只读全局映射对于像vdso机制这样的东西是有用的。所有进程都将映射该页面,但无法对其进行修改,内核会根据需要对其进行更新。当然,我无法看到如何实际完成这项工作,因为内核需要写访问权限,并且似乎没有办法表达“只读环3,r / w为环0”页表。也许内核可以为这个页面使用另一个映射,但我不确定这是否合法:有一个覆盖“G”映射的映射(因为如果G映射在TLB中,CPU可能永远不会看到覆盖映射)。

1 从技术上讲,它可能对单用户操作系统有用,其中所有用户模式进程具有相同的权限,但内核仍受到用户模式的保护,但AFAIK在当代操作系统中并不存在该模型。