2010-10-05 296 views
7

我了解rwxps位的含义。 r-xp用于.text。 rw-p用于.data/.bss /堆/堆栈。什么是---p页面的使用?/proc/self/maps中的“--- p”权限是什么意思?

例如见的cat /proc/self/maps

 
00400000-0040b000 r-xp 00000000 08:03 827490        /bin/cat 
0060b000-0060c000 rw-p 0000b000 08:03 827490        /bin/cat 
0060c000-0062d000 rw-p 00000000 00:00 0         [heap] 
3819a00000-3819a1e000 r-xp 00000000 08:03 532487       /lib64 ld-2.11.2.so 
3819c1d000-3819c1e000 r--p 0001d000 08:03 532487       /lib64/ld-2.11.2.so 
3819c1e000-3819c1f000 rw-p 0001e000 08:03 532487       /lib64/ld-2.11.2.so 
3819c1f000-3819c20000 rw-p 00000000 00:00 0 
3819e00000-3819f70000 r-xp 00000000 08:03 532490       /lib64/libc-2.11.2.so 
3819f70000-381a16f000 ---p 00170000 08:03 532490       /lib64/libc-2.11.2.so 
381a16f000-381a173000 r--p 0016f000 08:03 532490       /lib64/libc-2.11.2.so 
381a173000-381a174000 rw-p 00173000 08:03 532490       /lib64/libc-2.11.2.so 
381a174000-381a179000 rw-p 00000000 00:00 0 
7fb859c49000-7fb85fa7a000 r--p 00000000 08:03 192261      /usr/lib/locale/locale-archive 
7fb85fa7a000-7fb85fa7d000 rw-p 00000000 00:00 0 
7fb85fa95000-7fb85fa96000 rw-p 00000000 00:00 0 
7fff64894000-7fff648a9000 rw-p 00000000 00:00 0       [stack] 
7fff649ff000-7fff64a00000 r-xp 00000000 00:00 0       [vdso] 
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0     [vsyscall] 
+1

查看答案在这里:http://stackoverflow.com/questions/16524895/proc-pid-maps-shows-pages-with-no-rwx-permissions-on-x86-64-linux – Enyby 2015-07-07 19:35:33

回答

1

该输出根据该man page,这意味着私有(复制上写)。但是,不知道这样的映射的有用性是不能够读/写/执行任何内容的。

可能是私有到libc,允许其修改权限,而不需要用户程序意外地摆弄它来访问它。

+0

我认为这是这样的因为如果一个程序要修改它正在使用的libc拷贝,那么修改后的libc将被重新映射到该进程的内存空间中,以便它可以继续不被其他进程修改。 – Dio 2015-06-10 09:06:14

0

这是我想知道的具体细节。它直到过去几年才出现,但我不确定GNU binutils还是glibc动态链接程序(ld-linux.so.2)是否对此变更负责。

起初我以为这是一种由动态链接程序,以防止越界访问库的数据段创建防护区域,但它是没有意义的它是如此之大。它可能是一个while库文件的完整映射图,以便动态链接程序可以在将来某个时间再次使其可读(也许在调用dlopendlsym时)以访问通常不需要映射的ELF元数据。

在任何情况下,它是讨厌的膨胀,尤其是在32位的机器,其中虚拟地址空间是宝贵的资源。它也膨胀了内核页表,增加了进程使用的内核空间资源。

P.S.对不起,这不是一个真正的答案。我知道这只是随机的零碎,可能有助于得到答案,但对于评论来说太长了。