如何从结构页面结构vm_area_struct

基本上,我需要使用页面来识别进程或任务,并据此做出是否允许页面被换出的一些决定。 因为内核AFAIK中的交换模块主要处理结构页面 ,我想知道是否有一些现有的技巧,我缺less。 从include / linux / mm_types.h(v> = 2.6),下面的注释:

  • 系统中的每个物理页面都有一个与之关联的结构页面
  • 它跟踪我们正在使用的网页是什么
  • 时刻。 请注意,我们无法跟踪哪些任务正在使用
  • 一个页面,但如果它是一个页面caching页面,rmap结构可以告诉我们
  • 谁在映射它。

build议我们可以通过一些物理到虚拟的反向映射来做到这一点,但我无法从rmap函数(在mm / rmap.c中)找出如何实现我正在寻找的function。

预先感谢任何帮助,非常感谢。

要回答你的实际问题“如何从结构页面结构vm_area_struct”,至少有两个答案。

对于匿名页面,您可以使用page_anon_vma() ,它返回anon_vma – 它存储在page->mapping并使用特殊标志来表示它不是struct address_space (为了节省空间)。

anon_vma你可以走anon_vma_chain ,每个入口指向一个vma 。 从vma你可以得到mm ,然后是一个任务。

有关示例,请参阅page_referenced_anon()

对于一个文件页面,你看看page->mapping ,它是一个struct address_space ,然后从那里走过一个struct prio_tree_root 。 请参阅page_referenced_file()

我不确定这实际上会帮助你实现你的想法,但是你去了。

像这样的东西可能是你想要的。

这是原型:

 // [ http://lxr.free-electrons.com/source/include/linux/rmap.h#L27 ] 149 struct anon_vma *page_get_anon_vma(struct page *page); 

这是你如何使用它:// [ http://lxr.free-electrons.com/source/mm/ksm.c#L1898 ] // […]

  anon_vma = page_get_anon_vma(page); 1902 anon_vma_lock_read(anon_vma); 1903 anon_vma_interval_tree_foreach(vmac, &anon_vma->rb_root, 1904 0, ULONG_MAX) { 1906 vma = vmac->vma; 1907 if (page_address < vma->vm_start || 1908 page_address >= vma->vm_end) 1909 continue; [...] } anon_vma_unlock_read(anon_vma);