2024.03.10 修改:
在page结构体中,有_mapcount和_refcount两个成员。_refcount是页面拥有的引用总数,而_mapcount是引用页面的页表数。页表映射也是一个引用, 因此_mapcount中的计数也是_refcount的子集,即_refcount应该大于或等于_mapcount。
_refcount可以超过_mapcount的情况包括:
DMA 映射的页面和使用get_user_pages()之类的函数映射到内核地址空间的页面
使用mlock()将页面锁定到内存中 也会增加_refcount
---------------------------------------------- 分割线 ----------------------------------------------------------
2024.02.24 原文(自己的理解):
refcount: 引用计数,表示当前这个page被使用的频率,与lru页面回收算法有关,不常使用的页放在队尾,优先回收。
mapcount: 映射计数,他管理的是物理地址到虚拟地址的映射关系,映射了多少个用户PTE,而在同一个进程中虚拟地址到物理地址的映射关系是唯一的一对,因此mapcount想说明的是 有多少个进程映射了这个物理页。比如在fork时,没有触发写操作之前,父子进程共享同一片虚拟地址空间,父子进程的页表PTE是一模一样的,指向同一片物理内存页。