了解pmap输出

Ark*_*rka 20 linux linux-kernel pmap mmu

我试图使用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
Run Code Online (Sandbox Code Playgroud)

每个库的第二行总是大小为2MB,而没有页面权限.在所有图书馆中,似乎它的RSS始终为零.最后两行也具有相同的大小(基页大小)和相同的权限(少数库没有rw映射).

有人对此有一些解释吗?我有点意识到,带有只读保护的映射可能由加载器完成,以读取库的元数据,而具有可执行权限的部分实际上是库的代码.我可能错了.

但我对这一中间行没有任何线索.没有许可,没有用法?谁在这里有一些智慧的话?

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

小智 6

这些受保护的"----"页面是防护页面,以防止指针在库的代码和数据段之间进行索引.它们仅存在于进程的虚拟空间中,并且如果指针遍历段的末尾则存在导致错误.

如果这些没有被解决到共享库文件中,我会说它们作为缓冲区用于将分配扩展到例如malloc或堆栈增长.例如,glibc从内核请求大块地址空间用于线程局部分配竞技场然后慢慢地消耗它们以用于malloc'd分配.在从JVM大得多PMAP我看有这些几十个,每个跟随RW两次大RW分配之间的空间填充和它们之间的界限转变为RW页面扩大.在X86_64这样的保护页面上可以使用CPU的内存保护系统来捕获错误的指针引用.


Xan*_*der 4

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

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

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