Linux 2.4.18换入交换区页面时原子计数增加位置问询
Linux 2.4.18 交换页多进程映射时的原子计数逻辑
核心结论
不存在版本bug,你所寻找的“每个页表映射单独计数”的逻辑,并非通过显式调用get_page(p)实现,而是隐藏在page_add_rmap函数的内部调用中。
具体代码执行流程
物理页换出阶段
在page_launder_zone触发页换出时:
add_to_swap为物理页分配交换槽,交换槽的引用计数被设为3(对应3个进程的初始映射);try_to_unmap解除所有PTE映射,物理页写入交换区后,其原子计数仅保留页缓存的持有引用。
第一个进程主缺页处理
do_swap_page检测到swap缓存无对应页,调用read_swap_cache_async分配物理页,此时页的原子计数初始化为1;add_to_swap_cache调用get_page,将原子计数提升至2(对应页缓存的引用);- 更新PTE指向物理页后,调用
page_add_rmap——该函数在mm/memory.c中实现,内部执行atomic_inc(&page->count),为第一个进程的页表映射增加计数,此时原子计数变为3。
后两个进程次缺页处理
当后两个进程触发次缺页时:
lookup_swap_cache直接定位到swap缓存中的物理页;- 执行
swap_free减少交换槽的引用计数; - 更新PTE指向物理页后,同样调用
page_add_rmap,每次调用都会执行atomic_inc(&page->count),分别将原子计数提升至4、5。
计数差异的说明
你预期的“原子计数应为3”是混淆了交换槽引用计数和物理页原子计数:
- 交换槽的引用计数会随着每个进程的
swap_free调用逐步递减,最终变为0; - 物理页的原子计数包含页缓存的引用(1) + 3个进程的页表映射引用(3),再加上
add_to_swap_cache额外增加的1次引用,最终为5,这是Linux 2.4.18中页引用计数的正常逻辑。
内容的提问来源于stack exchange,提问作者Ilya.K.
相关产品推荐
相关产品推荐

