根据我的理解,Linux不会将所有父进程内存复制到子进程的单独页面,而是执行copy-on-write。直到任一进程修改(写入)映射(共享)页面中的某些内存位置,我们将子和父虚拟地址空间映射到相同的物理内存位置(相同的物理页面)。
我想知道是否有可用的工具向我显示进程共享的物理内存页面#。或任何提供虚拟地址的工具 - >物理地址映射。这样我就可以实际查看物理地址并检查进程是否映射到同一物理内存。
感谢。
答案 0 :(得分:0)
我不知道是否有专门的工具可用,但是所有需要的信息都应该已经通过/proc
文件系统导出。
您的问题中给出的特殊用例甚至在相关文档中明确提到。 (linux-src-directory/Documentation/vm/pagemap.txt
或在线https://www.kernel.org/doc/Documentation/vm/pagemap.txt):
使用pagemap查找进程的一般步骤' 内存使用情况如下:
- 读取/ proc / pid / maps以确定内存空间的哪些部分 映射到什么。
- 选择您感兴趣的地图 - 所有地图或特定地图 库,或堆栈或堆等
- 打开/ proc / pid / pagemap并寻找您想要检查的页面。
- 从页面地图中为每个页面读取一个u64。
- 打开/ proc / kpagecount和/或/ proc / kpageflags。对于每个PFN,你只需要 读取,在文件中查找该条目,并读取您想要的数据。
醇>例如,要查找“唯一集合大小”(USS),即金额 进程正在使用的内存不与任何其他进程共享 过程中,您可以浏览过程中的每个地图,找到PFN, 在kpagecount中查找它们,并计算出的页数 只引用一次。