繁体   English   中英

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

[英]How to get process's virtual address in Linux kernel

目前,我正在尝试弄清楚如何在 Linux kernel 中获取特定进程的虚拟地址(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的基地址吗?

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM