Mappages de bibliothèque partagée dans / proc / pid / maps

Pourquoi /proc/pid/maps contient-il quelques loggings 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 ?

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

  • L'input r-xp décrit un bloc de memory exécutable ( x drapeau d'autorisation). C'est le code.
  • L'input r--p décrit un bloc de memory lisible uniquement ( r autorisation). C'est des données statiques (constantes).
  • L'input rw-p décrit un bloc de memory inscriptible ( w drapeau d'autorisation). C'est pour les variables globales de la bibliothèque.
  • L'input ---p décrit un bloc d'espace d'adressage qui n'a pas d'permissions (ou de memory mappée).

Tous sont privés (drapeau p ), ce qui signifie que si un process modifie une page (ce qui n'est possible que pour la partie inscriptible), cette page sera copiée (copy à l'écriture) et les autres process ne verront aucune modification.

Cette dernière input 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 s'assurer que le code (partageable entre les process utilisant la même bibliothèque) et datatables inscriptibles (non partageables) ne sont jamais sur la même page. La taille de l'espace est de 2 Mo car c'est la plus grande taille de page¹ utilisée par Linux sur votre architecture (amd64). Voir Quel est le but des mappages de memory apparemment inutilisables sous Linux? pour plus de détails.

¹ La plupart des pages sont de 4 Ko, ce qui correspond à la taille de page "normale". Mais il peut y avoir des pages qui utilisent less d'indirections de MMU, ce qui est un peu plus rapide mais cela gaspille beaucoup d'espace à less que l'application n'utilise réellement de très gros blocs de memory. Linux appelle ces énormes pages .

Source et plus d'informations pour le gap non mappé: Pourquoi gnome-panel utilise-t-il 290MB? par RJK. Voir aussi l'input pour /proc/PID/maps dans la documentation du kernel Linux , Comprendre Linux / proc / id / maps et / proc / $ pid / maps montre les pages sans autorisation rwx sur x86_64 linux sur Stack Overflow.