处理器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 回答
你的问题的答案是 - 这取决于 . 这完全是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没有真正的联系,缓存已经设计好了,并且不能针对不同的内存类型进行更改 . 另一个问题的答案相同 - 硬件主要是在用户/内核模式之间的区别(除了它为安全检查提供的机制,主要是各种环) .