首页 文章

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

提问于
浏览
23

处理器x86 / x86_64中使用哪种寻址在L1,L2和L3(LLC)中进行缓存 - 物理或虚拟(使用PT / PTE和TLB)以及某种方式对它有影响吗?

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


简短回答 - 英特尔使用 virtually indexed, physically tagged (VIPT)L1缓存:What will be used for data exchange between threads are executing on one Core with HT?

  • L1 - Virtual 寻址(在 8-way cache中定义 Set 需要低 12 bits ,这与virt&phys相同)

  • L2 - Physical 寻址(需要访问Virt-2-Phys的TLB)

  • L3 - Physical 寻址(需要访问Virt-2-Phys的TLB)

1 回答

  • 34

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

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

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

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

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

相关问题