Estoy tratando de envolver mi cabeza alrededor de "fusión", pero para entenderlo primero, he estado tratando de entender los accesos a la memoria.
Por lo que entiendo, la CPU intenta buscar la dirección virtual en el búfer interno de traducción, que indica qué datos hay en la memoria caché de la CPU. Si está allí, inmediatamente lo buscamos. De lo contrario, buscaremos la dirección en la tabla de páginas.
Ahora, desde mi lectura, cada proceso tiene su propia tabla de páginas. Sin embargo, cada proceso también tiene el núcleo asignado en su tabla de páginas.
Presumiblemente, la tabla de páginas también tiene bits de acceso, obviamente no podemos permitir lecturas directamente en el espacio del kernel cuando la CPU está en modo de usuario (creo que esto se llama "ring-3").
Por lo que entiendo de las tablas de páginas, estos bits de acceso se almacenan en los bits más bajos de la dirección. Como las entradas de nuestra página son 4k, quedan muchos bits para almacenar los bits de acceso.
Por lo que he leído sobre el exploit, el problema es que la verificación del acceso se realiza después de recuperar los datos. La razón de esto es por razones de eficiencia, queremos llevar rápidamente los datos a la CPU y solo podemos detectar el error de permiso antes de realizar cambios permanentes. Pero desafortunadamente, hemos afectado la memoria caché de la CPU al realizar una búsqueda de memoria indirecta que se puede detectar mediante ataques de tiempo.
Este esquema podría tener sentido si la búsqueda de la página fuera barata, pero la verificación de acceso es costosa. Pero a mi entender, ese no parece ser el caso.
He leído que la tabla de páginas en una máquina de 64 bits tiene al menos tres capas, lo que significa al menos tres búsquedas de memoria. Esperemos que estos estén en el caché, pero si no lo están, eso significa buscar recursivamente la tabla de páginas para sus propias páginas.
Después de haber hecho todo este trabajo y finalmente encontrar la entrada de la tabla de páginas, cuando cargamos la dirección física de la tabla de la página, también cargamos los bits de acceso. ¿Por qué no verlo ahí? Parece mucho más trivial comprobar el bit de acceso que ya hemos cargado que mezclar con circuitos para tratar con él más adelante.
Obviamente me estoy perdiendo algo acerca de cómo funciona la CPU, pero no puedo averiguar qué. Tenemos que hacer la búsqueda en la tabla de páginas para incluso averiguar qué recuperar, y una vez que hemos tenido ese problema, ¿por qué no solo verificamos el bit de acceso?