文件页:dirty、write、stale TLB 等等
August 26th, 2026
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)...