处理器x86 / x86_64中使用物理或虚拟寻址在L1,L2和L3中进行缓存?

时间:2013-09-26 21:46:11

标签: caching x86 virtual-memory tlb virtual-address-space

在处理器x86 / x86_64中使用哪种寻址在L1,L2和L3(LLC)中进行缓存 - 物理或虚拟(使用PT / PTE和TLB)并且以某种方式PAT(page attribute table)影响到它?

在这种情况下,驱动程序(内核空间)和应用程序(用户空间)之间是否存在差异?


简短回答 - 英特尔使用虚拟索引,物理标记(VIPT)L1缓存:What will be used for data exchange between threads are executing on one Core with HT?

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

1 个答案:

答案 0 :(得分:35)

你问题的答案是 - 这取决于你。这完全是CPU设计决策,它平衡了性能和复杂性之间的权衡。

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

理论上,可以构建一个虚拟索引+ virtualy标记的缓存,这将删除通过地址转换的要求(TLB查找,以及TLB未命中时的页面遍历)。但是,这会导致许多问题,尤其是内存别名 - 两个虚拟地址映射到同一个物理地址的情况。

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

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