如何解决如何在Linux内核中获取进程的虚拟地址
目前,我正在尝试弄清楚如何在 Linux 内核中获取特定进程的虚拟地址 (VA),因为有几个函数将 VA 作为与不同页面目录相关的参数,包括 pgd_offset(),pgd_index(),p4d_offset(),p4d_index()...
-
谁能解释一下这些函数的作用,包括xxx_offset(),xxx_index()?(xxx:pgd,p4d,pmd...) 以及如何使用这些函数?
-
VA作为上述函数的参数是什么意思,是进程的虚拟地址?以及如何获得特定流程的 VA?我已经知道我们可以使用进程的task_struct->mm->mmap来获取虚拟地址空间的范围,但不知道如何获取特定的虚拟地址。
-
task_struct->mm->pgd_t是不是表示PGD_directory的基地址?
解决方法
你的问题真的没有意义。您不会“获得进程的虚拟地址”。进程有一个虚拟地址空间,用作数据、代码、堆栈、堆等的虚拟内存映射。
-
这些函数在进程虚拟地址空间中获取单个虚拟地址,并帮助遍历页表以找到其页表条目,然后找到其物理地址(或检查页表条目标志)。在 Linux 中,要经过 4 个页表级别才能到达页表条目。通常级别是pgd(页表目录)、pud(页上层目录)、pmd(页中目录)和pte(页表条目)。但我认为最近 p4d 被添加为额外的页表级别。通常,页目录(顶层页表)的地址存储在 CR3 寄存器中。因此,您使用该地址访问目录,然后使用 pgd_index 和 pgd_offset 查找您需要查看的下一个级别 (p4d) 的地址,并重复直到您找到 pte。一个有用的文件是
mm/page_walk.c
文件。 -
进程在其运行时访问内存,通常该内存由虚拟地址引用。当它访问不在 TLB 中的地址时,必须按上述方式遍历该地址以找出其位置和权限标志。没有“获取进程的 VA”,但是当您的程序使用 mmap 或 malloc 并且您获取变量的地址时,这些地址通常是虚拟地址。您可以查看
/proc/proc_number/maps
以查看具有 PIDproc_number
的进程的虚拟地址布局。请注意,打开地址空间布局随机化后,每次运行相同程序时,此映射都会有所不同。 -
我不确定,但您可能可以通过将该变量与我在上面链接的 page_walk.c 文件中使用的 pgd 地址进行比较来测试它。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。