如何在 Linux 内核中获取进程的虚拟地址
How to get process's virtual address in Linux kernel
目前,我正在尝试弄清楚如何在 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来获取虚拟地址的范围space,但不知道如何获取具体的虚拟地址。
task_struct->mm->pgd_t是不是表示PGD_directory的基地址?
你的问题没有道理。您不会“获得进程的虚拟地址”。一个进程有一个虚拟地址space,作为数据、代码、堆栈、堆等的虚拟内存映射
这些函数在进程虚拟地址 space 中获取单个虚拟地址,并帮助遍历页面 table 以找到它的页面 table条目,然后是它的物理地址(或检查页面 table 条目标志)。在 Linux 中,有 4 个页面 table 级别可以到达页面 table 条目。通常级别是 pgd(page table 目录)、pud(page 上层目录)、pmd(page mid 目录)和 pte(page table 条目)。但我认为最近 p4d 被添加为额外的页面 table 级别。通常,页面目录(顶级页面table)的地址存储在CR3寄存器中。因此,您使用该地址访问目录,然后使用 pgd_index 和 pgd_offset 找到您需要查看的下一级 (p4d) 的地址,并重复直到您找到 pte。 mm/page_walk.c
文件是查看此操作的有用文件。
进程在其 运行 时间内访问内存,通常此内存由虚拟地址引用。当它访问不在 TLB 中的地址时,必须如上所述遍历该地址以找出其位置和权限标志。没有“获取进程的 VA”,但是当您的程序使用 mmap 或 malloc 并且您获取变量地址时,这些地址通常是虚拟地址。您可以在 /proc/proc_number/maps
中查看具有 PID proc_number
的进程的虚拟地址布局。请注意,打开地址 space 布局随机化后,每次 运行 相同程序时此地图都会不同。
我不确定,但您可以通过将该变量与我上面链接的 page_walk.c 文件中使用的 pgd 地址进行比较来测试它。
目前,我正在尝试弄清楚如何在 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来获取虚拟地址的范围space,但不知道如何获取具体的虚拟地址。
task_struct->mm->pgd_t是不是表示PGD_directory的基地址?
你的问题没有道理。您不会“获得进程的虚拟地址”。一个进程有一个虚拟地址space,作为数据、代码、堆栈、堆等的虚拟内存映射
这些函数在进程虚拟地址 space 中获取单个虚拟地址,并帮助遍历页面 table 以找到它的页面 table条目,然后是它的物理地址(或检查页面 table 条目标志)。在 Linux 中,有 4 个页面 table 级别可以到达页面 table 条目。通常级别是 pgd(page table 目录)、pud(page 上层目录)、pmd(page mid 目录)和 pte(page table 条目)。但我认为最近 p4d 被添加为额外的页面 table 级别。通常,页面目录(顶级页面table)的地址存储在CR3寄存器中。因此,您使用该地址访问目录,然后使用 pgd_index 和 pgd_offset 找到您需要查看的下一级 (p4d) 的地址,并重复直到您找到 pte。
mm/page_walk.c
文件是查看此操作的有用文件。进程在其 运行 时间内访问内存,通常此内存由虚拟地址引用。当它访问不在 TLB 中的地址时,必须如上所述遍历该地址以找出其位置和权限标志。没有“获取进程的 VA”,但是当您的程序使用 mmap 或 malloc 并且您获取变量地址时,这些地址通常是虚拟地址。您可以在
/proc/proc_number/maps
中查看具有 PIDproc_number
的进程的虚拟地址布局。请注意,打开地址 space 布局随机化后,每次 运行 相同程序时此地图都会不同。我不确定,但您可以通过将该变量与我上面链接的 page_walk.c 文件中使用的 pgd 地址进行比较来测试它。