虚拟区域到页面的映射

3
在Linux内核中,给定task_structmm,我可以访问进程vm_area_struct列表。那么,如何获取实际对应于此vma的struct page?我尝试在mm/memory.c等文件中查找函数,但是我感到很困惑。
编辑:查找vma中当前在内存中的页面和不在内存中的页面。但是,我不想有人告诉我如何做这一部分,因为这只是作业任务的一小部分,我需要自己解决。但是我似乎无法找到与此vma相对应的页面。如果我能找到这些页面,我想我可以检查它们是否具有有效的pfn。
2个回答

1
从您对另一个答案的评论中(编辑:另一个答案似乎已被删除),看起来您想从用户空间读取。获取用户空间页面的函数将是{{link1:get_user_pages()}},但那很可能不是您想要的;您可能想要copy_from_user/copy_to_user

我相信get_user_pages()在发现物理内存中不存在某一页时会生成一个页面错误。但我认为follow_page()可能会解决问题。让我检查一下。 - FreeMemory
它应该这样做,毕竟你不应该担心页面是否存在。你想要做什么? - CesarB
是的,我之前也犯了这个错误。虚拟内存区域存在,但页面并不总是存在 :) - Johannes Schaub - litb
1
我只想知道vma中存在哪些页面,哪些不存在。在这种情况下,我能否从vma的vm_start循环到vm_end,每次按PAGE_SIZE递增,并对每个地址执行follow_page?如果follow_page为NULL,则该页面不存在,否则存在。 - FreeMemory

0

我手头没有直接的答案,但是你可以使用 lxr.linux.no 来浏览结构体,这不会花费你太多时间。

假设你已经有了要开始查找的结构体,请从 http://lxr.linux.no/linux+v2.6.29/+code=vm_area_struct 开始查找。你可以查找定义,查看单个结构体的使用情况等等... 如果你已经知道你要查找的最终结构体名称,你可以反向查找并向上导航,直到达到 mm。

请注意,如果你的网络连接不太好,你可能需要安装本地副本的索引源,方法是获取你的发行版的 lxr 包并在本地生成索引。在 400mhz / 128mb 的机器上,以前需要 2 小时,现在应该快得多得多。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接