理解pmap输出

25

我想使用pmap -x命令在Linux x86-64上查看进程的内存映射。但是,查看pmap的输出让我感到困惑,特别是针对动态库映射的条目。它们有多个条目(实际上大多数都有4个条目,有些只有3个条目)。以下是一个示例:

  Address           Kbytes   RSS   Dirty Mode   Mapping

00000036ca200000      88      64       0 r-x--  libpthread-2.5.so
00000036ca216000    2044       0       0 -----  libpthread-2.5.so
00000036ca415000       4       4       4 r----  libpthread-2.5.so
00000036ca416000       4       4       4 rw---  libpthread-2.5.so
每个库的第二行总是有2MB大小,但没有页面许可。在所有库中,它的RSS似乎始终为零。最后两行也具有相同的大小(即基页大小)和相同的权限(少数库没有rw映射)。
有人能解释一下吗?我感觉可能是加载器用只读保护进行映射以读取库的元数据,而具有可执行权限的部分实际上是库的代码。尽管我可能是错的。
但我对那一行毫无头绪。没有权限和没有用途?有人在这里有一些智慧的话吗?
我还看到了一些页面被报告为匿名内存,并且没有设置任何模式位。这些代表什么?

尝试修复拼写错误:具有可执行权限的部分实际上是库的代码 ...似乎缺少了“is”,但无法百分之百确定;你能帮忙吗? - Alois Mahdal
2个回答

8
这些受保护的“----”页面是守卫页面,用于防止指针在库的代码和数据段之间进行索引。它们仅存在于进程的虚拟空间中,存在的目的是如果指针超过段的末尾,则导致故障。
如果这些页面没有被整合到共享库文件中,我会说它们是用作扩展分配的缓冲区,例如malloc或堆栈增长。例如,glibc从内核请求大块地址空间以供线程本地分配竞技场,然后慢慢地消耗它们以供malloc分配。在我查看的一个更大的JVM的pmap上,有几十个这样的页面,每个页面都跟随一个RW页面或填充两个大的RW分配之间的空间,并且它们之间的边界随着RW页面的扩展而移动。在X86_64上,这样的守卫页面可以使用CPU的内存保护系统来捕获错误的指针解引用。

4
首先,有时候同一个进程可能会使用多个内存使用实例。我不知道这是否是您想要了解的内容。我曾经看到,在Linux中使用浏览器时,只打开一个标签页,并使用top命令查看内存使用情况列表时,会显示超过4个使用情况,覆盖超过10MB的内存。我认为这是由于同一进程运行更多线程的缘故。
此链接可能很有用,因为在其使用示例中,如果您观察,-x命令的映射显示更多的使用情况。 http://www.cyberciti.biz/tips/howto-find-memory-used-by-program.html

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接