【问题标题】:How does TLB differentiate between entries of different Page tables?TLB如何区分不同Page表的条目?
【发布时间】:2022-01-08 05:35:07
【问题描述】:

由于不同的进程都有自己的页表,TLB缓存如何区分两个页表? 还是每次不同进程获得 CPU 时都会刷新 TLB?

【问题讨论】:

标签: memory-management cpu-architecture virtual-memory tlb


【解决方案1】:

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

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

在 x86 上,相关功能是 PCID(进程上下文 ID):当操作系统设置新的顶级页表地址时,它与上下文 ID 号相关联。 (在当前 CPU 上可能是 4 位 IIRC)。它在页表地址的低位中传递。页表必须是页对齐的,因此这些位实际上是未使用的;此功能将它们重新用作单独的位域,在页面偏移上方的 CR3 位通常用作物理页号。

操作系统可以告诉 CPU 在加载新页表时是否刷新 TLB,以便切换回先前的上下文,或为不同的任务回收上下文 ID。 (通过设置新CR3值的高位,mov cr, reg manual entry。)

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

我认为类似的支持扩展到硬件虚拟化/嵌套页表,以降低来宾之间管理程序切换的成本。

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


脚注 1:除了“全局”的 PTE 指示此页面将在所有页表中映射相同。这让操作系统可以通过这种方式标记内核页面进行优化,因此当内核上下文切换用户空间任务时,这些 TLB 条目可以保持热状态。当然,两个页表实际上都应该具有该页的有效条目,这些条目确实映射到相同的物理地址。至少在 x86 上,PTE 格式中有一点让 CPU 知道它可以假设 TLB 条目在不同的页面目录中仍然有效。

【讨论】:

  • Re 脚注 1,我认为 Meltdown 对全局 TLB 条目功能设置了一个阻尼器。有了 KPTI,我认为内核现在有了自己的 PCID。或者也许每个进程都有两个 PCID,一个用于用户空间,一个用于内核?没查过。
  • 有趣的是,英特尔的手册似乎没有包含任何关于全局 TLB 功能可能存在危险的警告。
  • @NateEldredge:是的,没错,在没有针对 Meltdown 的硬件修复的 CPU 上,内核无法再安全地使用全局页面。 (希望它仍然可以在非英特尔 CPU 上使用,尽管 some non-x86 ISAs have some affected CPUs。)是的,它使用 PCID 作为内核。不确定它是如何管理 copy_from_user / copy_to_user 的;如果它是跨所有任务的单个 PCID,则需要在使用之前和/或之后使这些用户页面无效?嗯,这可能解释了我不久前使用的一些小缓冲区read 基准测试。
  • @NateEldredge:我确信在所有受其影响的 CPU 上都有已发布的 Meltdown 勘误表。与 Spectre 不同的是,它很容易在新硬件中修复,因此这不是一个持续存在的问题。 (anandtech.com/show/13450/… 显示 CFL 刷新与硬件缓解)。不过,它足够重要,值得在手册中警告,至少在现有 CPU 仍然普遍存在的情况下。一般来说,它们不会用每个 CPU 的勘误表来混淆通用 ISA 手册,但 OTOH 的大多数勘误表并不像那样严重或与安全相关。
  • (至少经典的 Meltdown 应该是一个简单的修复,只需将加载结果强制为 0 并将其标记为 fault-if-reaching-retirement)。其他不依赖于应该出错的负载的崩溃相关漏洞(通常是 MSD)我认为与使用全局页表条目正交,因此再次使用全局页面的内核不应该使它们更加危险。 (或者也许我忘记了什么;我已经有一段时间没有看到这些漏洞和最新的品种了。)
猜你喜欢
  • 2019-05-13
  • 2020-06-24
  • 2015-07-29
  • 2016-02-04
  • 2015-09-15
  • 1970-01-01
  • 1970-01-01
  • 2012-01-12
  • 2014-08-14
相关资源
最近更新 更多