/proc/pid/maps 中的共享库映射

/proc/pid/maps 中的共享库映射

为什么/proc/pid/maps同一个图书馆包含一些记录?这是一个例子:

7fae7db9f000-7fae7dc8f000 r-xp 00000000 08:05 536861                     /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.20
7fae7dc8f000-7fae7de8f000 ---p 000f0000 08:05 536861                     /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.20
7fae7de8f000-7fae7de97000 r--p 000f0000 08:05 536861                     /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.20
7fae7de97000-7fae7de99000 rw-p 000f8000 08:05 536861                     /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.20

这是什么意思 ?

答案1

这四条记录的权限不同,因此无法合并。

  • r-xp条目描述了可执行内存块(x权限标志)。这就是代码。
  • r--p条目描述了一个只读的内存块(r权限标志)。那是静态数据(常量)。
  • rw-p条目描述了可写的内存块(w权限标志)。这是用于库的全局变量。
  • ---p条目描述了一块没有任何权限(或映射到它的任何内存)的地址空间块。

所有都是私有的(pflag),这意味着如果一个进程修改了一个页面(这仅适用于可写部分),该页面将被复制(写时复制),其他进程将看不到任何更改。

最后一个条目是代码段和数据段之间的间隙,在某些情况下由 GNU 链接器显式插入。此间隙的目的是确保代码(在使用同一库的进程之间可共享)和可写数据(不可共享)永远不会位于同一页面中。间隙的大小为 2MB,因为这是 Linux 在您的架构 (amd64) 上使用的最大页面大小。看Linux中看似不可用的内存映射的目的是什么?更多细节。

1大多数页面为 4kB,这是“正常”页面大小。但可能存在使用较少 MMU 间接的页面,这会稍微快一些,但会浪费大量空间,除非应用程序实际上使用非常大的内存块。 Linux 称这些为大页面

未映射差距的来源和更多信息:为什么 gnome-panel 使用 290MB?由 RJK 提供。也可以看看/proc/PID/mapsLinux 内核文档中的条目,了解 Linux /proc/id/maps/proc/$pid/maps 在 x86_64 linux 上显示没有 rwx 权限的页面在堆栈溢出上。

相关内容