2012-03-22 128 views
17

我正在尝试使用pmap -x命令查看Linux x86-64上进程的内存映射。看着pmap的输出我感到困惑。特别是用于映射动态库的条目。他们有多个条目(其中大部分都是4条,有些条目有3条)。以下是一个示例了解pmap输出

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映射)。

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

但我不知道该中间行。没有许可,没有用法?任何人在这里都有一些智慧的话语?

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

+0

[/ proc/$ pid/maps的可能重复显示在x86 \ _64 linux上没有rwx权限的页面](http://stackoverflow.com/questions/16524895/proc-pid-maps-shows-pages-with -no-rwx-permissions-on-x86-64-linux) – 2015-10-26 07:50:51

+0

试图修复typo:*部分的可执行权限实际上是库的代码* ...似乎“is”丢失,但不能100%肯定;你能帮忙吗? – 2015-10-26 21:00:55

回答

4

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

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

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

3

这些受保护的“----”网页防护页面,以防止指针从库中的代码和数据段之间的索引。它们只存在于进程的虚拟空间中,并且如果指针走过段的末尾,则存在导致错误的地方。

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