2012-04-22 52 views
2

基本上,我需要使用页面来识别进程或任务,并相应地做出关于是否允许页面被换出的一些决定。由于内核AFAIK中的交换模块主要处理结构页面,所以我想知道是否存在我缺少的某些现有技巧。从在include/linux/mm_types.h(V> = 2.6),这样的评论:如何从struct页面访问struct vm_area_struct页面

  • 系统中的每个物理页已经与
  • 相关的结构页面,随时记录无论它是我们使用页面为
  • 时刻。请注意,我们无法跟踪哪些任务正在使用
  • 页面,但如果它是页面缓存页面,则rmap结构可以告诉我们
  • 谁在映射它。

表明,我们可以通过一些物理到虚拟反向映射做到这一点,但我不能从RMAP功能弄清楚(毫米/ rmap.c)如何实现我所期待的。

在此先感谢您的帮助,非常感谢。

回答

1

要回答你的实际问题“如何从结构页面结构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,并从那里你走在i_mmap这是一个struct prio_tree_root。见page_referenced_file()

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

0

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

这是原型:

// [ 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); 
+0

这是一个很好的文章vma's:https://lwn.net/Articles/383162/ – 2016-04-02 04:21:11