查看进程的页表

查看进程的页表

我想查看内核为我的进程之一管理的页表。在我的例子中,PID 4680 被映射到dhclient.因此,为了查看页表,我尝试了以下操作:

sudo cat /proc/4680/pagemap 

然而,这个命令在我的 Ubuntu 14.04 上挂起,没有任何输出。我试过等2分钟然后就不得不杀掉它。

有更好的方法吗?

答案1

根据文档/proc/PID/pagemap每个虚拟页包含一个 64 位值。

有4096字节的页面,有64位的虚拟地址空间,就有2**52页面。所以完整的pagemap文件将是2**52每个 8 个字节的条目。那是一个非常大的文件。捕捉整个事情需要很长时间。不到2分钟。真的很长一段时间了。在我自己的计算机上进行的速度测试显示大约 21 年。

它大部分将用零填充(对于进程中未映射的所有虚拟地址)。一堆 的\0输出到终端不会造成可见的效果。它没有挂起,它正在按照您的要求进行操作。

它不是文本文件,因此不为零的条目在您的终端上也不太可能看起来很好。

使用页面映射文件的正确方法是知道您要查找的虚拟地址,查找它并读取 8 个字节。或者,如果您需要某个范围的信息,请读取 8 字节的某个倍数。如果您想要所有非零条目,请首先阅读/proc/PID/maps以查找映射的范围。

答案2

https://github.com/dwks/pagemap
看起来您可以选择读取/proc/<PID>/pagemap偏移量之间的文件并获取所需虚拟地址的页面映射信息。

$ ./pagemap 11405 0x400000 0x406000
0x400000           : pfn c1719            soft-dirty 0 file/shared 1 swapped 0 present 1
0x401000           : pfn c1718            soft-dirty 0 file/shared 1 swapped 0 present 1
0x402000           : pfn c1717            soft-dirty 0 file/shared 1 swapped 0 present 1
0x403000           : pfn c1716            soft-dirty 0 file/shared 1 swapped 0 present 1
0x404000           : pfn c171a            soft-dirty 0 file/shared 1 swapped 0 present 1
0x405000           : pfn c16ef            soft-dirty 0 file/shared 1 swapped 0 present 1

答案3

我怀疑你正在寻找/proc/<pid>/maps。您可以看到程序及其库的地图。如果要访问每个区域的内容,可以访问目录/proc/<pid>map_files,其中每个文件名由每个块的内存范围设置。

有关此的更多信息,请参见 man过程,查找/proc/[pid]/map_files/和 以下段落。

以下是基于 X11 的程序的内存使用块(部分)的示例:

在此输入图像描述

答案4

步行mm_struct.pgd撞车是一种简单的方法。您将看到表的低地址不同,高地址相同。

  • 对于更高的地址,您可以在 中查看内核页表转储debugfs
  • 对于较低的地址,您可以看到/proc/$PID/maps

相关内容