Mappages de bibliothèques partagées dans / proc / pid / maps

8

Pourquoi /proc/pid/mapscontient-il quelques enregistrements pour la même bibliothèque? Voici un exemple:

7fae7db9f000-7fae7dc8f000 r-xp 00000000 08:05 536861                     /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.20
7fae7dc8f000-7fae7de8f000 ---p 000f0000 08:05 536861                     /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.20
7fae7de8f000-7fae7de97000 r--p 000f0000 08:05 536861                     /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.20
7fae7de97000-7fae7de99000 rw-p 000f8000 08:05 536861                     /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.20

Qu'est-ce que ça veut dire ?

Irbis
la source

Réponses:

12

Les quatre enregistrements ont des autorisations différentes, ils ne peuvent donc pas être fusionnés.

  • L' r-xpentrée décrit un bloc de mémoire exécutable ( xindicateur d'autorisation). Voilà le code.
  • L' r--pentrée décrit un bloc de mémoire qui est uniquement lisible ( rindicateur d'autorisation). Ce sont des données statiques (constantes).
  • L' rw-pentrée décrit un bloc de mémoire accessible en écriture ( windicateur d'autorisation). C'est pour les variables globales de la bibliothèque.
  • L' ---pentrée décrit un morceau d'espace d'adressage qui n'a pas d'autorisations (ou de mémoire mappée).

Tous sont privés ( pindicateur), ce qui signifie que si un processus modifie une page (ce qui n'est possible que pour la partie accessible en écriture), cette page sera copiée (copie sur écriture) et les autres processus ne verront aucun changement.

Cette dernière entrée est un écart entre le segment de code et le segment de données qui est explicitement inséré par l'éditeur de liens GNU dans certaines circonstances. Le but de cet écart est de garantir que le code (partageable entre les processus qui utilisent la même bibliothèque) et les données inscriptibles (non partageables) ne se trouvent jamais sur la même page. La taille de l'espace est de 2 Mo, car c'est la plus grande taille de page¹ que Linux utilise sur votre architecture (amd64). Voir À quoi servent les mappages de mémoire apparemment inutilisables sous Linux? pour plus de détails.

¹ La plupart des pages font 4 Ko, ce qui correspond à la taille de page «normale». Mais il peut y avoir des pages qui utilisent moins d'indirections MMU, ce qui est légèrement plus rapide mais gaspille beaucoup d'espace à moins que l'application n'utilise réellement de très gros blocs de mémoire. Linux appelle ces pages immenses .

Source et plus d'informations sur l'écart non mappé: pourquoi gnome-panel utilise 290 Mo? par RJK. Voir aussi l'entrée pour /proc/PID/mapsdans la documentation du noyau Linux , Comprendre Linux / proc / id / maps et / proc / $ pid / maps affiche les pages sans autorisations rwx sur x86_64 linux sur Stack Overflow.

Gilles 'SO- arrête d'être méchant'
la source