为什么每个逻辑CPU在多线程情况下都拥有自己的CR3寄存器?

时间:2017-11-04 22:14:09

标签: multithreading x86 cpu

当我们有一个支持某种形式的多线程的CPU时,每个逻辑CPU都有它自己的一组寄存器(至少),包括一个CR3寄存器。

由于我们在执行不同线程时正在处理同一进程的虚拟地址空间并且从不发生上下文切换(切换同一进程的线程时TLB缓存都无效),为什么我们需要一个CR3寄存器来指向逻辑CPU中的页表和页面目录?

该值是否始终与物理CPU的CR3中的值相同?

1 个答案:

答案 0 :(得分:2)

  

因为我们在执行不同线程时正在处理同一进程的虚拟地址空间

并非所有HT都能胜任。我认为你将“硬件线程”(执行上下文/逻辑核心)与“软件线程”混淆。

两个逻辑核心在一个物理核心上运行,一个物理iTLB / dTLB / L2TLB。 逻辑核心非常独立,不必在同一进程中运行线程。

这是SMT设计中的理想属性,如Intel的HT:如果操作系统必须小心避免将具有不同页表的线程调度到同一物理内核的不同逻辑内核上,则需要在内核之间实现更多同步

不同进程的两个线程(具有单独的CR3页表)可以共享一个TLB,因为条目标记有PCID(进程上下文ID)。 IIRC,硬件虚拟化也使用类似(或相同的)标记,以避免在VM出口或客户端之间切换时需要TLB刷新。

操作系统可以设置PCID(CR3的低12位)以避免在上下文切换时需要TLB刷新,并且作为奖励可以使2个进程同时使用TLB。 Does Linux use x86 CPU's PCID feature for TLB? If not, why?(据此,Linux通常不使用PCID,但我认为它适用于HT。)

嗯,我不确定我是否完全正确,但实际上有一些TLB条目的标记,即使两个逻辑核心具有不同的CR3,它们也会保持分离。

根据an Intel forum thread,SnB系列CPU静态分区iTLB(因此每个逻辑核心获得一半的条目)。这会自动解决任何共享问题。

dTLB和L2TLB是竞争性共享的,因此它们确实需要标记。