32

处理器 x86/x86_64 中使用哪种寻址来缓存 L1、L2 和 L3(LLC) - 物理或虚拟(使用 PT/PTE 和TLB ), PAT(页面属性表)会以某种方式影响它?

在这种情况下,驱动程序(内核空间)和应用程序(用户空间)之间有区别吗?


简短的回答 - 英特尔使用虚拟索引、物理标记(VIPT) L1 缓存:在一个具有 HT 的核心上执行线程之间的数据交换将使用什么?

  • L1 -虚拟寻址(在8-way缓存中定义Set需要低12 bits,这在 virt & phys 中是相同的)
  • L2 -物理寻址(需要访问 TLB 以获得 Virt-2-Phys)
  • L3 -物理寻址(需要访问 TLB 以获得 Virt-2-Phys)
4

1 回答 1

40

你的问题的答案是 - 这取决于。这严格来说是一个 CPU 设计决策,需要在性能和复杂性之间进行权衡。

以最近的英特尔酷睿处理器为例 - 它们被物理标记并虚拟索引(至少根据http://www.realworldtech.com/sandy-bridge/7/)。这意味着缓存只能在纯物理地址空间中完成查找,以确定该行是否存在。但是,由于 L1 是 32k,8 路关联,这意味着它使用 64 个集合,因此您只需要地址位 6 到 11 即可找到正确的集合。碰巧的是,虚拟地址和物理地址在此范围内是相同的,因此您可以在读取缓存集的同时查找 DTLB - 一个已知的技巧(参见 - http://en.wikipedia.org/wiki/CPU_cache一个很好的解释)。

从理论上讲,可以构建一个虚拟索引+虚拟标记缓存,这将消除通过地址转换的要求(TLB 查找,以及在 TLB 未命中的情况下进行页面遍历)。然而,这会导致很多问题,尤其是内存别名——两个虚拟地址映射到同一个物理地址的情况。

假设 core1 在这样一个完全虚拟的缓存中具有虚拟地址 A 缓存(它映射到 phys 地址 C,但我们还没有进行此检查)。core2 写入映射到相同物理地址 C 的虚拟地址 B - 这意味着我们需要一些机制(通常是“窥探”,由 Jim Goodman 创造的术语)使 core1 中的该行无效,管理数据合并和一致性管理如果需要的话。但是,core1 无法响应该窥探,因为它不知道虚拟地址 B,并且不将物理地址 C 存储在虚拟缓存中。所以你可以看到我们有一个问题,虽然这主要与严格的 x86 系统相关,但其他架构可能更宽松,并且允许更简单地管理此类缓存。

关于其他问题——我能想到的与 PAT 没有真正的联系,缓存已经设计好了,不能针对不同的内存类型进行更改。另一个问题的答案相同 - 硬件主要位于用户/内核模式之间的区别之下(除了它提供的安全检查机制,主要是各种环)。

于 2013-09-27T20:58:35.953 回答