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


8

为什么/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

这是什么意思 ?

Answers:


12

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

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

全部都是私有的(p标志),这意味着如果某个进程修改了一个页面(仅可写部分才可以修改),那么该页面将被复制(写时复制),其他进程将看不到任何更改。

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

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

尚未解决的空白的来源和更多信息:gnome-panel为什么使用290MB?由RJK。另请参见Linux内核文档中的条目/proc/PID/maps了解Linux / proc / id / maps/ proc / $ pid / maps显示在Stack Overflow 上对x86_64 linux没有rwx权限的页面

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.