web-dev-qa-db-fra.com

Comprendre Linux / proc / id / maps

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.

136
simon

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
  • address - Il s'agit des adresses de début et de fin de la région dans l'espace d'adressage du processus.
  • permissions - Ceci décrit comment accéder aux pages de la région. Il existe quatre autorisations différentes: lecture, écriture, exécution et partage. Si lecture/écriture/exécution est désactivée, un - 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.
  • 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ù commence le mappage. Si la mémoire n'a pas été mappée à partir d'un fichier, c'est juste 0.
  • device - 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 anonymes mappées. 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. 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.

234
Jay Conrod

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).

8
Xeor

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.

5
cahit beyaz