13

我理解 rwxps 位的含义。r-xp 用于 .text。rw-p 用于 .data/.bss/heap/stack。只有---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 [堆]
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 [堆栈]
7fff649ff000-7fff64a00000 r-xp 00000000 00:00 0 [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]
4

2 回答 2

3

根据手册页,这意味着私有(写入时复制)。但是,如果无法读取/写入/执行其中的任何内容,不知道这种映射有什么用处。

可能它是 libc 私有的,允许它修改访问它的权限,而不会被用户程序意外破坏。

于 2010-10-06T14:51:42.180 回答
0

这也是我想知道的细节。它直到最近几年的某个时候才出现,但我不确定是 GNU binutils 还是 glibc 动态链接器 ( ld-linux.so.2) 对这种变化负责。

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

无论如何,这都是令人讨厌的膨胀,尤其是在虚拟地址空间是宝贵资源的 32 位机器上。它还会使内核页表膨胀,从而增加进程使用的内核空间资源。

PS对不起,这不是一个真正的答案。我知道这只是可能有助于得出答案的随机点点滴滴,但评论的时间太长了。

于 2011-06-14T16:12:22.923 回答