linux - 了解 pmap 输出

标签 linux linux-kernel pmap mmu

我试图使用 pmap -x 命令在 Linux x86-64 上查看进程的内存映射。我对 pmap 的输出感到困惑。特别是映射动态库的条目。它们有多个条目(实际上大多数条目有 4 个,有些有 3 个条目)。下面是一个例子

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

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

但我对中间那一行一无所知。没有权限也没有使用?任何人在这里都有一些智慧的话?

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

最佳答案

这些 protected “----”页面是保护页面,以防止指针在库的代码和数据段之间建立索引。它们只存在于进程的虚拟空间中,如果指针经过段的末尾,它们的存在会导致错误。

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

关于linux - 了解 pmap 输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9828810/

相关文章:

linux - 如何编写符合 ALSA 的虚拟设备驱动程序?

linux - macb ff0e0000.ethernet eth0 : Could not attach to PHY

linux - 如何在 Linux/HPUX (pmap) 上获取内核的内存映射

linux - 我可以使用 FreeBSD 内核制作操作系统吗?并仅构建与 Chromium-OS 相同的替代方案 HTML5

r - purrr 找到最小值,然后用 case_when 标记

linux - linux进程的内存利用率

c++ - 似乎无法从此文件中获取行数

linux - 使用变量检查 FTP 状态 - Linux

python - 如何每天运行一次shell脚本?

linux - 创建一个以特定模式命名的文件