J'essaie de comprendre l'utilisation de la mémoire de mon application Linux intégrée. Le /proc/pid/maps
utilité/fichier semble être une bonne ressource pour voir les détails. Malheureusement, je ne comprends pas toutes les colonnes et les entrées.
Que signifie l'entrée inode anonyme 0? Celles-ci semblent faire partie des plus gros segments de mémoire.
Chaque ligne de /proc/$PID/maps
décrit une région de mémoire virtuelle contiguë dans un processus ou un thread. Chaque ligne contient les champs suivants:
address perms offset dev inode pathname
08048000-08056000 r-xp 00000000 03:0c 64593 /usr/sbin/gpm
-
apparaîtra à la place du r
/w
/x
. Si une région n'est pas partagée, elle est privée, donc un p
apparaîtra à la place d'un s
. Si le processus tente d'accéder à la mémoire d'une manière non autorisée, une erreur de segmentation est générée. Les autorisations peuvent être modifiées à l'aide de l'appel système mprotect
.mmap
), il s'agit du décalage dans le fichier où commence le mappage. Si la mémoire n'a pas été mappée à partir d'un fichier, c'est juste 0.[heap]
, [stack]
, ou [vdso]
. [vdso]
représente un objet partagé dynamique virtuel. Il est utilisé par les appels système pour passer en mode noyau. Voici un bon article à ce sujet: "Qu'est-ce que linux-gate.so.1?"Vous remarquerez peut-être beaucoup de régions anonymes. Celles-ci sont généralement créées par mmap
mais ne sont attachées à aucun fichier. Ils sont utilisés pour beaucoup de choses diverses telles que la mémoire partagée ou les tampons non alloués sur le tas. Par exemple, je pense que la bibliothèque pthread utilise des régions anonymes mappées en tant que piles pour de nouveaux threads.
le mappage de la mémoire est non seulement utilisé pour mapper des fichiers dans la mémoire, mais également comme un outil permettant de demander au noyau la mémoire RAM).
Veuillez vérifier: 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
Le champ d'adresse est l'espace d'adressage occupé par le mappage dans le processus.
Le champ perms est un ensemble d'autorisations:
r = read
w = write
x = execute
s = shared
p = private (copy on write)
Le champ offset est le décalage dans le fichier/quoi que ce soit;
dev est le périphérique (majeur: mineur);
inode est l'inode sur ce périphérique. 0 indique qu'aucun inode n'est associé à la région mémoire, comme ce serait le cas avec BSS (données non initialisées).
Le champ nom du chemin sera généralement le fichier qui sauvegarde le mappage. Pour les fichiers ELF, vous pouvez facilement coordonner avec le champ offset en consultant le champ Offset dans les en-têtes du programme ELF (readelf -l).
Sous Linux 2.0, il n'y a pas de champ donnant un chemin.