¿Qué tan rápido es x86 para configurar el bit de página sucia?
paging (3)
Desde el punto de vista del software, ¿cuál es la latencia entre una instrucción que ensucia una página de memoria y cuando el núcleo marca la página como sucia en la Entrada de tabla de páginas (PTE)?
En otras palabras, si una instrucción ensucia una página, ¿puede la siguiente instrucción leer el PTE y ver el conjunto de bits sucios?
No me importan los ciclos reales transcurridos, solo si hay una ventana visible del software en la que el bit de sucio aún no está configurado. Parece que no puedo encontrar ninguna garantía en los manuales de referencia.
De acuerdo con la página 2033 de este documento , Intel x86 almacena información sobre la tabla de páginas. El texto indica que si el bit sucio se limpia con software, existe la posibilidad de que la CPU aún lo vea igual a 1.
Ahora, para la pregunta: si la CPU almacena en caché el bit sucio, existe la posibilidad de que la actualización a la PTE (página-tabla-entrada) no tenga lugar inmediatamente. Podría ser retrasado por una política de caché de escritura de devolución.
La página 1651 del mismo documento describe la instrucción WBINVD, que vacía los cachés internos. No dice que esto incluye todos los datos almacenados en caché por la CPU.
Del manual de AMD (circa 2005), Volumen 2: Programación del sistema:
5.4 Campos de entrada de tabla de traducción de páginas
...
Dirty (D) Bit. Bit 6.
This bit is only present in the lowest level of the page-translation hierarchy. It indicates whether the pagetranslation table or physical page to which this entry points has been written. The D bit is set to 1 by the processor the first time there is a write to the physical page.
Ídem de Intel (circa 2006), Volumen 3-A: Guía de programación del sistema, Parte 1:
3.7.6 Directorio de páginas y entradas de tablas de páginas
...
Dirty (D) flag, bit 6
Indicates whether a page has been written to when set. (This flag is not used in page-directory entries that point to page tables.) Memory management software typically clears this flag when a page is initially loaded into physical memory. The processor then sets this flag the first time a page is accessed for a write operation.
ACTUALIZACIÓN :
Del último manual de inteligencia (vol 3A, Guía de programación del sistema):
8.1.2.1 Automatic Locking
The operations on which the processor automatically follows the LOCK semantics are as follows:
...
When updating page-directory and page-table entries —
When updating page-directory and page-table entries, the processor uses locked cycles to set the accessed and dirty flag in the page-directory and page-table entries.
Del resto del texto en las secciones 8.1 y 8.2, se deduce que una vez que la CPU establece el bit de succión utilizando la operación bloqueada, las otras CPU deben comenzar a ver el valor actualizado.
Por supuesto, es posible que tenga una condición de carrera porque primero lea el bit sucio como 0 en una CPU (o en uno de sus subprocesos) y luego otra CPU (u otro subproceso en la misma CPU) hace que este bit se establezca en 1, pero eso no es inusual.
En general, las actualizaciones de bits sucios se ordenan con respecto a otras cargas y almacenes, aunque no necesariamente con respecto a los accesos a la memoria WC; en particular, no pueden hacer que se vacíen los búferes de WC. Sin embargo, para garantizar la compatibilidad con futuros procesadores, se debe insertar una operación de serialización antes de leer el bit D.
(Énfasis mío.)