linux memory memory-management hyperlink memory-layout

linux - ¿Por qué puedo ver los mismos segmentos en la salida/proc/pid/maps?



memory memory-management (2)

La prueba está en el Linux de 32 bits

El código es el siguiente:

int foo(int a, int b) { int c = a + b; return c; } int main() { int e = 0; int d = foo(1, 2); printf("%d/n", d); scanf("%d", &e); return 0; }

y cuando uso cat / proc / pid / maps para ver el diseño de la memoria, parece que puedo ver tres segmentos de texto para mi código y la biblioteca.

ubuntu% cat /proc/2191/maps 08048000-08049000 r-xp 00000000 08:01 1467306 /home/shuai/work/asm/test1 08049000-0804a000 r--p 00000000 08:01 1467306 /home/shuai/work/asm/test1 0804a000-0804b000 rw-p 00001000 08:01 1467306 /home/shuai/work/asm/test1 09137000-09158000 rw-p 00000000 00:00 0 [heap] b75c6000-b75c7000 rw-p 00000000 00:00 0 b75c7000-b776b000 r-xp 00000000 08:01 3149924 /lib/i386-linux-gnu/libc-2.15.so b776b000-b776d000 r--p 001a4000 08:01 3149924 /lib/i386-linux-gnu/libc-2.15.so b776d000-b776e000 rw-p 001a6000 08:01 3149924 /lib/i386-linux-gnu/libc-2.15.so b776e000-b7771000 rw-p 00000000 00:00 0 b7780000-b7784000 rw-p 00000000 00:00 0 b7784000-b7785000 r-xp 00000000 00:00 0 [vdso] b7785000-b77a5000 r-xp 00000000 08:01 3149914 /lib/i386-linux-gnu/ld-2.15.so b77a5000-b77a6000 r--p 0001f000 08:01 3149914 /lib/i386-linux-gnu/ld-2.15.so b77a6000-b77a7000 rw-p 00020000 08:01 3149914 /lib/i386-linux-gnu/ld-2.15.so bfd47000-bfd68000 rw-p 00000000 00:00 0 [stack]

¿Alguien podría darme alguna guía sobre este tema? ¡Muchas gracias!


Tenga en cuenta los valores en las columnas 3 (inicio del desplazamiento) y 2 (permisos). Realmente tienes la misma parte asignada dos veces, en las líneas 1 y 2 para tu archivo binario, pero, en la línea 3, es diferente. Está permitido mapear el mismo archivo por separado varias veces; diferentes sistemas podrían omitir la fusión de esto en una entrada de mapa VM, por lo que podría reflejar el historial de mapeo pero no el estado actual jist.

Si ve en las asignaciones de la biblioteca, puede encontrar fácilmente la ley de que cualquier biblioteca se asigna por separado:

  • Con permiso para leer y ejecutar: el código principal que no debe modificarse.
  • Con permiso para leer: área de datos constante sin código permitido.
  • Con permiso para leer y escribir: combina áreas de datos no constantes y tablas de reubicación de objetos compartidos.

Tener el mismo área inicial de archivo binario 4K asignada dos veces podría explicarse con la lógica RTLD que difiere de una lógica de biblioteca arbitraria debido a las necesidades de arranque. No lo trato tan importante, más por lo que podría diferir fácilmente en los detalles de la plataforma.


Tenga en cuenta que las tres secciones para cada archivo tienen permisos diferentes: solo lectura, lectura-escritura y lectura-ejecución. Esto es por seguridad: la sección de código (ejecución de lectura) no se puede escribir a través de exploits, y el segmento que se puede escribir no se puede ejecutar.