如何从struct页面获取struct vm_area_struct

时间:2012-04-22 04:19:28

标签: linux linux-kernel kernel

基本上,我需要使用页面来识别进程或任务,并相应地做出关于是否允许页面换出的决定。因为内核AFAIK中的交换模块主要处理 struct page ,所以我想知道是否存在一些我遗漏的现有技巧。从include / linux / mm_types.h(v> = 2.6),以下注释:

  • 系统中的每个物理页面都有一个与
  • 相关联的结构页面
  • 用于跟踪我们在
  • 中使用该页面的内容
  • 时刻。请注意,我们无法跟踪正在使用的任务
  • 一个页面,但如果它是一个pagecache页面,rmap结构可以告诉我们
  • 谁正在映射它。

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

提前感谢您的帮助,非常感谢。

2 个答案:

答案 0 :(得分:1)

要回答您的实际问题“如何从struct page获取struct 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()

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

答案 1 :(得分: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);