当我们有一个支持某种形式的多线程的 CPU 时,每个逻辑 CPU 都有它自己的一组寄存器(至少),包括 CR3 寄存器。
由于我们在执行不同线程时正在处理同一进程的虚拟地址空间,并且永远不会发生上下文切换(切换同一进程的线程时TLB缓存也不会失效),为什么我们需要一个CR3寄存器来指向逻辑CPU中的页表和页目录?
该值不是总是与物理CPU的CR3中的值相同吗?
由于我们在执行不同线程时正在处理同一进程的虚拟地址空间
这并不是 HT 的全部能力。我认为您将“硬件线程”(执行上下文/逻辑核心)与“软件线程”混淆了。
两个逻辑核心运行在一个物理核心上,具有一个物理 iTLB / dTLB / L2TLB。逻辑核心非常独立,不必从同一进程运行线程。
这是一个令人向往的房产SMT https://en.wikipedia.org/wiki/Simultaneous_multithreading像Intel的HT这样的设计:如果操作系统必须小心避免将具有不同页表的线程调度到同一物理内核的不同逻辑内核上,则需要内核之间更多的同步。
不同进程(具有单独的 CR3 页表)的两个线程可以共享一个 TLB,因为这些条目都标有 PCID(进程上下文 ID)。 IIRC,硬件虚拟化也使用类似(或相同?)的标记来避免在 VM 退出或在来宾之间切换时需要 TLB 刷新。
操作系统可以设置 PCID(CR3 的低 12 位)以避免在上下文切换时需要 TLB 刷新,并且作为奖励可以让 2 个进程同时使用 TLB。Linux 是否使用 x86 CPU 的 PCID 功能进行 TLB?如果没有,为什么? https://stackoverflow.com/questions/20155304/does-linux-use-x86-cpus-pcid-feature-for-tlb-if-not-why(据此,Linux 一般不使用 PCID,但我认为 HT 会使用。)
嗯,我不确定我的详细信息是否正确,但实际上,即使两个逻辑核心具有不同的 CR3,TLB 条目也有某种标记可以将它们分开。
根据英特尔论坛主题 https://software.intel.com/en-us/forums/intel-moderncode-for-parallel-architectures/topic/281287, SnB 系列 CPU 对 iTLB 进行静态分区(因此每个逻辑核心获得一半的条目)。这会自动解决任何共享问题。
dTLB 和 L2TLB 是竞争性共享的,因此它们确实需要标记。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)