x86-64 页表全局位

x86-64 page table Global bit

提问人:user3051390 提问时间:2/2/2017 更新时间:3/24/2022 访问量:3365

问:

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

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

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

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

x86-64 页表

评论

1赞 Peter Cordes 8/31/2023
更新:Meltdown 漏洞破坏了某些 CPU 上读取的 U/S 位,以及各种其他推测执行和微架构漏洞,因此最好不要在用户空间运行时保持内核页面映射。所以现代 Linux 没有,即使在没有 Meltdown 漏洞的硬件上也是如此。请参阅评论中的讨论 TLB 如何区分不同页表的条目? 了解更多信息。(Linux 在 x86 上为每个进程使用 2 个 PCID,以便在带/不带内核版本的页表之间切换,对于没有

答:

2赞 BeeOnRope 2/2/2017 #1

是的,在 x86 上,G 位仅在存在其他类型的控件(例如将其限制为环 0,这是内核使用的控件)或未受保护的操作系统1 时才有用。

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

您可以想象一个场景,其中 G 页面对用户进程很有用,例如共享内存:如果内核意识到这一点并对两个进程都使用映射,则在两个进程之间切换不需要使共享内存的 TLB 条目失效。不过,如今 TLB 笔芯实际上并没有那么糟糕,因为现代 x86 缓存了大量表条目,甚至超出了 TLB 以允许快速笔芯。G==1

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

最后一点,你实际上可以想象一个只读的全局映射是有用的,比如 vdso 机制。所有进程都会映射该页面,但无法修改它,内核会根据需要更新它。当然,我看不出如何实际做到这一点,因为内核需要写入访问权限,而且似乎没有办法在页表中表示“ring 3 readonly,ring 0 r/w”。也许内核可以为此页面使用另一个映射,但我不确定这是否合法:有一个覆盖“G”映射的映射(因为如果 G 映射在 TLB 中,CPU 可能永远不会看到覆盖映射)。


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

评论

1赞 Michael Petch 2/2/2017
内核可以将 VDSO 页面数据映射到内核空间,并将其指向与映射到用户空间的页面相同的物理内存。两者都可以有不同的限制,允许内核对数据进行读/写权限,并将其限制为用户模式的只读数据。
1赞 BeeOnRope 2/2/2017
哦,是的,当然,内核只是使用不同的虚拟地址来访问它,一切都很好。无论如何,VDSO 用例可能不是一个超级有趣的用例,因为它每个进程只有一个页面。@MichaelPetch
0赞 BeeOnRope 2/2/2017
我想一个有趣的问题是:在同一个用户下运行的进程今天可以在 Linux 中读取彼此的内存空间吗?如果不是,如果可以的话,是否反对安全模型?如果没问题,那么您可以想象一个优化,其中 G 页面用于用户空间进程,当上下文切换到来自同一用户的另一个进程时,不必清除这些页面。我想它对于一些使用大量不同工作进程和共享内存的应用程序可能很有用......
0赞 Margaret Bloom 2/2/2017
CR4 之前。PCIDE = 1 时代,G 位只是防止在迁移到 CR3 时刷新某些 TLB 条目的一种方式。进程可以访问映射的每个页面(如果它具有权限):全局或非全局。没有安全漏洞。即使使用 CR4。PCIDE = 1,PCID 用作管理 TLB 缓存的软件控制方式,它们仅与进程隔离间接相关:它更像是一种防止操作系统刷新每个上下文交换机上的 TLB 的功能。因此,G 位与缓存的关系比与安全性的关系更大。它只需要 TLB 中留下的任何映射来破坏操作系统,无论是否全局。
1赞 Alex P. 2/21/2017
我认为 BeeOnRope 说得对“即使没有映射,进程也可以访问这样的页面”。选中“Intel 64 和 IA-32 架构”中的“4.10.3.2 使用分页结构缓存转换线性地址”。第 3 卷“它说”如果处理器找到一个用于线性地址页码的 TLB 条目,并且该条目与当前 PCID(或全局)相关联,则它可能会使用该条目中的物理地址、访问权限和其他属性。这可能是对当前 PCID 的地址转换结构中未引用的物理页的内存访问。