查看进程的分页表

ssh*_*980 7 kernel virtual-memory

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

sudo cat /proc/4680/pagemap 
Run Code Online (Sandbox Code Playgroud)

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

有没有更好的方法来做到这一点?

小智 8

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

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

它主要用零填充(对于未在进程中映射的所有虚拟地址)。一堆\0输出到终端不会造成明显的影响。它没有挂起,它正在按照您的要求进行操作。

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

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


jco*_*ens 1

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

有关此内容的更多信息,请参阅man proc/proc/[pid]/map_files/和以下段落。

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

在此输入图像描述