Linux页面缓存 - 从内核中的页面缓存中删除页面

Sin*_*ngh 24 linux linux-kernel page-caching

我的问题是这个的扩展如何操纵Linux中的页面缓存?

我试图做一个小项目,旨在限制每个文件使用的页面缓存的大小.我使用的方法如下 -

  1. 页面指​​针的kfifo队列在添加到页面缓存时保持不变.
  2. add_to_page_cache_lru()中添加一个钩子,看看文件的基数树(address_space)的大小是否大于预定大小,然后从fifo队列中选择一个受害者并从页面缓存中删除该页面.
  3. 我使用函数delete_from_page_cache()try_to_unmap()来从页面缓存中逐出页面,然后使用put_page()来释放页面.

我希望这段代码可以释放页面并释放内存,但这似乎不会发生.例如,如果我读取一个大小为25MB的文件并且我将此文件的页面缓存大小限制为512页(2MB),那么我希望在可用内存中看到只有2MB的更改(free -m ).我所看到的是完整的25MB被吃掉并显示在free命令中.

我还应该做些什么来确保满足我的要求?我还没有考虑过脏页面,因为我甚至无法让它读取(cat the file).任何指针都会有所帮助.

PS - 我正在使用linux 4.0进行这个项目.

Vla*_*lad 1

您可能需要做的不仅仅是delete_from_page_cache() + try_to_unmap() + put_page() ...

查看Shrink_page_list() 的行为方式,包括对page_check_references()的检查:

更多信息请参见: 如何从映射它的所有 PTE 中取消映射 struct page