CS152 · 第 10 课

Virtual Memory:TLB 与缓存的相互作用

这一课把第 9 课的地址转换机制和更早的缓存设计结合起来,回答一个具体的工程问题:当缓存用虚拟地址索引以求更快时,会带来哪些正确性隐患(别名问题),又该如何解决?

授课:Sophia Shao 预计用时:50 分钟 难度:中等 → 较难

回顾第 9 课

裸机只有物理地址;base/bound 提供最简单的段式保护,但有外部碎片;分页把地址拆成页号+偏移,解决外部碎片但引入内部碎片;线性页表在 64 位地址空间下大到不现实(第 9 课发现幻灯片自身"35TB"数字与重新验算的"约140.7TB"不一致),催生层级页表;TLB 缓存地址转换结果,TLB Reach = 项数 × 页大小。


现代虚拟内存系统的两大功能

现代虚拟内存系统提供"大容量、私有、统一存储"的假象,核心是两项功能:保护与隐私(每个用户拥有私有地址空间,也可以有共享的部分);按需分页(允许运行比物理内存更大的程序,同时屏蔽不同机器配置之间的差异)。代价是每次访存都要做一次地址转换。标记 TLB(Tagged TLB / ASID)——以 MIPS R4000 为例:与其在每次进程切换时清空整个 TLB,不如给每个 TLB 项打上地址空间标识符(ASID),让多个进程的转换结果可以同时共存在 TLB 中,减少切换开销。


缺页处理与可重启异常

当被引用的页不在 DRAM 中时,操作系统需要定位/创建该页,从磁盘调入,并更新页表;如果架构上下文可以被保存/恢复,这段时间里可以运行其他任务;如果没有空闲页帧,需要用(软件实现的)伪 LRU 策略换出一页;操作系统也可能在后台维护一个空闲页池。由于搬运一页耗时通常是毫秒级,缺页完全由操作系统软件处理。这要求异常必须是可重启的(restartable)——可以是"不精确但可重启"(增加操作系统软件复杂度),也可以是"精确的"(更容易重启,这正是第 4 课"精确异常"概念在虚拟内存场景下的直接应用)。


虚拟地址缓存:两种组织方式的权衡

缓存和 TLB 可以有两种先后顺序:先转换再访问缓存(CPU → TLB → 物理缓存 → 主存),或者先访问缓存、缺失才转换(CPU → 虚拟缓存 → TLB → 主存,真实例子:StrongARM)。第二种方式命中时只需一步,速度更快,但代价是:进程切换时通常需要清空整个缓存(除非缓存标签里也包含 ASID);会产生别名(aliasing)问题;还需要额外处理缓存一致性维护。

别名问题(aliasing):如果两个不同的虚拟地址 VA1、VA2 都映射到同一个物理页 PA(例如共享内存),一个用虚拟地址索引+打标签的缓存就可能同时持有该物理数据的两份独立副本——通过 VA1 写入的更新,VA2 的副本却看不到。通用解决思路是"防止别名同时共存于缓存中";一种具体技术是强制要求同一物理页的所有虚拟地址在缓存索引位上必须一致(早期 SPARC 采用),这样任何映射到同一 PA 的两个 VA 一旦冲突就会互相"顶替"而不是共存。


虚拟索引/物理标签缓存:让 TLB 和缓存并行工作

关键观察:缓存的索引位取自地址中未经翻译的页内偏移低位,因此在 TLB 完成翻译之前就可以先用它去访问缓存阵列;物理标签的比较则要等 TLB 给出 PPN 之后才能进行——这样缓存查找和 TLB 查找可以并行展开。约束条件:这只有在"索引位 + 块内偏移位 ≤ 页内偏移位"时才成立,直接映射设计下相当于"缓存容量不能超过页大小"。用相联度可以突破这个限制:额外增加若干"a"位在页偏移之外,并行查找 2^a 路,PPN 出来后再并行比较 2^a 个物理标签。例:4KB 页大小 × 8 路(2^3)相联 = 32KB 缓存(重新验算:4×8=32,与幻灯片一致)。


用二级缓存反制别名(MIPS R10000, 1996)

如果 VA1 已经驻留在 L1 和 L2 中,之后 VA2(映射到同一物理地址)在 L1 缺失、走到 L2 时,可以通过 L2 中存储的额外索引/标签字段检测到这是同一个 PA 上的碰撞:把 VA1 对应的行同时从 L1 和 L2 中清除,改为装载 VA2 的行——从而消除别名。同样的思路可以推广到虚拟索引+虚拟标签的 L1(不只是虚拟索引物理标签),此时 L2 除了物理地址,还需要额外存储一个"虚拟标签"字段(比纯物理标签更大)来做反向别名检查。


常见误区


知识检查

问题 1:虚拟地址缓存中的"别名(aliasing)"问题具体指什么?

问题 2:为什么"虚拟索引/物理标签(VIPT)"缓存能让缓存查找和 TLB 查找并行进行?

问题 3:一个直接映射的虚拟索引/物理标签缓存,容量被限制在不超过页大小;如果改用 8 路(2^3)相联、页大小仍是 4KB,缓存容量最大可以做到多少?


本课要点

标记 TLB / ASID

用地址空间标识符避免每次进程切换都清空整个 TLB

缺页是可重启异常

与第 4 课"精确异常"概念直接呼应

别名问题

虚拟地址缓存的核心正确性隐患,多种技术可以规避

VIPT + 相联度

让缓存查找与 TLB 查找并行,同时突破"容量≤页大小"的限制


参考资料与延伸阅读