Gestion de la Cache de la CPU

### Vista General de la Caché de la CPU

Para mejorar el rendimiento algunas CPU's de la familia 68k tienen la posibilidad de guardar accesos a memoria en una caché.
La información en Caché siempre es referida usando direcciones lógicas, incluyendo el código de la función que realiza el acceso. Esto significa que los accesos en Modo Usuario y Modo Supervisor crearan diferentes entradas en la Caché (por favor consulte la documentación de Motorola para mas información).

siguiendo con la vista general acerca de las capacidades de uso de Caché en las CPU's 68k:

- 68000 ninguna
- 68010
  - Pre-captura de Instrucciones (Instruction Prefetch)
    pre-captura de dos palabras, registro de decodificación de una palabra
  - Modo de Ciclo (Loop Mode)
    se entra en este modo cuando una instrucción de una palabra es seguida por un DBcc, no ocurrirán mas capturas de instrucciones hasta que el ciclo termine
- 68020
  - Pre-captura de Instrucciones (Instruction Prefetch)
    una palabra larga
  - Caché de Instrucciones
    16 líneas de 16 bytes = 256 bytes
    puede ser activado o congelado usando el CACR
- 68030
  - Pre-captura de Instrucciones (Instruction Prefetch)
    una palabra larga
  - Caché de Instructiones
    16 líneas de 16 bytes = 256 bytes
    puede ser activado o congelado usando el CACR
  - Caché de Datos
    16 líneas de 16 bytes = 256 bytes
    puede ser activado o congelado usando el CACR
    siempre con WriteThrough
    modo Write Allocation seleccionable
- 68040
  - Pre-captura de Instrucciones (Instruction Prefetch)
    una palabra larga
  - Caché de Instrucciones
    256 líneas de 16 bytes = 4096 bytes
    puede ser activado usando el CACR
  - Caché de Datos
    256 líneas de 16 bytes = 4096 bytes
    puede ser activado usando el CACR
    modos CopyBack/WriteThrough seleccionables usando la MMU
- 68060
  - Pre-captura de Instrucciones (Instruction Prefetch)
    una palabra larga
  - Caché de Instrucciones
    512 líneas de 16 bytes = 8192 bytes
    puede ser activado, congelado y reducido a la mitad usando el CACR
  - Caché de Ramificaciones (Branch Cache)
    puede ser activado usando el CACR
    no es afectado por la configuración de la MMU!
  - Superscalar Dispatch
    puede ser activado usando el CACR
  - Caché de Datos
    512 líneas de 16 bytes = 8192 bytes
    puede ser activado, congelado y reducido a la mitad usando el CACR
    modos CopyBack/WriteThrough seleccionables usando la MMU
  - Buffer para Push
    puede ser desactivado usando el PCR
  - Buffer de Almacenamiento (Store Buffer)
    puede ser activado usando el CACR
    Las paginas deben ser NoCacheables Serializadas (preciso).

#### Gestión de la Caché en WHDLoad

La primer cosa importante es comprender que las caches en los 68030..68060 son controladas por el Registro de Control de Caché (Cache Control Register, CACR) y la MMU (asumiendo que WHDLoad usa y controla la MMU)!
En el CACR los caches pueden ser activados o desactivados en forma global. Usando las Paginas individuales de la MMU (4 KByte con WHDLoad) se marcara como deben ser cacheadas.
En el 68030 una pagina de memoria puede ser Cacheable o NoCacheable. En un 68040/68060 puede ser cacheable con WriteThrough, cacheable con CopyBack, NoCacheable (impreciso) o NoCacheable Serializada (preciso).

Si la MMU no esta siendo usada por WHDLoad, el mismo controla solamente el CACR.

#### Configuración de la Caché por Defecto

Por defecto, las áreas de WHDLoad, el Esclavo y ExpMem son marcadas como cacheables con CopyBack. El área BaseMem se marca como NoCacheable, y las Caches de Datos e Instrucciones son activadas en el CACR. Por lo tanto los programas ubicados en el área BaseMem se ejecutan sin Caches, pero WHDLoad y el Esclavo usan las Caches para mejor rendimiento.

#### Control de la Caché por el Programador

Existon dos funciones resload para controlar las Caches: resload_SetCACR y resload_SetCPU. La resload_SetCACR es la rutina históricamente mas vieja y puede ser reemplazada completamente por resload_SetCPU (WHDLoad mapea internamente los argumentos de resload_SetCACR y llama a resload_SetCPU). De todas formas el uso de resload_SetCACR se recomienda para todas aquellas personas que no lo conocen todo acerca de las Caches y su comportamiento en un sistema Amiga. Usando resload_SetCACR las caches de instrucciones y datos pueden ser activadas o desactivadas separadamente. resload_SetCACR solamente afecta a la capacidad de cachear el área BaseMem.

#### Control de la Caché por el Usuario

Si el programador ha hecho un buen trabajo el usuario no debe hacer nada relacionado con las Caches debido a que toda la configuración requerida ha sido hecha por el Esclavo.
Sin embargo puede haber dos razonas para cambiar manualmente la configuración de la Caché. Primero, para hacer que un instalador funcione cuando tiene problemas debido a que se ejecuta demasiado rápido (por ej. creando errores en la salida grafica) y segundo para hacer que un programa instalado se ejecute mas rápidamente.

Para hacer que un programa que ocasiona una caída del sistema funcione la opción NoCache puede ser usada. Esta opción desactiva todas las caches y marca toda la memoria como NoCacheable Serializada (preciso). Si la máquina tiene Memoria Chip de 32 bits aun será mas rápida que una A500 original.

Para hacer que un programa instalado se ejecute mas rápidamente se pueden configurar algunas opciones que habilitaran las Caches. Esta configuración sobreescribirá la del Esclavo. En el 68020 la opción Cache puede configurarse. En un 68030 también la opción DCache puede utilizarse, que incluye también la opción Cache. En un 68060 hay algunas opciones mas: BranchCache, StoreBuffer y SuperScalar. La opción ChipNoCache/S puede mejorar el rendimiento en 68040 y 68060, ver debajo.

#### Posibilidad de Cachear la Memoria Chip

La posibilidad de cachearla puede hacerse no solamente por medio de la CPU (CACR) y la configuración de la MMU sino también mediante hardware externo. La CPU envía una señal al bus si intenta cachear una dirección. Y un hardware externo puede enviar una señal a la CPU (luego de que una dirección ha sido colocada en el bus de direcciones durante un acceso a memoria) indicando que una dirección no debe ser cacheada.
El mecanismo por el cual el hardware envía la señal a la CPU indicando si la memoria es cacheable o no es utilizado en todas (hasta donde yo se) las Amigas y las tarjetas de CPU conteniendo CPU's >= 68030 (debido a que tienen una caché de datos). Toda la Memoria Chip y el Espacio de E/S (CIA/Custom/RTC) que no debe ser cacheado por la caché de datos se ve afectado. Esto es necesario para evitar inconsistencias en la caché, por ejemplo debidas a actividad DMA.
La reacción de la CPU ante un rechazo del hardware sobre el cacheado de un acceso varia entre las diferentes CPU's. En el 68030 no hay ningún impacto en el rendimiento del acceso, los datos simplemente no son cacheados. En el 68040 los accesos de lectura se realizaran a la máxima velocidad pero los accesos de escritura (CopyBack) serán cancelados y reiniciados sin cachear lo cual resultara en un acceso aproximadamente 5 veces mas lento (dependiendo del hardware y la velocidad de la CPU) comparado con un acceso sin cachear. En el 68060 las operaciones de lectura y escritura serán canceladas y reiniciadas. Los accesos de lectura serán aproximadamente 3 veces mas lentos y los de escritura aproximadamente 5 veces mas lentos.
Los problemas mencionados están relacionados con el acceso a datos. Los accesos a instrucciones usualmente no son afectados y son cacheables incluso dentro de la Memoria Chip. Existen algunos (probablemente fallidos) componentes de hardware que no permiten que las instrucciones se cacheen en Memoria Chip. En este tipo de hardware la opción ChipNoCache/S debe ser usada para evitar un enlentecimiento mayor en la velocidad de ejecución debido a que los accesos a instrucciones serán alrededor de 2 veces mas lentos.

Ud. puede comprobar este comportamiento en su máquina ejecutando el Speed.Slave contenido en el directorio `src/memory-speed` del archivo de desarrollo.

#### Alocación de Escritura (Write Allocation)

La Alocación de Escritura controla la gestión de la caché en el 68030 cuando ocurre una pérdida de caché durante una operación de escritura. La Alocación de Escritura debe ser activada cuando partes del programa instalado se ejecuten en Modo Usuario. Si el programa instalado se ejecuta solamente en Modo Supervisor la Alocación de Escritura puede ser desactivada, lo cual brindara una mínima ventaja en el rendimiento.

#### Caché de Ramificaciones (Branch Cache)

La Caché de Ramificaciones solamente esta disponible en el 68060. Es una especie de caché de instrucciones para instrucciones de ramificación. Pero en diferencia con la caché de instrucciones no se ve afectada por la configuración de la MMU! Esto significa que aun cuando la Pagina de memoria apropiada sea marcada como No Cacheable, las instrucciones de ramificación serán cacheadas si la Caché de Ramificaciones esta activada.

Lea el Manual de Usuario de Microprocesadores Motorola para mayor información. Si Ud. tiene correcciones o adiciones a esta pagina por favor contacteme.