22

我试图使用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 映射)。

有人对此有什么解释吗?我有一种感觉,可能具有只读保护的映射是由加载器完成的,以读取库的元数据,而具有可执行权限的部分实际上是库的代码。不过我可能是错的。

但我对中间那一排一无所知。没有权限也没有用途?有人在这里有一些智慧的话吗?

我还看到有几页报告在匿名内存上,并且没有设置任何模式位。这些代表什么?

4

2 回答 2

8

这些受保护的“----”页是保护页,以防止指针在库的代码段和数据段之间建立索引。它们只存在于进程的虚拟空间中,如果指针经过段的末尾,它们的存在会导致错误。

如果这些没有被写入共享库文件,我会说它们用作将分配扩展到例如 malloc 或堆栈增长的缓冲区。例如,glibc 从内核请求大块地址空间用于线程局部分配领域,然后缓慢消耗它们用于 malloc 分配。在来自 JVM 的一个更大的 pmap 中,我正在查看其中的几十个,每个都跟随一个 RW 页面或填充两个大型 RW 分配之间的空间,并且它们之间的边界随着 RW 页面的扩展而变化。在这样的 X86_64 保护页面上,可以使用 CPU 的内存保护系统来捕获错误的指针取消引用。

于 2015-10-23T12:01:47.523 回答
4

首先,可能存在同一个进程可以使用多个内存使用实例的情况。我不知道这是不是你想知道的。我已经看到,在 Linux 中使用浏览器时,只打开一个选项卡,并使用 top 命令,它在内存使用列表中显示超过 4 个使用,覆盖超过 10mb 的内存。我认为它可以,因为同一进程运行的线程数量更多。

此链接可能很有用,因为在使用示例本身中,如果您观察,-x 命令的映射会显示更多使用次数。

http://www.cyberciti.biz/tips/howto-find-memory-used-by-program.html

于 2012-03-23T05:00:39.750 回答