【问题标题】:linux: getting the pages shared between parent and forked childlinux:获取父级和分叉子级之间共享的页面
【发布时间】:2013-02-26 00:20:39
【问题描述】:

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

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

谢谢。

【问题讨论】:

  • 这听起来像是一个 XY 问题。你能解释一下为什么你想知道一个页面是否映射到子进程吗?
  • 您需要从外观上查看存储在内核中的分页表。

标签: linux memory-management


【解决方案1】:

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

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

使用页面映射查找进程的一般过程' 内存使用情况如下:

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

例如,要查找“唯一集大小”(USS),即数量 进程正在使用的不与任何其他进程共享的内存 流程,您可以遍历流程中的每张地图,找到 PFN, 在 kpagecount 中查找它们,并计算页面的数量 只引用一次。

【讨论】:

    猜你喜欢
    • 2011-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-04
    • 1970-01-01
    • 1970-01-01
    • 2022-08-08
    相关资源
    最近更新 更多