tutorial systems embebido curso linux embedded

systems - Comprender Linux/proc/id/maps



linux embebido tutorial (4)

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

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

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


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 perms es un conjunto de permisos:

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

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

dev es el dispositivo (mayor: menor);

El inodo es el inodo en ese dispositivo. 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 generalmente será 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 del programa ELF (readelf -l).

Bajo Linux 2.0, no hay ningún campo dando nombre de ruta.


la asignación de memoria no solo se usa para mapear archivos en la memoria, sino que también es una herramienta para solicitar RAM desde kernel. Estas son las entradas de inode 0: su pila, montón, segmentos bss y más


proc(5)

mmap(2)

"Entender el kernel de Linux" 9.3. Regiones de memoria; 16.2. Mapeo de memoria

"Entender el administrador de memoria virtual de Linux" 4.4 Regiones de memoria


Cada fila en /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 : 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 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 .
  • desplazamiento : si la región se mapeó desde un archivo (usando mmap ), este es el desplazamiento en el archivo donde comienza la asignación. Si la memoria no se mapeó desde un archivo, es solo 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 fue mapeada 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] sinónimo de objeto virtual compartido virtual. Es utilizado por las llamadas al sistema para cambiar al modo kernel. Aquí hay un buen artículo al respecto.

Puede notar muchas regiones anónimas. Estos generalmente son creados 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.