VIPT 到 PIPT 的转换如何在 L1->L2 逐出时工作

How does the VIPT to PIPT conversion work on L1->L2 eviction

这个场景出现在我的脑海中,它似乎有点基础,但我会问。

因此L1 中有一个虚拟索引和物理标记,但集合已满,因此被逐出。 L1 控制器如何从 L1 中的虚拟索引和物理标记中获取完整的物理地址,以便将线路插入到 L2 中?我想它可以在 TLB 中搜索组合,但这看起来很慢,而且它可能根本不在 TLB 中。也许原始 TLB 转换的完整物理地址存储在缓存行旁边的 L1 中?

这也引发了一个更广泛的问题,即 PMH 在将访问的位写入 PTE 和 PDE 等时如何使 L1 条目无效。据我了解,它直接与 L2 高速缓存接口以获取物理地址,但是当它写入访问和修改的位以及在需要时发送 RFO 时,它必须反映 L1 副本中的更改(如果有)一,意味着它必须知道物理地址的虚拟索引。在这种情况下,如果完整的物理地址也存储在 L1 中,那么它也为 L2 提供了一种能够对其进行索引的方法。

是的,外部缓存(几乎?)总是 PIPT,内存本身显然需要物理地址。所以当你把它发送到内存层次结构时,你需要一个线的物理地址。


在 Intel CPU 中,VIPT L1 缓存具有地址页内偏移部分的所有索引位,因此 virt=phys,避免了任何别名问题。它基本上是 PIPT,但仍然能够从集合中获取 data/tags,同时通过 TLB 查找页码位来为标签比较器创建输入。

完整的物理地址 仅从 L1d 索引 + 标签知道的,同样是因为除了加载延迟之外,它的行为就像一个 PIPT。


在虚拟索引缓存的一般情况下,其中一些索引位确实来自页码,这是一个很好的问题。这样的系统确实存在,OS 经常使用页面着色来避免混淆。 (因此他们不需要在上下文切换时刷新缓存。)

有一个这样的 VIPT L1d 的图表:物理标签扩展了几位,一直向下到页面偏移量,与顶部索引位重叠.

很好地观察到回写缓存需要能够在对存储的 TLB 检查完成后很长时间内清除脏行。与加载不同,除非将 TLB 结果存储在某个地方,否则您不会仍然有 TLB 结果。

让标签包含页面偏移量以上的所有物理地址位(即使与某些索引位重叠)可以解决此问题。

另一种解决方案是直写缓存,因此您 总是有来自 TLB 的物理地址与数据一起发送,即使它不能从缓存中重建标签+索引。或者用于只读缓存,例如指令缓存,虚拟不是问题。


但我不认为驱逐时的 TLB 检查 可以 解决非重叠标记案例的问题你不再有完整的虚拟地址,只有页码的低位是虚拟的(来自索引),其余是物理的(来自标签)。所以这不是 TLB 的有效输入。

所以除了效率低下之外,还有一个同样重要的问题就是根本行不通。 :P 也许有一些我不知道的技巧或我遗漏的东西,但我不认为即使是一个特殊的 TLB 索引双向(phys->virt 和 virt->phys)也可以工作,因为多个映射允许相同的物理页面。


我认为真正使用过VIVT缓存的CPU通常都是直写的。我不太了解历史,无法肯定地说或举出任何例子。我看不出它们如何被回写,除非它们为每一行存储两个标签(物理和虚拟)。

我认为早期的 RISC CPU 通常有 8k 直接映射缓存。

但是第一代经典 5 阶段 MIPS R2000 (using external SRAM for its L1) apparently had a PIPT write-back cache, if the diagram in these slides labeled MIPS R2000 是正确的,显示了一个 14 位缓存索引,从 TLB 结果的物理页号中获取了一些位。但它仍然适用于 2 个周期的加载延迟(1 个用于 EX 阶段的地址生成,1 个用于 MEM 阶段的缓存访问)。

那时候的时钟速度要低得多,缓存+TLB 变得更大了。我想当时 ALU 中的 32 位二进制加法器确实具有与 TLB + 缓存访问相当的延迟,可能没有使用激进的进位先行或进位-select 设计。

A MIPS 4300i datasheet,(Nintendo 64 中使用的 MIPS 4200 的变体)显示了 where/when 在其 5 级流水线中发生的情况,有些事情发生在时钟的上升沿或下降沿,让它在一个阶段内将一些东西分成半时钟。 (例如,转发可以从一个阶段的前半部分工作到另一个阶段的第二半部分,例如对于分支目标 -> 指令获取,仍然不需要在半阶段之间进行额外的锁存。)

无论如何,它显示了 EX 中发生的 DVA(数据虚拟地址)计算:即来自 lw $t0, 1234($t1) 的寄存器 + imm16。然后 DTLB 和 DCR(数据缓存读取)在数据缓存阶段的前半部分并行发生。 (所以这是一个 VIPT)。 DTC (Data Tag Check) 和 LA (load alignment e.g. shifting for LWL / LWR, or for LBU to extract a byte from a fetched word) 在第二个阶段并行发生。

所以我还没有找到单周期(地址计算后)PIPT MIPS 的确认。但这明确证实了单周期 VIPT 是一回事。来自维基百科,we know that its D-cache was 8-kiB direct-mapped write-back.