如何从struct页面访问struct vm_area_struct页面
问题描述:
基本上,我需要使用页面来识别进程或任务,并相应地做出关于是否允许页面被换出的一些决定。由于内核AFAIK中的交换模块主要处理结构页面,所以我想知道是否存在我缺少的某些现有技巧。从在include/linux/mm_types.h(V> = 2.6),这样的评论:如何从struct页面访问struct vm_area_struct页面
- 系统中的每个物理页已经与
- 相关的结构页面,随时记录无论它是我们使用页面为
- 时刻。请注意,我们无法跟踪哪些任务正在使用
- 页面,但如果它是页面缓存页面,则rmap结构可以告诉我们
- 谁在映射它。
表明,我们可以通过一些物理到虚拟反向映射做到这一点,但我不能从RMAP功能弄清楚(毫米/ rmap.c)如何实现我所期待的。
在此先感谢您的帮助,非常感谢。
答
要回答你的实际问题“如何从结构页面结构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()
。
我不确定这实际上是否会帮助你实现你的想法,但你去了。
答
像这样的东西可能是你想要的。
这是原型:
// [ 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);
这是一个很好的文章vma's:https://lwn.net/Articles/383162/ – 2016-04-02 04:21:11