【问题标题】:Virtual area to pages虚拟区域到页面
【发布时间】:2008-11-18 18:45:57
【问题描述】:

在Linux内核中,给定task_structmm,我可以访问进程的vm_area_structs列表。鉴于这些vm_area_structs,我如何获得实际上对应于这个 vma 的struct pages?

我尝试在 mm/memory.c 等中寻找函数,但不知所措。

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

【问题讨论】:

    标签: c linux memory-management linux-kernel kernel


    【解决方案1】:

    从您的评论到另一个答案(编辑:另一个答案似乎已被删除),您似乎想从用户空间读取。获取用户空间页面的函数是get_user_pages(),但这很可能不是你想要的;你可能想要copy_from_user/copy_to_user

    【讨论】:

    • 我相信 get_user_pages() 会在发现物理内存中不存在的页面时产生页面错误。但我认为 follow_page() 可能会成功。让我检查一下。
    • 应该是这样,毕竟你不应该担心页面是否存在。你到底想做什么?
    • 是的,这也是我之前的错误。虚拟机区域在那里,但页面并不总是在那里:)
    • 我只想知道 vma 中哪些页面存在,哪些不存在。在这种情况下,我可以在 vma 中从 vm_start 循环到 vm_end,按 PAGE_SIZE 递增并在每个地址上执行 follow_page 吗?如果 follow_page 为 NULL,则页面不存在,否则存在?
    【解决方案2】:

    我没有直接的答案,但是使用 lxr.linux.no 浏览这些结构不会花很长时间

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

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

    【讨论】:

      猜你喜欢
      • 2017-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-18
      • 2022-06-13
      • 2013-12-01
      • 2013-02-08
      • 1970-01-01
      相关资源
      最近更新 更多