为什么一个文件在 /proc/pid/smaps 中列出了多次?

为什么一个文件在 /proc/pid/smaps 中列出了多次?

当我 cat /proc/1/smaps 文件时,我发现库通常有多达 4 个不同大小和不同 Rss/Pss 等的映射:

7f1a09696000-7f1a0982f000 r-xp 00000000 fe:04 1313975                    /usr/lib/libc-2.21.so
Size:               1636 kB
Rss:                 980 kB
Pss:                   9 kB
Shared_Clean:        980 kB
Shared_Dirty:          0 kB
Private_Clean:         0 kB
Private_Dirty:         0 kB
Referenced:          980 kB
Anonymous:             0 kB
AnonHugePages:         0 kB
Swap:                  0 kB
KernelPageSize:        4 kB
MMUPageSize:           4 kB
Locked:                0 kB
VmFlags: rd ex mr mw me 
7f1a0982f000-7f1a09a2e000 ---p 00199000 fe:04 1313975                    /usr/lib/libc-2.21.so
Size:               2044 kB
Rss:                   0 kB
Pss:                   0 kB
Shared_Clean:          0 kB
Shared_Dirty:          0 kB
Private_Clean:         0 kB
Private_Dirty:         0 kB
Referenced:            0 kB
Anonymous:             0 kB
AnonHugePages:         0 kB
Swap:                  0 kB
KernelPageSize:        4 kB
MMUPageSize:           4 kB
Locked:                0 kB
VmFlags: mr mw me 
7f1a09a2e000-7f1a09a32000 r--p 00198000 fe:04 1313975                    /usr/lib/libc-2.21.so
Size:                 16 kB
Rss:                  16 kB
Pss:                  14 kB
Shared_Clean:          0 kB
Shared_Dirty:          4 kB
Private_Clean:        12 kB
Private_Dirty:         0 kB
Referenced:           12 kB
Anonymous:            16 kB
AnonHugePages:         0 kB
Swap:                  0 kB
KernelPageSize:        4 kB
MMUPageSize:           4 kB
Locked:                0 kB
VmFlags: rd mr mw me ac 
7f1a09a32000-7f1a09a34000 rw-p 0019c000 fe:04 1313975                    /usr/lib/libc-2.21.so
Size:                  8 kB
Rss:                   8 kB
Pss:                   8 kB
Shared_Clean:          0 kB
Shared_Dirty:          0 kB
Private_Clean:         0 kB
Private_Dirty:         8 kB
Referenced:            8 kB
Anonymous:             8 kB
AnonHugePages:         0 kB
Swap:                  0 kB
KernelPageSize:        4 kB
MMUPageSize:           4 kB
Locked:                0 kB
VmFlags: rd wr mr mw me ac 

有人可以告诉我为什么或指出一篇文章吗?

答案1

一般来说,库具有从文件加载的三种不同类型的内存。这些都是:

  • code -- 库中实际的可执行代码
  • rodata——只读数据(常量值)。
  • 数据——可写数据。

这些映射有不同的权限。如果您查看每个映射的第一行:

7f1a09696000-7f1a0982f000 r-xp 00000000 fe:04 1313975                    /usr/lib/libc-2.21.so
7f1a0982f000-7f1a09a2e000 ---p 00199000 fe:04 1313975                    /usr/lib/libc-2.21.so
7f1a09a2e000-7f1a09a32000 r--p 00198000 fe:04 1313975                    /usr/lib/libc-2.21.so
7f1a09a32000-7f1a09a34000 rw-p 0019c000 fe:04 1313975                    /usr/lib/libc-2.21.so

表中的第二列包含每个映射块的权限。第一个块具有权限r-xp。这是代码块,因此可读且可执行。

第二块有---p.该块不可访问。它可能包含调试符号或执行程序实际不需要的一些其他数据。

第三块有r--p.这是只读数据段。最后一个块有rw-p.这是可写数据段。

Rss和Pss等值不同的原因仅仅是由于每个区域访问的内存量不同。

/proc/[pid]/smaps如果您对各个字段的含义感到好奇,请查看过程手册页。每个部分的标题行都记录在该/proc/[pid]/maps部分中。

相关内容