Linux 如何从struct页面访问struct vm\u area\u struct

Linux 如何从struct页面访问struct vm\u area\u struct,linux,linux-kernel,kernel,Linux,Linux Kernel,Kernel,基本上,我需要使用页面识别流程或任务,并相应地做出一些决定,决定是否允许交换页面。因为内核AFAIK中的交换模块主要处理结构页面,所以我想知道是否有一些现有的技巧我遗漏了。在include/linux/mm_types.h(v>=2.6)中,有以下注释: 系统中的每个物理页都有一个与 它可以跟踪我们在网站上使用该页面的目的 片刻。请注意,我们无法跟踪正在使用的任务 一个页面,如果它是一个页面缓存页面,rmap结构可以告诉我们 谁在绘制地图 建议我们可以通过一些物理到虚拟的反向映射来实现这一点

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

  • 系统中的每个物理页都有一个与
  • 它可以跟踪我们在网站上使用该页面的目的
  • 片刻。请注意,我们无法跟踪正在使用的任务
  • 一个页面,如果它是一个页面缓存页面,rmap结构可以告诉我们
  • 谁在绘制地图
建议我们可以通过一些物理到虚拟的反向映射来实现这一点,但我无法从rmap函数(在mm/rmap.c中)中找出如何实现我想要的


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

要回答您的实际问题“如何从struct页面访问struct vm\u area\u struct”,至少有两个答案

对于匿名页面,您可以使用
page_anon_vma()
,它返回一个
anon_vma
——它存储在
page->mapping
中,并设置了一个特殊标志,指示它不是
结构地址空间(以节省空间)

anon_-vma
中,您可以遍历
anon_-vma链
,并将每个入口点移动到
vma
。从
vma
可以获得
mm
,然后获得a任务

有关示例,请参见
page\u referenced\u anon()

对于文件页面,您可以查看
页面->映射
,它是一个
结构地址空间
,然后从那里走到
i_mmap
,它是一个
结构优先树根
。请参阅
第页\u引用的\u文件()


我不确定这是否真的能帮助你实现你的想法,但你就这样做了。

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

这是原型:

// [ http://lxr.free-electrons.com/source/include/linux/rmap.h#L27 ]
149 struct anon_vma *page_get_anon_vma(struct page *page);
您可以这样使用它: // [ ] //[……]

        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);
anon_vma=page_get_anon_vma(第页);
1902年非正常vma锁定读取(非正常vma);
1903 anon_vma_interval_tree_foreach(vmac和anon_vma->rb_根,
1904年0月,乌隆(最大){
1906 vma=vmac->vma;
1907如果(第页地址vm\U开始||
1908页\u地址>=vma->vm\u结束)
1909年继续;
[...]   }
非正常vma非正常解锁读取(非正常vma);