APIC Controlador Avanzado Programable de Interrupciones. El controlador APIC realmente consiste en dos Unidades Funcionales: IOAPIC: Es la unidad directamente asociada con la entrada/salida. Es un añadido opcional a la Interfaz PCI-ISA, la cual ya incorpora un controlador de Interrupciones basado en el 8259. funciones: - Puede trabajar en un entorno monoprocesador y multiprocesador Gestiona interrupciones en un entorno multiprocesador distribuyendo las interrupciones entre los procesadores simétricamente bien de forma estática o bien de forma dinámica. Tiene una latencia de atención a las interrupciones menor debido a la eliminación de los ciclos de reconocimiento de interrupción. Debido al uso de un bus local APIC bus entre ambas unidades funcionales, el proceso de reconocimiento de una interrupción no se realiza al modo estándar por medio de un ciclo especial de bus - Perfecta compatibilidad con el controlador estándar residente en PIIX3. LocalAPIC: Es la unidad directamente asociada con el procesador. funciones: - Gestiona la recepción de interrupciones a través del APIC bus. Maneja interrupciones pendientes, anidamiento de interrupciones, enmascaramiento. Recibe nuevos mensajes del APIC bus y gestiona su atención emitiendo la interrupción hacia el procesador si la nueva interrupción es de mayor prioridad que la que está siendo atendida, reteniéndola si es de menor prioridad o ha sido particularmente enmascarada. - - Se encarga de la gestión de las interrupciones al modo estándar utilizando el así llamado protocolo INTR/INTA/EOI. Esto es, generando o invocando en el procesador un ciclo especial de bus de reconocimiento de interrupciones cuando recibe una señal por la entrada INTR. También atiende y realiza interrupciones interprocesador (interesantes para entablar comunicación directa entre los procesadores). Por último incorpora un timer (también relacionado con las comunicaciones interprocesador) 1 IOAPIC CONSTA DE - 24 entradas de interrupción. - Tabla de 64 bits por entrada de relocalización de interrupciones. Esta tabla consiste en una entrada por cada línea de interrupción, que describe el proceso de atención a esta interrupción: a) Modo de sensibilidad: por nivel/ por flanco. b) Vector de interrupción asignado a esta entrada. c) Nivel de prioridad (observar que ya no existe un nivel de prioridad implícito como en el 8259) d) Procesador de destino (en el caso de entorno multiprocesador, el procesador de destino puede ser uno cualquiera de los dos o uno de ellos en concreto) e) Modo de selección del procesador (entiendo que cuando es indiferente a qué procesador está destinada la interrupción, debe poder hacerse una distribución paritaria de las interrupciones recibidas entre ambos) - Registros programables: Los registros programables son IOAPIC ID: Contiene un identificador de 4 bit necesario para identificarse dentro del APIC bus y debe ser programado antes de que el IOAPIC realice alguna acción con el APIC bus. (Simultáneamente con éste se escribe el ID de la unidad I/O cargándose el mismo dato en ambas) IOAPIC VER: Su contenido identifica la versión hardware del chip lo que permite al software adaptarse dinámicamente a posibles modificaciones. (También proporciona este registro el número máximo de entrada que tiene la tabla de redirección de I/O) IOAPIC ARB: Contiene la prioridad para este chip dentro del bus APIC, se carga cuando se escribe en el IOAPIC ID. El bus APIC es secuencial y utiliza un método de arbitraje de un solo hilo y una prioridad rotatoria. El ganador del último acceso al bus es el que actualmente tiene la menor posibilidad de volver a tomarlo. Las prioridades rotan sólo en el caso de que el mensaje haya sido enviado con éxito. (Aunque al parecer hay un tipo de mensajes de baja prioridad que hace que las prioridades roten incluso si el mensaje ha sido rechazado - un chequeo erróneo p.ej.) IOREDTBL[23:0]: Existe un registro por cada línea de interrupción y en el se puede especificar cómo se va a disparar la interrupción (nivel o flanco), qué vector de interrupción va a invocar en el procesador, qué nivel de prioridad tiene con respecto al resto de las líneas de interrupción, en qué procesador se va a invocar y cómo se va a hacer llegar al procesador la información de qué interrupción se ha disparado. Cuando se dispara una interrupción, se inhibe de nuevos disparos a esta interrupción en tanto no se haya enviado el mensaje correspondiente, este haya sido aceptado por uno de los dos procesadores y el bit correspondiente en el registro IRR (que tiene el mismo nombre y significado que en el 8250) ha cambiado de 0 a 1 (al parecer si el bit de IRR correspondiente a una interrupción ya está a 1 indica que la interrupción aún está pendiente de resolver en el procesador destino) Acceso a los registros. No se puede acceder a los registros directamente. Para poder programar el IOAPIC se disponen de dos registros de acceso: IO Register Select IO Windows (D/I=0) (D/I=1) 2 Estos dos registros están localizados en el espacio de memoria de los procesadores. En la interfaz PCIISA PIIX3 existe un registros (APICBASE) que contiene la dirección base de memoria a partir de la cual están localizados IORegSel y IOWin. Modificando este registro se puede localizar al IOAPIC en cualquier posición de la memoria. El IO Register Select, o registro de selección de ahora en adelante, indicará a cual de los registros del IOAPIC deseamos acceder. Existe un código (8 bit como máximo) asociado a cada uno de los registros. Una vez señalado a qué registro deseamos acceder podemos leer o modificar su contenido leyendo o escribiendo en el registro IO Windows. Este modo de proceder para acceder a los registros se llama modo indexado y como se puede observar ahorra muchas direcciones del espacio de memoria o entrada/ salida (estamos utilizando dos direcciones para ubicar un dispositivo en memoria para acceder realmente a 27 registros) Todos los accesos a los registros del IOAPIC han de hacerse con tamaño de datos 32 (doble palabra), aunque en el caso de los accesos a IORegSel sólo sean relevantes los 8 bits menos significativos. 3 4