“fork先为子页表准备足够元数据,再对每个已映射页增加引用。原私有可写页的父子项都改,在子进程变为可运行之前完成父相关TLB失效。尚未驻留的合法区域复制区域记录,不凭空增加数据页引用。”
形式陈述
TLB缓存页表转换理路页表地址转换与访问权限Page table address translation · VPN PFN offset · 虚实地址转换由虚页号、页内偏移与PTE计算物理地址,分别检查驻留、访问类型和用户权限,并建立可检查的隔离不变量。的结果,而非用户数据字节。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处理理路fork的写时复制与页生命周期Copy-on-write fork · COW fork · 写时复制进程创建在父子私有内存语义下追踪PTE降权、引用计数、写故障复制、独占快路和退出释放,并核验分配失败不破坏旧状态。在写者换到新页框后,也要去掉该写者指向旧页框的翻译。
推论与应用
当一次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赋值当成完整屏障。
参考资料
- Remzi与Andrea Arpaci-Dusseau,OSTEP: Paging—Faster Translations,第19章,TLB miss、地址空间标签与进程切换。
- Linux Kernel Documentation,Cache and TLB Flushing Under Linux,2026-10-08核查;架构接口的失效范围和完成语义。OS-16的四条容量与事件顺序为教学选择。