如何使用物理地址窥探虚拟寻址缓存

How to snoop a virtually-addressed cache using a physical address

可以使用给定的物理地址侦听虚拟寻址的 L1 的选项有哪些?

至少存在三种使用物理地址侦听虚拟地址 L1 缓存的方法。

也许最明显的是使用包含物理地址寻址的 L2 缓存,并包括有关块占用的集合和方式的信息(如果它在 L1 中)。包含 属性 只需要应用于标签,例如,在标签中提供的关联方式是内存数据块中的两倍。当 L2 关联性不足以处理 L1 中映射到给定索引的所有块时,这可能导致 L2 中的未命中需要逐出 L1 缓存行。考虑到典型的 L2 容量和关联性,这种驱逐通常很少见。

(给定 4 KiB 页面,在 32 KiB L1 中,一个特定的物理地址可以使用简单的模索引映射到 8 个不同的位置——倾斜的关联性使事情复杂化——所以一个包容性的 4 向关联 physically-addressed L2 可以不能保证不会发生这种反向失效,尽管 8 路 L2 可以。由于空间局部性很常见并且 L2 缓存相对较大,因此冲突问题并不像人们对随机访问模式所期望的那样普遍。跨越的倍数页面大小将使此类冲突最大化。)

与第一种方法密切相关的第二种方法是在物理寻址结构中复制标签。 (如果此结构与 L2 关联,它可能被视为 tag-inclusive L2 的一个版本。)这允许处理器使用虚拟地址访问高速缓存,而侦听器使用物理地址。物理寻址的标签存储可能需要具有相对较高的关联性,但由于窥探不如处理器缓存访问常见,因此可以更慢地完成探测以节省功率(和面积)。

(理论上,这个二级标签存储可以被过滤,例如,使用部分标签,这通常表示窥探未命中并且通常将可能性限制为一个。L1 中只有一个虚拟标签偶尔检查,窥探访问虚拟索引的 L1 标签并使用 TLB 进行翻译的性能损失可能是可以接受的。虽然原则上窥探可以检索所有可能与物理地址匹配的虚拟标签并翻译和检查它们,但这通常是不可接受的开销.对于不大于页面大小的direct-mapped L1,这可能是可以接受的,所以这可能算作另一种方法。此外,可能会提出其他过滤机制。页面着色可以减少要翻译的地址数量到 L1 的结合性。)

第三种方法是提供将物理地址转换为虚拟地址的反向TLB。 (我似乎记得读过 HP-RISC 处理器使用这种方法。)反向 TLB 未命中将指示探测的物理地址不在 L1 中。当新翻译必须删除在 L1 中仍有块的翻译时,这可以引入 back-invalidations。

虚拟索引和 物理标记 L1 可以简单地探测其他可能的侦听方式。这可能会干扰处理器对 L1 的访问,但在标量处理器中,如果只有一个或两个虚拟地址索引位与物理地址位不匹配,则可能有足够的数据缓存标记带宽通常支持访问和窥探探测。需要四个探头。 (为侦听提供的额外标签带宽也可用于软件预取,并允许 tag-data 顺序访问以在准备好探测缓存的访问多于数据路径支持的访问时节省电力。)