page mapcount
page->_mapcount
在不同情况的变化:
start_kernel()
会调用__init_single_page()
初始化所有 page 结构体
page->_mapcount
设置为 -1
fork
调用 fork()
后,会调用 dup_mm() -> dup_mmap() ->
将所有匿名页与文件页 copy一份(无论私有还是共享),即进程的所有 page->_mapcount++
(此时两个进程完全一样)
mmap
调用 mmap()
后,接着出现 page fault,
当私有匿名页,调用 page_add_new_anon_rmap()
将 page->_mapcount
设置为 0, 代表目前只有一个页表 map 此 page(page->_mapcount
从 -1 开始)
当私有/共享文件页 或 共享匿名页 或 swap 页(此三者都可以叫 backend file),调用 page_add_anon_rmap()
或 page_add_file_rmap()
将 page->_mapcount++
munmap
调用 munmap()
后,调用 page_remove_rmap()
将 unmap addr 对应的 page->_mapcount--
page_mapcount()
获得 mapcount 个数(即page->_map_count
+ 1)
Last updated
Was this helpful?