domingo, 4 de enero de 2009

Controlador de interrupciones programable avanzado (APIC)

El APIC proporciona dos funciones principales al procesador: La primera es que recibe interrupciones desde los pines de interrupciones del procesador, desde fuentes internas y desde un APIC de E/S externo (o otros controladores de interrupciones externos) y las manda al núcleo del procesador para su administración; la segunda es que en sistemas con múltiples procesadores (MP), se mandan y se reciben mensajes de interrupciones entre procesadores (IPI) hacia y desde otros procesadores lógicos en el bus del sistema. Los mensajes IPI se usan para distribuir interrupciones a lo largo de los procesadores en el sistema o para ejecutar funciones grandes en el sistema.
El APIC de E/S externo es parte del chipset del sistema Intel. Su función principal es recibir eventos de interrupciones externos desde el sistema y desde sus dispositivos E/S asociados y transmitirlos al APIC local como mensajes de interrupción. En sistemas MP, el APIC de E/S proporciona un mecanismo para distribuír las interrupciones externas a los APICs locales de los procesadores seleccionados o grupo de procesadores del bus del sistema.
Cada APIC local consiste en un conjunto de registros APIC y hardware asociado que controla la entrega de las interrupciones al núcleo del procesador y puede ser leída y escrita usando la instrucción MOV. Los APICs locales también pueden recibir interrupciones de las generadas en el temporizador APIC, de las de los contadores de monitorización del rendimiento, de las del sensor térmico y de las de error interno del APIC.
En los procesadores de la familia P6 y en los Pentium, el APIC de E/S y el local se comunica a través de un bus exclusivo para eso. Este bus y los mensajes APIC son invisibles al software y no están catheros wireless portátil fujitsuatalogados como arquitectónicos. En los procesadores actuales (Pentium 4 o Intel Xeon), el APIC de E/S y el local se comunican a través del bus del sistema. El APIC de E/S manda peticiones de interrupción al procesador en el bus del sistema a través del puente hardware que es parte del chipset Intel. El puente genera mensajes de interrupción que van al APIC local. Los IPIs entre APICs locales también se transmiten directamente a través del bus del sistema.
La presencia del APIC puede ser detectada usando la instrucción CPUID. Activar o desactivar el APIC local se puede hacer de dos formas: Usando la bandera global de activación/desactivación del APIC en el MSR IA32_APIC_BASE, o usando la bandera de activación/desactivación de software APIC en el registro de vectores falso de interrupciones. El estado y la posición del APIC local está contenido en el MSR IA32_APIC_BASE. Al encender, el hardware del sistema asigna un ID APIC único a cada APIC local del bus del sistema (en sistemas nuevos) o del bus APIC (en sistemas más antiguos). La asignación está basada en la topología del sistema e incluye posiciones de sockets codificadas y información de cluster. En sistemas MP, el ID APIC local es usado también como un ID de procesador por la BIOS y por el sistema operativo. Hay procesadores que permiten la modificación del ID APIC por software. Cuando se enciende o se resetea, el estado del APIC local y sus registros son los siguientes:
- Los registros IRR, ISR, TMR, ICR, LDR, y TPR están a cero
- Se reinician los registros contadores de tiempo iniciales y actuales
- Se divide el registro de configuración
- Se pone el registro DFR todo a 1
- Se pone el registro LVT a cero, excepto los bits de máscara que se ponen a 1
- El registro de la versión del APIC no le afecta
- El registro local ID APIC se establece a una APIC ID única.
- El registro de vectores spurious-interrupt se inicializa a 000000FFH. Si se pone el bit 8 a cero, se desactiva el APIC local.
- Si el procesador es el único del sistema o es el BSP en un sistema MP, el APIC local responderá normalmente a los mensajes INT y NMI, a señales INIT# y STPCLK#. Para identificar la versión del APIC local, el sistema contiene un registro hardware que lo contiene. El software puede utilizarlo para identificarlo, y actuar en consecuencia.
La arquitectura x2APIC extiende la anterior (xAPIC) de manera retrocompatible (si está programado para usar xAPIC también funciona igual en x2APIC) y proporciona extensiones para futuras innovaciones de plataformas Intel.
- Conserva todos los elementos claves de compatibilidad con la arquitectura anterior (modos, prioridades, tipos y fuentes de interrupciones)
- Proporciona extensiones para escalar el direccionamiento del procesador para los modos lógico y físico de destino
- Añade nuevas funciones para aumentar el rendimiento de la entrega de las interrupciones
- Reduce la complejidad del modo de destino lógico de entrega de las interrupciones en plataformas de arquitecturas basadas en links
- Usa la interfaz de programación MSR para acceder a los registros APIS en el modo x2APIC en vez de las interfaces mapeadas en memoria. Esto último está soportado si se opera en el modo xAPIC. La x2APIC se detecta usando la instrucción CPUID.
Las facilidades que proporciona el APIC local para administrar interrupciones locales son:
- La tabla de vectores local
- Vectores de interrupciones válidos
- Administración de errores
- Temporizador APIC
- Aprobación de interrupciones locales
La facilidad principal del APIC local para emitir IPIs es el registro de comandos de interrupción (ICR). Este registro de 64 bits se puede utilizar para mandar una interrupción a otro procesador, para permitir a un procesador remitir una interrupción recibida pero que no sirve a otro procesador, para indicar al procesador como interrumpirse a sí mismo, o para entregar IPIs especiales (como el mensaje IPI de start-up) a otro procesador. Es importante recalcar que las interrupciones generadas se mandan a través del bus del sistema (en sistemas mas actuales) o a través del bus APIC (en sistemas mas antiguos). El destino de un IPI puede ser uno, todos, o un grupo de procesadores del bus del sistema. El que envía el IPI especifica el destino de un IPI en determinados campos de los registros ICR, LDR y DFR. En el modo de destino físico, el procesador de destino se especifica en su ID APIC local. En el modo de destino lógico, la IPI de destino se especifica usando una dirección de destino de mensajes de 8 bits (MDA), que forma parte del campo de destino del ICR. Después de recibir un mensaje IPI que fue enviado usando el modo de destino lógico, un APIC local compara el MDA del mensaje con los valores en sus LDR y DFR para determinar si debe aceptar y administrar el IPI. En el modo x2APIC, el LDR se incrementa a 32 bits. Es un registro de sólo lectura para el software del sistema. Este valor de 32 bits se refiere como el 'ID x2APIC lógico', y el sistema tiene que acceder a él a través de la instrucción RDMSR leyendo el ASR en la dirección 80DH. Los SELF IPIs se usan extensivamente por determinado software del sistema. La x2APIC introduce un nuevo interfaz de registro. Este nuevo registro está dedicado a enviar self-IPIs intentando activar un path mas optimizado para enviar self-IPIs.
Cuando se mandan varios IPI y mensajes de interrupción desde los APICs locales y desde los APIC de E/S a través del bus del sistema (o a través del bus APIC), el orden en el que se mandan y se administran se determina a través del arbitraje del bus. Para los sistemas nuevos, el APIC local y el de E/S usan el mecanismo de arbitraje definido para el bus del sistema para determinar el orden en el cual los IPIs serán atendidos. Este mecanismo no se puede controlar por software. Los sistemas antiguos usan un mecanismo de arbitraje basado en APIC para determinar el orden.
Cuando se recibe una interrupción, la manera de tratarla es diferente dependiendo de cada procesador. Con los mas nuevos (Pentium 4 y Intel Xeon) el APIC local administra las interrupciones locales, los mensajes de interrupción y los IPIs recibidos de esta manera:
1- determina si hay destino específico o no. Si hay, acepta el mensaje; si no, no lo acepta.
2- Si el APIC local determina que es el destino designado para la interrupción y si la petición de interrupción es un NMI, SMI, INIT, ExtINT, o un SIPI, la interrupción se envía directamente al núcleo del procesador para su administración.
3- Si no es ninguno de los anteriores, el APIC local establece el bit apropiado en el IRR.
4- Cuando hay interrupciones pendientes en el IRR y en el ISR, el APIC local los envía al procesador uno a uno, basándose en la prioridad de cada uno de ellos.
5- Cuando se completa la rutina de administración, se indica con una instrucción en el código de administrador de instrucciónes que escribe al registro end-of-interrupction (EOI) en el APIC local. Esto provoca que el APIC local elimine la interrupción de su cola ISR y mande un mensaje al bus indicando que la administración de interrupción se ha completado.
En los procesadores mas antiguos (Pentium y la familia P6), el proceso es parecido.
Puede ocurrir una situación especial cuando un procesador aumenta su prioridad de tareas hasta un nivel igual o mayor a la interrupción. Si al mismo tiempo se establece el ciclo INTA, la interrupción será enmascarada (programada por software), el APIC local entregará un vector spurious-interrupt. Por lo tanto, el administrador para este vector retornará sin EOI.

No hay comentarios: