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

KaP*_*KaP 2 linux proc

当我 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 
Run Code Online (Sandbox Code Playgroud)

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

小智 6

通常,库具有从文件加载的三种不同类型的内存。这些是:

  • 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
Run Code Online (Sandbox Code Playgroud)

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

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

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

Rss 和 Pss 等值不同的原因很简单,因为每个区域访问的内存量不同。

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