gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 12:54:27 25 4
gpt4 key购买 nike

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

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

该值是否不总是与物理CPU CR3中的值相同?

最佳答案

Since we are working on the vitual address space of the same process when executing different threads



那不是HT所能提供的。我认为您将“硬件线程”(执行上下文/逻辑核心)与“软件线程”混淆了。

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

在像英特尔HT这样的 SMT设计中,这是一个理想的属性:如果操作系统必须谨慎地避免将具有不同页表的线程调度到同一物理核心的不同逻辑核心上,则将需要在核心之间进行更多的同步。

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

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

嗯,我不确定我的详细信息是否正确,但是实际上,即使两个逻辑内核具有不同的CR3,也存在某种类型的TLB条目标记,以使它们分开。

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

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

关于multithreading - 在多线程的情况下,为什么每个逻辑CPU都有自己的CR3寄存器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47116141/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com