TLB如何区分不同页表的条目?

How does TLB differentiate between entries of different Page tables?

由于不同的进程有自己的Pagetable,TLB缓存是如何区分两个pagetable的呢? 还是每次不同的进程都刷新 TLB CPU?

是的,设置一个新的顶级页面table物理地址(例如x86 mov cr3, rax)会使所有现有的TLB条目失效1,或者在其他 ISA 可能的软件将需要使用额外的指令来确保安全。 (我猜的,我只知道x86是怎么做到的)。
一些 ISA 对 TLB 进行纯粹的软件管理,在这种情况下,肯定会由软件在上下文切换时刷新所有或至少刷新非全局 TLB 条目。

最近的 CPU 功能允许我们在某些情况下避免完全失效。 上下文 ID 为每个 TLB 条目提供一些额外的标记位,因此 CPU 可以跟踪它们来自哪个页面-table 并且只命中条目匹配当前上下文。这样,在一小组页面 table 之间频繁切换可以保持一些条目有效。

在 x86 上,相关功能是 PCID(进程上下文 ID):当 OS 设置新的顶级页面 - table 地址时,它与上下文 ID 号相关联。 (当前 CPUs 上可能有 4 位 IIRC)。它在页面-table 地址的低位传递。 Page-tables 必须是页面对齐的,所以这些位实际上是未使用的;此功能将它们重新用作单独的位域,页面偏移量上方的 CR3 位通常用作物理页码。

并且 OS 可以告诉 CPU 在加载新页面时是否刷新 TLB table,用于切换回先前的上下文或回收不同任务的上下文 ID。 (通过设置新CR3值的高位,mov cr, reg manual entry。)

x86 PCID 是第二代 Nehalem 中的新内容:https://www.realworldtech.com/westmere/ 从 CPU 架构 PoV 中对其进行了简要描述。

我认为类似的支持扩展到 HW 虚拟化/嵌套页面 tables,以减少来宾之间管理程序切换的成本。

我希望其他具有任何类型的 page-table 上下文机制的 ISA 的工作方式大致相似,它是 OS 与 / 作为新顶部的一部分一起设置的小整数-级页面-table地址。


脚注 1:除了 PTE 指示此页面将在所有页面 table 中映射为相同的“全局”页面。这让 OSes 通过以这种方式标记内核页面来优化,因此当内核上下文切换用户 -space 任务时,这些 TLB 条目可以保持热。当然,两个页面 tables 实际上都应该具有该页面的有效条目,这些条目确实映射到相同的 phys 地址。至少在 x86 上,PTE 格式中有一点让 CPU 知道它可以假定 TLB 条目在不同的页目录中仍然有效。