微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在Linux内核中获取进程的虚拟地址

如何解决如何在Linux内核中获取进程的虚拟地址

目前,我正在尝试弄清楚如何在 Linux 内核中获取特定进程的虚拟地址 (VA),因为有几个函数将 VA 作为与不同页面目录相关的参数,包括 pgd_offset(),pgd_index(),p4d_offset(),p4d_index()...

  1. 谁能解释一下这些函数的作用,包括xxx_offset(),xxx_index()?(xxx:pgd,p4d,pmd...) 以及如何使用这些函数

  2. VA作为上述函数的参数是什么意思,是进程的虚拟地址?以及如何获得特定流程的 VA?我已经知道我们可以使用进程的task_struct->mm->mmap来获取虚拟地址空间的范围,但不知道如何获取特定的虚拟地址。

  3. task_struct->mm->pgd_t是不是表示PGD_directory的基地址?

解决方法

你的问题真的没有意义。您不会“获得进程的虚拟地址”。进程有一个虚拟地址空间,用作数据、代码、堆栈、堆等的虚拟内存映射。

  1. 这些函数在进程虚拟地址空间中获取单个虚拟地址,并帮助遍历页表以找到其页表条目,然后找到其物理地址(或检查页表条目标志)。在 Linux 中,要经过 4 个页表级别才能到达页表条目。通常级别是pgd(页表目录)、pud(页上层目录)、pmd(页中目录)和pte(页表条目)。但我认为最近 p4d 被添加为额外的页表级别。通常,页目录(顶层页表)的地址存储在 CR3 寄存器中。因此,您使用该地址访问目录,然后使用 pgd_index 和 pgd_offset 查找您需要查看的下一个级别 (p4d) 的地址,并重复直到您找到 pte。一个有用的文件是 mm/page_walk.c 文件。

  2. 进程在其运行时访问内存,通常该内存由虚拟地址引用。当它访问不在 TLB 中的地址时,必须按上述方式遍历该地址以找出其位置和权限标志。没有“获取进程的 VA”,但是当您的程序使用 mmap 或 malloc 并且您获取变量的地址时,这些地址通常是虚拟地址。您可以查看 /proc/proc_number/maps 以查看具有 PID proc_number 的进程的虚拟地址布局。请注意,打开地址空间布局随机化后,每次运行相同程序时,此映射都会有所不同。

  3. 我不确定,但您可能可以通过将该变量与我在上面链接的 page_walk.c 文件中使用的 pgd 地址进行比较来测试它。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。