linux -/proc/$pid/maps 显示在 x86_64 linux 上没有 rwx 权限的页面

标签 linux memory-management memory-leaks

/proc/$pid/maps 显示在 x86_64 Linux 上没有rwx 权限的页面。 我注意到,当我在 64 位 Linux 上读取 /proc/$pid/maps 时,我有没有权限的内存页,但在 32 位 Linux 中,它们不存在。

我正在尝试监控我的进程的内存使用情况,但我很困惑。为什么有些页面没有 rwx 权限。他们正在消耗我的内存!

这是“top”的 64 位 Linux 输出的片段

% cat /proc/21367/maps

3154200000-315420d000 r-xp 00000000 fd:00 4835776 /lib64/libproc-3.2.7.so <br/>
315420d000-315440d000 **---p** 0000d000 fd:00 4835776 /lib64/libproc-3.2.7.so <br/>
315440d000-315440e000 rw-p 0000d000 fd:00 4835776 /lib64/libproc-3.2.7.so

请指教。

最佳答案

这些映射用于共享库:

一般来说,对于每个加载的共享库,我们会有四个映射:

3b7cc00000-3b7cd86000 r-xp 00000000 fd:00 661350            /lib64/libc-2.12.so
3b7cd86000-3b7cf86000 ---p 00186000 fd:00 661350            /lib64/libc-2.12.so
3b7cf86000-3b7cf8a000 r--p 00186000 fd:00 661350            /lib64/libc-2.12.so
3b7cf8a000-3b7cf8b000 rw-p 0018a000 fd:00 661350            /lib64/libc-2.12.so

第一个是有可执行权限的代码段,第二个是PROT_NONE(无权限)映射,最后两个是数据段(只读部分和读写)。

创建 PROT_NONE 映射是为了保持库的高效共享,并标记保护页以便捕获缓冲区溢出。

请记住,这些映射仅使用部分虚拟地址空间,但实际上并未消耗系统内存。

在这里你可以找到完整的解释:

http://www.greenend.org.uk/rjk/tech/dataseg.html

关于linux -/proc/$pid/maps 显示在 x86_64 linux 上没有 rwx 权限的页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16524895/

相关文章:

linux - gdb 地址太短

linux - KSH 脚本 : -z and -a

Java 对象内存使用 - ibm jvm 1.4.2

c++ - 程序结束后内存泄漏有影响吗?

c++ - Dr.Memory 发现的错误 : don't know how to fix it

linux -/var/log/messages 中的错误编号是什么意思?

linux - 在 unix 系统上查找串口

c - 使用链表结构跟踪 C 程序中可能的内存泄漏

memory-management - 运行时内存地址绑定(bind)的必要性

ios - 带有ARC的UITableView上的EXC_BAD_ACCESS错误?