2010-10-05 7 views
7

Entiendo el significado de los bits rwxps. r-xp es para .text. rw-p es para .data/.bss/heap/stack. ¿Para qué sirve solo las páginas ---p?¿Qué significan los permisos "--- p" en/proc/self/maps?

Por ejemplo ver esta salida de 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

Ver la respuesta aquí: http://stackoverflow.com/questions/16524895/proc-pid-maps-shows-pages-with-no-rwx-permissions-on-x86-64-linux – Enyby

Respuesta

1

De acuerdo con la man page, significa privada (copia en escritura). Sin embargo, no hay idea de la utilidad de tal mapeo sin poder leer/escribir/ejecutar nada en él.

Posiblemente es privado para libc, lo que le permite modificar los permisos para acceder a él sin que un programa de usuario lo vacíe accidentalmente.

+0

Creo que es así porque si un programa modificara la copia de libc que estaba usando, entonces la libc modificada se volvería a mapear en el espacio de memoria de ese proceso, de modo que continuaría sin modificaciones para otros procesos. – Dio

0

Esto es algo que me he preguntado sobre los detalles de también. No apareció hasta algún momento en los últimos años, pero no estoy seguro de si GNU binutils o el enlazador dinámico glibc (ld-linux.so.2) es responsable del cambio.

Al principio pensé que era una especie de región de guardia creada por el enlazador dinámico para proteger contra el acceso fuera de límites al segmento de datos de una biblioteca, pero no tiene sentido que sea tan grande. Es posible que sea un mapa completo del archivo while library para que el enlazador dinámico pueda hacerlo legible nuevamente en algún momento en el futuro (tal vez durante las llamadas dlopen o dlsym) para acceder a los metadatos ELF que normalmente no necesitan ser mapeados.

En cualquier caso, es desagradable hinchazón, especialmente en máquinas de 32 bits donde el espacio de direcciones virtuales es un recurso precioso. También hincha las tablas de la página del kernel, lo que aumenta los recursos del kernel utilizados por un proceso.

P.S. Lo siento, esta no es realmente una respuesta. Sé que solo son fragmentos al azar que podrían ayudar a dar una respuesta, pero fue demasiado tiempo para hacer un comentario.

Cuestiones relacionadas