Comprender Linux / proc / id / maps

156

Estoy tratando de entender el uso de memoria de mi aplicación Linux integrada. La /proc/pid/mapsutilidad / archivo parece ser un buen recurso para ver los detalles. Lamentablemente no entiendo todas las columnas y entradas.

¿Qué significan las entradas anónimas del inodo 0? Estos parecen ser algunos de los segmentos de memoria más grandes.

Simón
fuente
1
proc(5) mmap(2)"Comprensión del kernel de Linux" 9.3. Regiones de memoria; 16.2 Asignación de memoria "Comprensión del Administrador de memoria virtual de Linux" 4.4 Regiones de memoria
wRAR

Respuestas:

263

Cada fila en /proc/$PID/mapsdescribe 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 : esta es la dirección inicial y final de la región en el espacio de direcciones del proceso
  • permisos : describe cómo se puede acceder a las páginas de la región. Hay cuatro permisos diferentes: leer, escribir, ejecutar y compartir. Si la lectura / escritura / ejecución están deshabilitadas, -aparecerá un en lugar de r/ w/ x. Si una región no se comparte , es privada , por plo que aparecerá una en lugar de una s. Si el proceso intenta acceder a la memoria de una manera que no está permitida, se genera una falla de segmentación. Los permisos se pueden cambiar mediante la mprotectllamada al sistema.
  • desplazamiento : 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ó desde un archivo, es solo 0.
  • dispositivo : si la región se asignó desde un archivo, este es el número de dispositivo mayor y menor (en hexadecimal) donde se encuentra el archivo.
  • inodo : si la región se asignó desde un archivo, este es el número de archivo.
  • nombre de ruta : si la región se asignó desde un archivo, este es el nombre del archivo. Este campo está en blanco para regiones mapeadas anónimas. También hay regiones especiales con nombres como [heap], [stack]o [vdso]. [vdso]significa objeto virtual compartido virtual. Lo usan las llamadas del sistema para cambiar al modo kernel. Aquí hay un buen artículo al respecto: "¿Qué es linux-gate.so.1?"

Es posible que observe muchas regiones anónimas. Por lo general, se crean mmappero no se adjuntan a ningún archivo. Se utilizan para muchas cosas diversas, como memoria compartida o buffers no asignados en el montón. Por ejemplo, creo que la biblioteca pthread usa regiones mapeadas anónimas como pilas para nuevos hilos.

Jay Conrod
fuente
44
Sí, los subprocesos están asignando bloques de 8Mb para una pila con una sección más pequeña para la detección de desbordamiento de pila (creo). Por lo tanto, cada subproceso creado, por defecto, asigna una región de memoria de inodo 0 de 8Mb y una región de inodo 0 de 4Kb.
simon
Entonces, en su ejemplo, ¿ gpmestá mapeando el archivo binario en alguna dirección virtual desde el principio, con el encabezado ELF, etc.? ¿No se supone que el cargador analiza el encabezado ELF y asigna secciones individuales, no todo el archivo?
Dmitry Grigoryev
9

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 núcleo. Estas son esas entradas de inodo 0: su pila, montón, segmentos bss y más

Xeor
fuente
5

Por favor, consulte: 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 la asignación.

El campo de permisos 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);

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

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

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

cahit beyaz
fuente