2016-10-17 1 views
2

Ceci est d'un fichier smaps:
b750d000-b76bc000 r-xp 00000000 08:01 918842 /lib/i386-linux-gnu/libc-2.23.so
Le p en r-xp indique qu'il est chargé en tant que privé, je crois. Pourquoi cela est-il ainsi? Cela ne va-t-il pas à l'encontre du but des bibliothèques partagées si une copie de chaque fichier .so est chargée dans différentes adresses mémoire pour différents processus? Quel avantage ce chargement privé offre-t-il?Pourquoi les bibliothèques partagées (fichiers .so) sont-elles chargées en privé?

Répondre

0

p correspond à MAP_PRIVATE. man mmap allégations selon lesquelles:

MAP_PRIVATE: Créer un privé copie sur écriture mapping. Les mises à jour du mappage ne sont pas visibles par les autres processus mappant le même fichier et ne sont pas transmises au fichier sous-jacent. [...]

Les pages de mémoire physique de ce VMA seront partagés par tous les processus tant qu'aucune modification est fait (ils sont partagés avec le cache du noyau ainsi). Lorsqu'une page virtuelle est modifiée dans un processus donné, la page est dupliquée (non partagée) pour ce processus (copie-sur-écriture).

Regardons à:

$ cat /proc/self/maps 
00400000-0040c000 r-xp 00000000 08:11 529223        /bin/cat 
0060b000-0060c000 r--p 0000b000 08:11 529223        /bin/cat 
0060c000-0060d000 rw-p 0000c000 08:11 529223        /bin/cat 
[...] 
  • Les première et deuxième VMA sont en lecture seule. Ils ne seront (généralement) pas modifiés et seront (généralement) partagés par tous les processus.

  • Le troisième VMA (rw-p) est accessible en écriture, mais les modifications dans un processus ne doivent pas être visibles dans d'autres processus. Ce VMA contient les variables globales (mutables) qui ne sont pas partagées par différents processus.