2009-09-09 11 views
114

Estoy intentando comprender el uso de la memoria de mi aplicación Linux incorporada. La utilidad/archivo/proc/pid/maps parece ser un buen recurso para ver los detalles. Lamentablemente, no entiendo todas las columnas y entradas.Descripción de Linux/proc/id/maps

¿Existe un buen recurso/documentación para la utilidad/archivo proc/pid/maps?

¿Qué significa la entrada anónima de inodo 0? Estos parecen ser algunos de los segmentos de memoria más grandes.

Respuesta

187

Cada fila de /proc/$PID/maps describe una región de memoria virtual contigua en un proceso o subproceso. Cada fila tiene los siguientes campos:

address   perms offset dev inode pathname 
08048000-08056000 r-xp 00000000 03:0c 64593 /usr/sbin/gpm 
  • dirección de - Esta es la dirección inicial y final de la región en el espacio de direcciones del proceso
  • permisos - Describe cómo las páginas de la región pueden ser accedido. Hay cuatro permisos diferentes: leer, escribir, ejecutar y compartir. Si read/write/execute están deshabilitados, aparecerá '-' en lugar de 'r'/'w'/'x'. Si una región no se comparte, es privada, por lo que aparecerá una 'p' en lugar de una 's'. Si el proceso intenta acceder a la memoria de una manera que no está permitida, se genera un error de segmentación. Los permisos se pueden cambiar usando la llamada al sistema mprotect.
  • offset - Si la región se asignó desde un archivo (usando mmap), este es el desplazamiento en el archivo donde comienza la asignación. Si la memoria no se asignó de un archivo, es 0.
  • dispositivo - Si la región se asignó desde un archivo, este es el número de dispositivo principal y secundario (en hexadecimal) donde vive el archivo.
  • inode - Si la región se asignó desde un archivo, este es el número de archivo.
  • ruta de acceso - Si la región se asignó desde un archivo, este es el nombre del archivo. Este campo está en blanco para las regiones mapeadas anónimas. También hay regiones especiales con nombres como [heap], [stack] o [vdso]. [vdso] significa objeto virtual compartido virtual. Es utilizado por las llamadas al sistema para cambiar al modo kernel. Here's a good article about it.

Es posible que observe muchas regiones anónimas. Estos generalmente se crean por mmap pero no están adjuntos a ningún archivo. Se usan para muchas cosas variadas, como memoria compartida o almacenamientos intermedios no asignados en el montón. Por ejemplo, creo que la biblioteca pthread usa regiones anónimas asignadas como pilas para nuevos hilos.

+4

Sí, las pthreads están asignando bloques de 8Mb para una pila con una sección más pequeña para la detección de desbordamiento de la pila (creo). Por lo tanto, cada pthread creado, por defecto, asigna una región de memoria inode 0 de 8Mb y una región inode 0 de 4Kb. – simon

+0

Entonces, en su ejemplo 'gpm' está mapeando el archivo binario en alguna dirección virtual desde el principio, con un encabezado ELF, etc. ¿No se supone que el cargador analiza el encabezado ELF y asigna secciones individuales, no el archivo completo? –

8

La asignación de memoria no solo se utiliza para asignar archivos a la memoria, sino que también es una herramienta para solicitar RAM del kernel. Estos son los inodos 0 entradas - su pila, montón, segmentos bss y más

18

proc(5)

mmap(2)

"Comprender el núcleo de Linux" 9.3. Regiones de memoria; 16.2. Asignación de memoria

"entendiendo el gestor de memoria virtual de Linux" Regiones 4.4 Memoria

0

Por favor, compruebe: http://man7.org/linux/man-pages/man5/proc.5.html

address   perms offset dev inode  pathname 
00400000-00452000 r-xp 00000000 08:02 173521  /usr/bin/dbus-daemon 

El campo de dirección es el espacio de direcciones en el proceso que ocupa el mapeo .

El campo permanentes es un conjunto de permisos:

r = read 
w = write 
x = execute 
s = shared 
p = private (copy on write) 

El campo de desplazamiento es el desplazamiento en el archivo/lo que sea;

dev es el dispositivo (mayor: menor);

inode es el inodo en ese dispositivo. 0 indica que no se asocia ningún inodo con la región de memoria, como sería el caso con BSS (datos no inicializados).

El campo de nombre de ruta será generalmente el archivo que respalda la asignación. Para los archivos ELF, puede coordinar fácilmente con el campo de compensación mirando el campo Desplazamiento en los encabezados de programa ELF (readelf -l).

En Linux 2.0, no hay ningún campo que proporcione el nombre de ruta.