Skip to content

方法Method

TLB与地址翻译失效

Translation lookaside buffer · TLB miss · TLB invalidation

将翻译缓存键、权限和映射生命周期一起核对,区别TLB未命中与缺页,构造改PTE后仍越权的最短反例。

形式陈述 ​

TLB缓存页表转换的结果,而非用户数据字节。OS-16的条目为(ASID, VPN) -> (PFN,U,R,W,X);ASID表示当前地址空间身份。命中时也要检查缓存权限,成功才拼接页内偏移;未命中时硬件遍历页表,成功结果可填入TLB。

TLB miss不等于page fault。 miss只是缓存里无可用翻译;页表遍历仍可能找到完全合法的驻留页。page fault则是当前翻译或访问权限不能满足请求、需要转入内核处理的事件。反过来,TLB中缓存着W=0的条目,写命中也会产生权限故障,不必先发生miss。

本页选择单核、带ASID、最多四条的教学TLB,不缓存失败结果。替换策略仅影响哪个翻译被丢弃,不能改变权限判断。对某地址空间的映射撤销、PFN改变或权限收紧,OS-16要求先阻止该空间继续执行相关访问,更新PTE,执行指定的失效动作并等待生效,再允许其继续;ASID复用前须清除该旧身份全部翻译。

直觉

修改电话簿不会自动擦掉别人记在便条上的旧号码。PTE是权威映射,TLB是可快速使用的副本;如果副本仍带着旧写权限,硬件不会每次命中都重新检查内存中的PTE来发现变化。

ASID把进程切换和每次全清TLB分开:不同地址空间可以暂存相同VPN的翻译。但标签只有在身份不混淆时有用;把已经退出的身份编号立即交给新人而不清旧项,会重现相同漏洞。

例子与边界

六次访问中的三种不同结果 ​

初始TLB空。P的0x12映射PFN0x30、可读写,Q的同VPN映射0x50;P的0x13是合法但未驻留区域,P的0x10是驻留只读代码。

请求 TLB观察 后续
P读0x12AB miss 查表成功,填入(P,0x12),读0x30AB
P读0x12AC hit 直接读0x30AC,无页表遍历
Q读0x12AB miss 不能借P的条目;查Q表得到0x50AB
P读0x1305 miss PTE不驻留,产生可修复缺页
P读0x1000 miss 只读代码翻译合法,填入(P,0x10)
P写0x1000 hit且W=0 产生权限故障,不写数据

第五行明确建立最后一行使用的只读翻译。修复0x13后再次执行原指令,才得到新的成功翻译;缺页不是“返回一个特殊数据值给load”。

fork时只改PTE的错误 ​

P原有VPN0x12 -> PFN0x30,W=1的TLB项。fork让子C共享此页,并把父子PTE都设W=0、COW=1。如果忘记失效P的旧TLB,P随后写0x12AB仍按缓存W=1直接修改PFN0x30,C看到自己的私有快照被改变,连写故障都不会发生。

正确OS-16步骤在C可运行之前完成父PTE降权与父相关条目的失效;C使用新ASID且TLB空。只失效子项或等未来自然逐出都不足以保证私有写语义。COW处理在写者换到新页框后,也要去掉该写者指向旧页框的翻译。

推论与应用

当一次TLB查找成本为t、单次内存访问m、页表L层,且完全串行、无其他缓存命中时,命中成本t+m,成功miss成本t+(L+1)m。以命中率h求平均得t+m+(1−h)Lm。这只计没有缺页的访问;把磁盘换入成本隐在同一个m里会误导性能判断。

多核把义务扩成shootdown:其他CPU也可能缓存这份映射。撤销或回收页框前要让所有相关CPU停止使用旧翻译并确认完成;否则旧地址可在页框已分配给别人后写入别人数据。CPU数据缓存的一致性并不自动完成TLB协议,两者缓存对象和失效规则不同。

失效还可能因ISA要求而涉及页表写的排序。本文的“完成失效”是OS-16原语;真实RISC-V须按特权规范选择SFENCE.VMA及跨hart通知,真实Linux则通过架构相关TLB接口落实,不能把一条C赋值当成完整屏障。

参考资料
关系图谱4 个相邻概念 · 1 类关系

拖动节点调整位置。

显示关系

显示:依赖

  1. 前置三跳
  2. 前置二跳
  3. 前置一跳
  4. 当前条目
  5. 后续一跳
  6. 后续二跳
  7. 后续三跳
文字版关系按与当前条目的最短距离分组