Estoy tratando de entender el uso de memoria de mi aplicación Linux integrada. La /proc/pid/maps
utilidad / 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.
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 memoriaRespuestas:
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:-
aparecerá un en lugar der
/w
/x
. Si una región no se comparte , es privada , porp
lo que aparecerá una en lugar de unas
. 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 lamprotect
llamada al sistema.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.[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
mmap
pero 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.fuente
gpm
está 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?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
fuente
Por favor, consulte: http://man7.org/linux/man-pages/man5/proc.5.html
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:
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.
fuente