3

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

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

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

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

4

2 回答 2

2

要回答您的实际问题“如何从 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->mappingwhich 是 a struct address_space,然后从那里走到i_mmapwhich 是 a struct prio_tree_root。见page_referenced_file()

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

于 2012-04-22T11:28:27.933 回答
1

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

这是原型:

// [ 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);
于 2016-04-02T04:20:14.363 回答