我想查看内核为我的进程之一管理的页表。在我的例子中,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
。