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

8

Exécution (par exemple) de la commande suivante pour obtenir la liste des pages mappées en mémoire:

pmap -x `pidof bash`

J'ai obtenu cette sortie: entrez la description de l'image ici Pourquoi certaines pages en lecture seule sont marquées comme "sales", c'est-à-dire écrites qui nécessitent une réécriture? S'ils sont en lecture seule, le processus ne devrait pas pouvoir leur écrire ... (Dans l'exemple fourni, les pages sales font toujours 4 Ko, mais j'ai trouvé d'autres cas avec des valeurs différentes)

J'ai aussi vérifié le / proc / pid / smaps et que les pages sont décrites comme "Private Dirty".

RicoRico
la source

Réponses:

7

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. Il n'est pas toujours nécessaire de sauvegarder les données dans le fichier d'origine.

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

Les pages qui sont en lecture seule, privées et sales, 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 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, la page peut donc être modifiée en lecture seule. Voir «Recherche de pages de mémoire sales» par stosb pour un exemple avec des fragments de code.

Vous pouvez, plus rarement, voir des pages en lecture seule, exécutables, privées et 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.

Gilles 'SO- arrête d'être méchant'
la source
Je ne l'ai pas vérifié, mais je pense que vous pouvez également obtenir des pages sales privées exécutables en lecture seule avec des objets partagés non PIC. Il me semble que c'est la raison pour laquelle les objets partagés PIC sont devenus de facto nécessaires.
Andrew Henle
2

En plus des cas, Gilles énumère:

Lorsqu'un processus bifurque, le noyau peut marquer toutes ses pages sales comme étant en lecture seule, et elles seront partagées entre le parent et l'enfant. Lorsqu'un des processus écrit sur la page, une exception se produit et le noyau copie la page et la marque en écriture. Cela permet d'économiser le travail de copie des 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 reconnues par le noyau comme étant accessibles en écriture.)

Eric Postpischil
la source