0

据我了解,Linux 不会将所有父进程内存复制到子进程的单独页面,它会进行写时复制。直到任一进程修改(写入)映射(共享)页面中的某个内存位置,我们才会将子虚拟地址空间和父虚拟地址空间映射到相同的物理内存位置(相同的物理页面)。

我想知道是否有可用的工具向我显示进程共享的物理内存页面#。或任何提供虚拟地址 -> 物理地址映射的工具。这样我就可以实际查看物理地址并检查进程是否映射到相同的物理内存。

谢谢。

4

1 回答 1

0

我不知道是否有可用的专用工具,但所需的所有信息都应该已经通过/proc文件系统导出。

您问题中给出的特殊用例甚至在相关文档中明确提到。(linux-src-directory/Documentation/vm/pagemap.txt或在线https://www.kernel.org/doc/Documentation/vm/pagemap.txt):

使用 pagemap 来了解进程的内存使用情况的一般过程如下:

  1. 读取 /proc/pid/maps 以确定内存空间的哪些部分映射到什么。
  2. 选择您感兴趣的地图——所有地图,或特定库,或堆栈或堆等。
  3. 打开 /proc/pid/pagemap 并查找您要检查的页面。
  4. 从 pagemap 中为每个页面读取一个 u64。
  5. 打开 /proc/kpagecount 和/或 /proc/kpageflags。对于您刚刚读取的每个 PFN,在文件中查找该条目,然后读取您想要的数据。

例如,要查找“唯一集大小”(USS),即一个进程正在使用的不与任何其他进程共享的内存量,您可以遍历进程中的每个映射,找到 PFN,查看那些在 kpagecount 中增加的,并计算只被引用一次的页数。

于 2013-03-10T22:19:43.760 回答