为什么在多线程的情况下每个逻辑 CPU 都有自己的 CR3 寄存器?
Why each logical CPU has it's own CR3 register in case of multithreading?
当我们有一个支持某种形式的多线程的 CPU 时,每个逻辑 CPU 都有自己的一组寄存器(至少),包括一个 CR3 寄存器。
既然我们在执行不同的线程时处理同一个进程的虚拟地址space,并且上下文切换永远不会发生(切换同一个进程的线程时TLB缓存也不会失效),为什么我们需要一个 CR3 寄存器来指向页面 table 和逻辑 CPU?
中的页面目录
这个值不总是和物理CPU的CR3中的值一样吗?
Since we are working on the vitual address space of the same process when executing different threads
HT 的功能还不止于此。我认为您将 "hardware thread" (执行上下文/逻辑核心)与 "software thread".
混淆了
两个逻辑内核 运行 一个物理内核,一个物理 iTLB / dTLB / L2TLB。 逻辑核心非常独立,不必是来自同一进程的 运行ning 个线程。
在像 Intel 的 HT 这样的 SMT 设计中,这是一个理想的 属性:如果 OS 必须小心避免将具有不同页表的线程调度到相同的不同逻辑内核上物理核心,这将需要核心之间的更多同步。
不同进程的两个线程(具有单独的 CR3 页表)可以共享一个 TLB,因为条目标记有 PCID(进程上下文 ID)。 IIRC,硬件虚拟化也使用类似(或相同?)标记来避免在 VM 退出时或在来宾之间切换时需要刷新 TLB。
OS 可以设置 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 竞争共享,因此它们确实需要标记。
当我们有一个支持某种形式的多线程的 CPU 时,每个逻辑 CPU 都有自己的一组寄存器(至少),包括一个 CR3 寄存器。
既然我们在执行不同的线程时处理同一个进程的虚拟地址space,并且上下文切换永远不会发生(切换同一个进程的线程时TLB缓存也不会失效),为什么我们需要一个 CR3 寄存器来指向页面 table 和逻辑 CPU?
中的页面目录这个值不总是和物理CPU的CR3中的值一样吗?
Since we are working on the vitual address space of the same process when executing different threads
HT 的功能还不止于此。我认为您将 "hardware thread" (执行上下文/逻辑核心)与 "software thread".
混淆了两个逻辑内核 运行 一个物理内核,一个物理 iTLB / dTLB / L2TLB。 逻辑核心非常独立,不必是来自同一进程的 运行ning 个线程。
在像 Intel 的 HT 这样的 SMT 设计中,这是一个理想的 属性:如果 OS 必须小心避免将具有不同页表的线程调度到相同的不同逻辑内核上物理核心,这将需要核心之间的更多同步。
不同进程的两个线程(具有单独的 CR3 页表)可以共享一个 TLB,因为条目标记有 PCID(进程上下文 ID)。 IIRC,硬件虚拟化也使用类似(或相同?)标记来避免在 VM 退出时或在来宾之间切换时需要刷新 TLB。
OS 可以设置 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 竞争共享,因此它们确实需要标记。