基本上,我需要使用页面来识别进程或任务,并相应地做出关于是否允许页面换出的决定。因为内核AFAIK中的交换模块主要处理 struct page ,所以我想知道是否存在一些我遗漏的现有技巧。从include / linux / mm_types.h(v> = 2.6),以下注释:
建议我们可以通过一些物理到虚拟的反向映射来做到这一点,但我无法从rmap函数(在mm / rmap.c中)中找出如何实现我正在寻找的东西。
提前感谢您的帮助,非常感谢。
答案 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);