C 虚拟区域到页面

C 虚拟区域到页面,c,linux,memory-management,linux-kernel,kernel,C,Linux,Memory Management,Linux Kernel,Kernel,在Linux内核中,给定task\u struct的mm我可以访问进程的vm\u area\u structs列表。考虑到这些vm\u area_structs,如何获得实际对应于此vma的struct页面 我试着在mm/memory.c之类的文件中寻找函数,但我不知所措 编辑:其目的是找出vma中哪些页面当前在内存中,哪些不在内存中。但是我不希望有人告诉我如何做这一点,因为这是我需要自己解决的家庭作业的一小部分。但我似乎不知道如何找到与此vma对应的页面。如果我能找到这些页面,我想我可以检查它

在Linux内核中,给定
task\u struct
mm
我可以访问进程的
vm\u area\u struct
s列表。考虑到这些
vm\u area_struct
s,如何获得实际对应于此vma的
struct页面

我试着在mm/memory.c之类的文件中寻找函数,但我不知所措


编辑:其目的是找出vma中哪些页面当前在内存中,哪些不在内存中。但是我不希望有人告诉我如何做这一点,因为这是我需要自己解决的家庭作业的一小部分。但我似乎不知道如何找到与此vma对应的页面。如果我能找到这些页面,我想我可以检查它们是否有有效的pfn。

从您对另一个答案的评论(编辑:另一个答案似乎已被删除),您似乎想从用户空间阅读。获取用户空间页面的功能可能是,但这可能不是您想要的;您可能想要
从用户复制到用户
/
复制到用户

我手头上没有直接的答案,但使用lxr.linux浏览结构不会花费您太长时间。否

鉴于您已经拥有了要从中开始的结构,请从中查看。您可以查找定义,查看在何处使用单个结构,等等。。。如果您已经知道要查找的最终结构名称,则可以反向导航,直到到达mm


请注意,如果您的网络连接不太好,您可能希望通过获取发行版的lxr包并在本地生成索引来安装索引源的本地副本。过去在400mhz/128mb的机器上需要2个小时,现在应该快得多。

我相信get_user_pages()在发现物理内存中不存在页面时会生成页面错误。但我认为follow_page()可能会奏效。让我检查一下。毕竟,你不必担心页面是否存在。你到底想做什么?是的,我以前也错了。vm区域在那里,但页面并不总是在那里:)我只想知道vma中的哪些页面存在,哪些不存在。在这种情况下,我可以在vma中从vm_开始循环到vm_结束,按页面大小递增,并在每个地址上执行follow_页面吗?如果follow_page为NULL,则该页不存在,否则是否存在?