GNU/Linux >> Tutoriels Linux >  >> Linux

Pourquoi les régions mappées en mémoire en lecture seule ont des pages sales ?

Une page sale ne nécessite pas nécessairement une réécriture. Une page sale est une page qui a été écrite depuis la dernière fois que le noyau l'a marquée comme propre. Les données n'ont pas toujours besoin d'être enregistrées dans le fichier d'origine.

Les pages sont privées, non partagées, elles ne seront donc pas réenregistrées dans le fichier d'origine. Il serait impossible d'avoir une page sale soutenue par un fichier en lecture seule. Si la page doit être supprimée de la RAM, elle sera enregistrée dans swap.

Les pages en lecture seule, privées et modifiées, mais dans la plage d'un fichier mappé en mémoire, sont généralement des pages de données qui contiennent des constantes qui doivent être initialisées au moment de l'exécution, mais qui ne changent pas après leur initialisation. Par exemple, ils peuvent contenir des données statiques qui intègrent des pointeurs ; les valeurs du pointeur dépendent de l'adresse à laquelle le programme ou la bibliothèque est mappé, il doit donc être calculé après le démarrage du programme, la page étant en lecture-écriture à ce stade. Une fois les pointeurs calculés, le contenu de la page ne changera jamais dans cette instance du programme, de sorte que la page peut être modifiée en lecture seule. Voir "Hunting Down Dirty Memory Pages" par stosb pour un exemple avec des fragments de code.

Vous pouvez, plus rarement, voir des pages en lecture seule, exécutables, privées, sales ; cela se produit avec certains éditeurs de liens qui mélangent plus librement le code et les données, ou avec une compilation juste-à-temps.


En plus des cas listés par Gilles :

Lorsqu'un processus bifurque, le noyau peut marquer toutes ses pages modifiées en lecture seule, et elles seront partagées entre le parent et l'enfant. Lorsque l'un des processus écrit sur la page, une exception se produit et le noyau copie la page et la marque accessible en écriture. Cela évite le travail de copie de pages qui ne sont finalement pas modifiées à nouveau par l'un ou l'autre processus. (Notez que dans cette situation, les pages sont marquées en lecture seule dans le matériel mais sont connues par le noyau pour être inscriptibles.)


Linux
  1. Un moyen plus rapide de déplacer la page mémoire que mremap() ?

  2. Qu'est-ce qu'une page mappée en mémoire et une page anonyme ?

  3. mmap :le fichier mappé sera-t-il immédiatement chargé en mémoire ?

  4. Pourquoi utiliser shm_open ?

  5. Envoi TCP zéro copie dans l'espace utilisateur de la mémoire mappée dma_mmap_coherent()

Caractères de citation de page d'homme ?

6 raisons pour lesquelles Linux n'a pas plus d'applications

Pourquoi le mappage MAP_GROWSDOWN n'augmente-t-il pas ?

Pourquoi avons-nous 3 types de sélections X dans LINUX ?

Pourquoi mon système n'affiche-t-il que 3,2 Go de RAM alors que j'ai définitivement 4,0 Go

Pourquoi pvremove a-t-il une force en double dans la page de manuel ?