文件页:dirty、write、stale TLB 等等

August 26th, 2026 Administrator No comments

本文主要介绍脏页在内存回收、读写操作并发这些内存活动中,是如何保证一致性的。尤其是是回收过程,对于有页表映射的文件页面,涉及到刷 tlb 相关的,这些地方尤为谨慎。


对于具有写权限、被修改为脏页(Dirty)、且需要写回磁盘的共享文件映射页面(MAP_SHARED + PROT_WRITE),结合内核源码(vmscan.c 和 rmap.c),整个回收与写回生命周期以及在各时间节点通过 stale TLB 访问 的行为分析如下:

回收过程

一般情况下,是不会回收脏页的,尤其是对于普通文件页。而那些后备是 zram 的匿名脏页,回收的概率倒是比较大。他们在处理上基本相似。

我们这里列举最坏的情况下,比如 kswapd 即回收文件脏页,也回收匿名脏页。

[用户态修改页面] -> PTE 变 Dirty, CPU 缓存 Writable TLB
       │
       ▼
[回收开始: shrink_folio_list()]
       │
       ▼
[1. try_to_unmap()] ──────► 清除 PTE (PTE 变无效),但延迟刷新 TLB (未发 IPI)...