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

14

/proc/$pid/maps显示在x86_64 Linux上没有rwx权限的页面。我注意到,在64位Linux上阅读/proc/$pid/maps时,有一些内存页面没有权限,但在32位Linux上却没有。

我想监视我的进程的内存使用情况,但我感到困惑。为什么会有没有rwx权限的页面?它们正在消耗我的内存!

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

% 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
请给予建议。
1个回答

22

这些映射用于共享库:

通常情况下,每个加载的共享库会有四个映射:


(Translated text:

These mappings are used for shared libraries:

In general for each shared library loaded we will have four mappings:

)
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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接