超线程核心是否共享 MMU 和 TLB?

Does a hyper-threaded core share MMU and TLB?

据我所知,MMU 和 TLB 在英特尔的超线程内核中都没有共享 x86_64。

但是,如果两个不共享地址 space 的线程被调度到同一个物理内核,它们如何 运行?

我认为,在那种情况下,线程没有任何机会命中 TLB,因为线程有自己的地址 spaces。

如果那样的话,我觉得性能会降级到这个地步

TLB 在 Intel 处理器中的组织方式如下:

  • Intel NetBurst(第一个支持HT):复制了ITLB。 DTLB 竞争共享。
  • Intel Nehalem(第二个支持HT)、Westmere、Sandy Bridge、Ivy Bridge:复制大页ITLB。小页面 ITLB 是静态分区的。所有 DTLB 均以竞争方式共享。
  • Intel Haswell、Broadwell、Skylake:小页面ITLB动态分区。大页面 ITLB 被复制。 Table 优化手册(2019 年 9 月)的 2-12 说其他 TLB 的策略是 "fixed"。我认为这意味着静态分区。但是根据Translation Leak-aside Buffer: Defeating Cache Side-channel Protections with TLB Attacks(第6节)论文的实验结果,似乎"fixed"意味着竞争共享。这将与早期和后来的微体系结构一致。
  • Sunny Cove:ITLB 是静态分区的。所有 DTLB 和 STLB 都是竞争共享的。
  • AMD Zen、Zen+、Zen 2(Family 17h):所有 TLB 均以竞争方式共享。

参考文献:

我不清楚 TLB 在任何英特尔凌动微体系结构中是如何组织的。我认为 L1 DTLB 和 STLB(在 Goldmont Plus 中)或 L2 DTLB(在早期的微体系结构中)是共享的。根据 Intel SDM V3(2019 年 10 月)的第 8.7.13.2 节:

In processors supporting Intel Hyper-Threading Technology, data cache TLBs are shared. The instruction cache TLB may be duplicated or shared in each logical processor, depending on implementation specifics of different processor families.

虽然这并不准确,因为 ITLB 也可以分区。

我不知道 Intel Atoms 中的 ITLB。

(顺便说一下,在较旧的 AMD 处理器中,所有 TLB 都是每个内核复制的。参见:Physical core and Logical cores on different cpu AMD/Intel。)

共享 TLB 时,每个 TLB 条目都标记有分配它的逻辑处理器 ID(单个位值,不同于进程上下文标识符,可以禁用或不支持) .如果另一个线程被调度到逻辑核心上的 运行 并且该线程访问与前一个线程不同的虚拟地址 space ,则 OS 必须加载第一个线程的相应基本物理地址级页面结构到 CR3。每当写入 CR3 时,内核都会自动刷新所有标记有逻辑内核 ID 的共享 TLB 中的所有条目。还有其他操作可能会触发此刷新。

分区和复制的 TLB 不需要用逻辑核心 ID 标记。

如果支持并启用进程上下文标识符 (PCID),则不会使用逻辑核心 ID,因为 PCID 更强大。请注意,分区和复制的 TLB 带有 PCID 标记。

相关:.

(注意还有其他的分页结构缓存,它们的组织方式类似。)

(注意,通常TLB被认为是MMU的一部分。MMU上的维基百科article显示了旧版书籍中的一个数字,表明它们是分开的。但是,最最近版本的书把图去掉了,说TLB是MMU的一部分。)