memoria cache assembly x86 cpu-cache

assembly - cache - ¿Para qué sirve la instrucción INVD?



l1 cache (1)

Excelente pregunta!

Un caso de uso para una instrucción tan invd como invd es en el invd especializado o muy temprano de arranque, como cuando todavía no se ha verificado la presencia o ausencia de RAM. Dado que es posible que no sepamos si la RAM está presente, su tamaño, o incluso si algunas partes de la misma funcionan correctamente, o si no queremos confiar en ella, a veces es útil para la CPU programar parte de su propio caché para que funcione como RAM y usarlo como tal. Esto se llama Cache-as-RAM (CAR) . Durante la configuración de CAR, mientras usa CAR, y durante el desmontaje del modo CAR, el kernel debe asegurarse de que nunca se escriba nada de esa memoria caché en la memoria.

Caché como RAM

Entrando en el carro

Para configurar el CAR, la CPU debe configurarse en el modo de caché sin relleno y debe designar el rango de memoria que se utilizará para el CAR como Escritura de escritura . Esto se puede hacer mediante los siguientes pasos:

  1. Configure un MTRR (Registro de rango de tipos de memoria) para designar una porción de memoria como WB (Write-Back) .
  2. invd todo el caché, evitando que se escriba cualquier escritura en caché y causando el caos.
  3. Establezca el modo de caché en el Modo de caché normal ( cr0.CD=0 ).
  4. Mientras se encuentra en el Modo de caché normal , "toque" todas las clases de la duración de la memoria para usarlas como CAR (CAR) al leerlo, y así llenar el caché con él. Rellenar cachelines solo se puede hacer en el modo de caché normal .
  5. Establezca el modo de almacenamiento en caché en Modo de caché sin relleno ( cr0.CD=1 ).

Usando CAR

La motivación para configurar CAR es que una vez configurados, todos los accesos (lectura / escritura) dentro de la región CAR alcanzarán la memoria caché y no la RAM, aunque el contenido de la memoria caché será direccionable y actuará como RAM. Por lo tanto, en lugar de escribir el código del ensamblador que solo utiliza registros, ahora se puede usar el código C normal, siempre que la pila y las variables locales / globales a las que accede estén restringidas dentro de la región CAR.

Saliendo de CAR

Cuando se sale de CAR, sería malo que todas las escrituras de memoria incurridas en este "pseudo-RAM" salgan repentinamente de la caché y eliminen el contenido real en la misma dirección en la RAM. Por lo tanto, cuando se invd CAR, una vez invd se usa invd para eliminar completamente los contenidos de la región CAR, y luego se configura el Modo de caché normal .

Intel 80486 Manual

Intel aludió al uso de la memoria caché como RAM en el Manual de referencia del programador del microprocesador i486 . El Intel 80486 fue la CPU que introdujo por primera vez la instrucción invd . La sección 12.2 lee:

12.2 FUNCIONAMIENTO DEL CACHE INTERNO

El software controla el modo de funcionamiento de la caché. El almacenamiento en caché se puede habilitar (su estado después de la reinicialización de reinicio), el almacenamiento en caché se puede desactivar mientras existen líneas de caché válidas (un modo en el que el caché actúa como un RAM interno rápido) o el almacenamiento en caché se puede desactivar por completo.

Se deben seguir las precauciones al deshabilitar el caché. Cuando el CD se establece en 1, el procesador i486 no leerá la memoria externa si todavía hay una copia en el caché. Cuando NW se establece en 1, el procesador i486 no escribirá en la memoria externa si los datos están en el caché. Esto significa que se pueden desarrollar datos obsoletos en la memoria caché de la CPU i486. Estos datos obsoletos no se escribirán en la memoria externa si NW se establece más tarde en 0 o esa línea de caché se sobrescribe más tarde como resultado de una falta de caché. En general, el caché se debe vaciar cuando está deshabilitado.

Es posible congelar los datos en el caché al cargarlos usando registros de prueba mientras CD y NW están configurados. Esto es útil para proporcionar aciertos de caché garantizados para datos y códigos de interrupción de tiempo crítico.

Tenga en cuenta que todos los segmentos deben comenzar en límites de 16 bytes para permitir que los programas alineen el código / los datos en las líneas de caché.

Ejemplos de uso

Libreboot tiene una plataforma deslizante que presenta su implementación de CAR , que describe el procedimiento anterior. La instrucción invd se usa en la diapositiva 21.

AMD lo llama Cache-as-general-storage en §2.3.3: Uso de L2 Cache como almacenamiento general durante el arranque .

Otros usos

En ciertas situaciones que involucran la incoherencia de la memoria caché debido al hardware DMA (Acceso directo a la memoria) , invd también puede resultar útil.

El x86 INVD invalida la jerarquía de caché sin escribir los contenidos de nuevo en la memoria, aparentemente.

Tengo curiosidad, ¿de qué sirve esa instrucción? Dado que uno tiene muy poco control sobre qué datos pueden estar en los distintos niveles de caché y aún menos control sobre lo que ya se ha vaciado de forma asíncrona, parece ser poco más que una forma de asegurarse de que simplemente no sepa qué datos se lleva a cabo en la memoria más.