¿Por qué las regiones mapeadas en memoria de solo lectura tienen páginas sucias?

8

Ejecutando (por ejemplo) el siguiente comando para obtener la lista de páginas asignadas en memoria:

pmap -x `pidof bash`

Obtuve este resultado: ingrese la descripción de la imagen aquí ¿Por qué algunas páginas de solo lectura están marcadas como "sucias", es decir, escritas que requieren una reescritura? Si son de solo lectura, el proceso no debería poder escribirles ... (En el ejemplo proporcionado, las páginas sucias son siempre de 4 kB, pero encontré otros casos con valores diferentes)

También verifiqué / proc / pid / smaps y esas páginas se describen como "Private Dirty".

RicoRico
fuente

Respuestas:

7

Una página sucia no requiere necesariamente una reescritura. Una página sucia es aquella en la que se escribió desde la última vez que el núcleo la marcó como limpia. Los datos no siempre necesitan guardarse nuevamente en el archivo original.

Las páginas son privadas, no compartidas, por lo que no se guardarán nuevamente en el archivo original. Sería imposible tener una página sucia respaldada por un archivo de solo lectura. Si la página necesita ser eliminada de la RAM, se guardará en el intercambio.

Las páginas que son de solo lectura, privadas y sucias, pero dentro del rango de un archivo mapeado en memoria, generalmente son páginas de datos que contienen constantes que deben inicializarse en tiempo de ejecución, pero que no cambian después de haber sido inicializadas. Por ejemplo, pueden contener datos estáticos que incorporan punteros; los valores del puntero dependen de la dirección en la que se asigna el programa o la biblioteca, por lo que debe calcularse después de que el programa se haya iniciado, con la página siendo leída-escrita en esta etapa. Después de calcular los punteros, el contenido de la página nunca cambiará en esta instancia del programa, por lo que la página se puede cambiar a solo lectura. Consulte "Búsqueda de páginas de memoria sucia" por stosb para ver un ejemplo con fragmentos de código.

Es posible que, más raramente, vea páginas de solo lectura, ejecutables, privadas y sucias; Esto sucede con algunos enlazadores que mezclan código y datos más libremente, o con una compilación justo a tiempo.

Gilles 'SO- deja de ser malvado'
fuente
No lo he verificado, pero sospecho que también puede obtener páginas sucias de solo lectura, ejecutables y privadas con objetos compartidos que no son PIC. Me parece recordar que esa es la razón por la cual los objetos compartidos PIC se han convertido de hecho en un requisito.
Andrew Henle
2

Además de los casos, las listas de Gilles :

Cuando un proceso se bifurca, el núcleo puede marcar todas sus páginas sucias como de solo lectura, y se compartirán entre el padre y el hijo. Cuando uno de los procesos escribe en la página, se producirá una excepción y el núcleo copiará la página y la marcará como editable. Esto ahorra el trabajo de copiar páginas que finalmente no son modificadas nuevamente por ninguno de los procesos. (Tenga en cuenta que en esta situación, las páginas están marcadas como de solo lectura en el hardware, pero el núcleo sabe que se pueden escribir).

Eric Postpischil
fuente