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