我追踪了Linux源代码,并找到了这个函数:void put_page(struct page *page)
我在谷歌上搜索了一下,有些人说这个函数用来构建从物理帧地址到虚拟地址的映射。
但是我在mm/swap.c
中追踪put_page
函数。代码行为似乎不是用于将物理地址映射到虚拟地址。
有人知道这个函数是干什么的吗?
我追踪了Linux源代码,并找到了这个函数:void put_page(struct page *page)
我在谷歌上搜索了一下,有些人说这个函数用来构建从物理帧地址到虚拟地址的映射。
但是我在mm/swap.c
中追踪put_page
函数。代码行为似乎不是用于将物理地址映射到虚拟地址。
有人知道这个函数是干什么的吗?
put_
的函数通常意味着“释放”或“释放”某些内容。(因为“put”是“get”的相反。)从对代码的简要查看中,似乎该函数被调用以释放一个struct page
。put_pages_list
实际上有文档说明:/**
* put_pages_list() - release a list of pages
* @pages: list of pages threaded on page->lru
*
* Release a list of pages which are strung together on page.lru. Currently
* used by read_cache_pages() and related error recovery code.
*/
put_page
“释放”单个struct page
。"put_page"会将页面复制到超脱内存,并将其与页面相关的类型和偏移关联起来。
"get_page"会将页面(如果找到)从超脱内存复制到内核内存,但不会从超脱内存中删除该页面。
有关详细信息,请参见Linux内核文档:frontswap.txt。
我刚刚发现了这个,它看起来非常简洁且有用:
这些函数有两个阶段:
- 从LRU缓存中删除页面(__page_cache_release)
- 将页面释放给内存分配器
考虑分配过程:
- 分配页面
- 固定页面表项
- 将页面添加到LRU缓存中。
在
put_page
函数中,没有处理页面表项。因此,在调用这些函数之前,控制路径应该修复/删除适当的页面表项。