Comprendre Linux / proc / id / maps

156

J'essaie de comprendre l'utilisation de la mémoire de mon application Linux embarquée. L' /proc/pid/mapsutilitaire / fichier semble être une bonne ressource pour voir les détails. Malheureusement, je ne comprends pas toutes les colonnes et entrées.

Que signifient les entrées anonymes d'inode 0? Ceux-ci semblent être certains des segments de mémoire les plus importants.

Simon
la source
1
proc(5) mmap(2)"Comprendre le noyau Linux" 9.3. Régions de mémoire; 16.2. Mappage de la mémoire «Comprendre le gestionnaire de mémoire virtuelle Linux» 4.4 Régions de mémoire
wRAR

Réponses:

264

Chaque ligne de /proc/$PID/mapsdé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
  • adresse - Il s'agit de l'adresse de début et de fin de la région dans l'espace d'adressage du processus
  • permissions - Ceci décrit comment les pages de la région sont accessibles. Il existe quatre autorisations différentes: lecture, écriture, exécution et partage. Si la lecture / écriture / exécution est désactivée, un -apparaîtra à la place de r/ w/ x. Si une région n'est pas partagée , elle est privée , donc un papparaî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' mprotectappel système.
  • offset - Si la région a été mappée à partir d'un fichier (en utilisant mmap), il s'agit du décalage dans le fichier où le mappage commence. Si la mémoire n'a pas été mappée à partir d'un fichier, c'est juste 0.
  • périphérique - Si la région a été mappée à partir d'un fichier, il s'agit du numéro de périphérique majeur et mineur (en hexadécimal) où réside le fichier.
  • inode - Si la région a été mappée à partir d'un fichier, il s'agit du numéro de fichier.
  • chemin d'accès - Si la région a été mappée à partir d'un fichier, il s'agit du nom du fichier. Ce champ est vide pour les régions mappées anonymes. Il y a aussi des régions spéciales avec des noms comme [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. Ceux-ci sont généralement créés par, mmapmais ne sont joints à aucun fichier. Ils sont utilisés pour beaucoup de choses diverses comme 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 mappées anonymes comme piles pour les nouveaux threads.

Jay Conrod
la source
4
Oui, les pthreads allouent des blocs de 8 Mo pour une pile avec une section plus petite pour la détection de débordement de pile (je pense). Ainsi, chaque pthread créé, par défaut, alloue une région mémoire d'inode 0 de 8 Mo et une région d'inode 0 de 4 Ko.
simon
Donc, dans votre exemple, gpmest-ce que le mappage du fichier binaire à une adresse virtuelle depuis le début, avec l'en-tête ELF, etc.? Le chargeur n'est-il pas censé analyser l'en-tête ELF et mapper des sections individuelles, pas le fichier entier?
Dmitry Grigoryev
9

Le mappage de mémoire n'est pas seulement utilisé pour mapper des fichiers en mémoire, mais c'est aussi un outil pour demander de la RAM au noyau. Ce sont ces entrées inode 0 - votre pile, tas, segments bss et plus

Xeor
la source
5

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 dans le processus occupé par le mappage.

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 l'offset dans le fichier / peu importe;

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 chemin sera généralement le fichier qui sauvegarde le mappage. Pour les fichiers ELF, vous pouvez facilement vous coordonner avec le champ offset en regardant 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 le chemin.

cahit beyaz
la source