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

Jon*_*ark 5 x86 cpu-architecture hyperthreading tlb mmu

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

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

我认为,在那种情况下,线程没有任何机会达到TLB,因为线程具有自己的地址空间。

如果那样的话,我认为这种表现将被降级。

Had*_*ais 5

TLB在英特尔处理器中的组织方式如下:

  • 英特尔NetBurst(第一个支持HT的):复制ITLB。DTLB是竞争性共享的。
  • 英特尔Nehalem(第二个支持HT),Westmere,Sandy Bridge和Ivy Bridge:复制了庞大的ITLB页面。小页面ITLB是静态分区的。所有DTLB都是竞争性共享的。
  • 英特尔Haswell,Broadwell和Skylake:ITLB小页面是动态分区的。复制了巨大的页面ITLB。所有其他TLB都是静态分区的。
  • Sunny Cove:ITLB是静态分区的。所有DTLB和STLB都是竞争性共享的。
  • AMD Zen,Zen +,Zen 2(系列17h):所有TLB都是竞争性共享的。

参考文献:

(我不清楚在任何英特尔凌动微体系结构中TLB的组织方式。我认为L2 DTLB是共享的,L1 DTLB是复制的。我不了解ITLB。)

(顺便说一下,在较旧的AMD处理器中,所有TLB都是按每个内核复制的。请参阅:不同cpu AMD / Intel上的物理内核和逻辑内核。)

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

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

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

相关:使用多个特定于页面大小的TLB进行地址转换

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

(请注意,通常TLB被认为是MMU的一部分。关于MMU的Wikipedia 文章显示了一个旧版本的书中的图,表示它们是分开的。但是,该书的最新版本已删除了该图。并说TLB是MMU的一部分。)