2.4 Interrupciones
§1 Sinopsis
Una petición de interrupción IRQ ("Interrupt Request") es una señal que se origina en un dispositivo hardware (por ejemplo, un periférico), para indicar al procesador que algo requiere su atención inmediata; se solicita al procesador que suspenda lo que está haciendo para atender la petición.
Hemos señalado ( H2) que las interrupciones juegan un papel fundamental, en especial en la operación de dispositivos E/S, ya que les permite enviar estas peticiones a la UCP. Sin ellas el sistema debería chequear constantemente los dispositivos para comprobar su actividad, pero las interrupciones permiten que los dispositivos puedan permanecer en silencio hasta el momento que requieren atención del procesador. ¿Podría figurarse un sistema telefónico donde hubiera que levantar periódicamente el auricular para comprobar si alguien nos llama? [4].
Nota: Veremos que estas peticiones pueden ser generadas no solo por dispositivos hardware, también por los programas, e incluso en circunstancias especiales (errores generalmente) por el propio procesador. Resumimos que existen tres posibles orígenes de estas peticiones: Hardware, Software, y del procesador.
§2 Principio de funcionamiento
Cuando un dispositivo reclama atención del procesador es para que este haga algo. Este "algo" es lo que se conoce como servicio; controlador o gestor de la interrupción, ISR ("Interrupt service routine"). En cualquier caso se trata siempre de ejecutar un programa situado en algún lugar de la memoria RAM o en la ROM-BIOS. Ocurre que las direcciones de inicio de estos programas, que se conocen como vectores de interrupción, se copian en una tabla de 1024 Bytes que se carga al principio de la memoria de usuario (direcciones 0000h a 0400h) durante el proceso de inicio del sistema ( H4), razón por la cual estas rutinas se conocen también como servicios del BIOS.
La citada tabla se denomina tabla de vectores de interrupción IDT ("Interrupt Description Table") y en sus 1024 bytes pueden almacenarse 256 vectores de 4 bytes. Es decir, los vectores de interrupción son punteros de 32 bits, numerados de 0 a 255, que señalan las direcciones donde comienza la rutina que atiende la interrupción [3].
Como veremos a continuación, el diseño del PC solo permite 16 interrupciones distintas, por lo que puede parecer extraño que se hayan previsto 256 vectores para atenderlas. La razón es que además de los servicios del BIOS propiamente dichos, se cargan las direcciones de inicio de otras rutinas del Sistema Operativo, los denominados servicios del Sistema ( Servicios del Sistema). Incluso es posible cargar direcciones para rutinas específicas de usuario.
Al diseñar el 8088, Intel estableció un reparto de estos vectores, reservando los 5 primeros para uso interno del procesador (precisamente para atender las excepciones ). A continuación estableció otros 27 de uso reservado, aunque no desveló ningún uso específico para algunos de ellos. A partir de aquí, los vectores 32 a 255 estaban disponibles. El esquema resultante se muestra en la tabla adjunta.
Vector |
||
Dec. |
Hex |
Uso |
0 |
0 |
Error: División por cero |
1 |
1 |
Excepciones para depuración (ejecución paso a paso) |
2 |
2 |
Interrupción no enmascarable |
3 |
3 |
Punto de ruptura interrupción (Instrucción INT) |
4 |
4 |
Desbordamiento ("Overflow"). Utilizado cuando un cálculo aritmético se desborda. Instrucción INTO |
5 |
5 |
(reservado) |
6 |
6 |
Código de instrucción no válido |
7 |
7 |
Coprocesador no disponible |
8 |
8 |
Fallo doble |
9 |
9 |
(reservado -Rutina de atención del Teclado-) |
10 |
A |
TSS no válido |
11 |
B |
Segmento no disponible |
12 |
C |
Excepción de pila |
13 |
D |
Protección general |
14 |
E |
Fallo de página |
15 |
F |
(reservado) |
16 |
1A |
Error de coprocesador |
17-31 |
1B-1F | (reservado) |
32-255 |
20-FF | Disponibles para interrupciones enmascarables |
Sin embargo, aunque teóricamente las interrupciones 0 a 31 estaban restringidas, IBM y Microsoft utilizaron algunas de ellas sin respetar las indicaciones de Intel. En concreto, IBM y Microsoft utilizaron algunas para los servicios BIOS ( H2.4.1). Es significativo que, a pesar de haber sufrido ampliaciones, la especificación inicial se mantiene para las 31 interrupciones iniciales. Lo que hace posible que pueda cargarse un Sistema PC-DOS 1.0 en una máquina Pentium.
El "modus operandi" es como sigue: Cuando se recibe la petición de interrupción, el procesador termina la instrucción que está ejecutando; guarda el contenido de los registros; deshabilita el sistema de interrupciones; ejecuta el "servicio", y vuelve a su punto de ejecución. El servicio suele terminar con una instrucción IRET ("Interrupt Return") que restituye el contenido de los registros y vuelve a habilitar el sistema de interrupciones. En cierto sentido, el proceso es similar al que ocurre cuando aparece la invocación de una función en el código de un programa ( 4.4.6b).
En el párrafo anterior hemos indicado someramente el proceso cuando "se recibe" una petición, pero cabe una cuestión: ¿Como se recibe la petición?. Hemos adelantado que estas peticiones pueden ser generadas desde el software o incluso por el procesador, lo que nos conduce a que en realidad las únicas que deben recibirse (desde el exterior) son las que denominadas interrupciones hardware (que se originan en dispositivos externos al procesador). Antes de describir brevemente el camino hasta que la solicitud es recibida por la UCP, permitidme adelantar que para su gestión existen tres tipos de elementos de soporte:
- Ciertas líneas específicas (IRQ's) en el bus de control
- El controlador de interrupciones (PIC). Un procesador específico que realiza cierta elaboración previa de las peticiones antes de entregar la señal a la UCP .
- Ciertas patillas específicas en el procesador .
El resumen del proceso es como sigue: Un periférico, tarjeta o dispositivo necesita atención; a tal efecto pone en tensión baja una de las líneas IRQ del bus de control (que le había sido asignada). La señal es recogida por el PIC, que la procesa, la clasifica, y envía una señal a una de las patillas del procesador. A continuación el procesador se da por notificado y pregunta que tipo de excepción debe atender. Como respuesta, PIC asigna un número de servicio (0-256) en forma de un octeto que es colocado en el bus de datos, con lo que estamos en el punto inicial del proceso.
Para la asignación del número de servicio a partir de una de las 16 solicitudes de las IRQ, el PIC realiza un cierto proceso ("Interrupt Handling Routine") a partir de los datos de programación iniciales y del estado actual del propio sistema de interrupciones. Por ejemplo, puede estar procesándose el servicio de una interrupción, pero la rutina esta suspendida momentáneamente porque se ha solicitado otra interrupción de prioridad más alta, o tal vez se recibe otra interrupción del mismo periférico antes de haber atendido la anterior, Etc.
§3 Líneas de petición de interrupción
El bus de control dispone de líneas específicas para el sistema de interrupciones ( H2). En el PC XT existen 8, numeradas del 0 al 7, aunque las dos primeras están asignadas al temporizador y al teclado, con lo que solo quedaban 6 líneas para otros dispositivos, que aparecen como tales en el bus de control (IRQ2- IRQ7). A partir del modelo AT se añadieron otras 8 líneas, numeradas del 8 al 15, mediante un segundo procesador PIC , aunque la tecnología empleada exigió colgarlo de la línea IRQ2, de forma que esta línea se dedica a atender las interrupciones del segundo controlador a través de la línea 9 de este último, y la línea 8 se dedicó al reloj de tiempo real, un dispositivo que no existía en los modelos XT.
Aunque internamente se manejan 16 líneas, no todas tienen contacto en los zócalos del bus externo; Son las marcadas con asterisco (*) en la tabla que sigue . La razón de esta ausencia en los zócalos de conexión es que son de asignación fija, y nadie más que ciertos dispositivos instalado en la propia placa tiene que utilizarlas. En concreto la línea NMI está asignada al mecanismo de control de paridad de la memoria; la línea 0 está asignada al cronómetro del sistema ( H2) y la línea 1 al chip que controla el teclado (dispositivos que pueden requerir atención urgente por parte del procesador). Es costumbre denominar IRQx a las que tienen prolongación en el bus.
Teóricamente las restantes líneas podrían ser asignadas a cualquier nuevo dispositivo, pero en la práctica algunas están reservadas a dispositivos estándar. Por ejemplo, IRQ3 está casi siempre asignado al puerto serie COM2 y IRQ4 a COM1; IRQ6 al controlador estándar de disquetes y IRQ7 al puerto de impresora LPT1. La tabla 1 muestra las asignaciones clásicas para el XT y el AT.
Tabla-1 |
|||
Nombre |
Int (hex) |
XT: Descripción | AT: Descripción |
NMI | --- | Paridad* | Paridad* |
0 | 08 | Temporizador* | Temporizador* |
1 | 09 | Teclado* | Teclado* |
IRQ2 | 0A | Reservado | Interrupciones 8 a 15 (PIC#2) |
IRQ3 | 0B | Puertos serie COM2/COM4 | Puerto serie COM2/COM4 |
IRQ4 | 0C | Puertos serie COM1/COM3 | Puerto serie COM1/COM3 |
IRQ5 | 0D | Disco duro | Impresora secundaria LPT2 |
IRQ6 | 0E | Disquete | Disquete |
IRQ7 | 0F | Impresora primaria LPT1 | Impresora primaria LPT1 [8] |
8 | 70 | No aplicable | Reloj de tiempo real* |
9 | 71 | No aplicable | Redirigido a IRQ2* |
IRQ10 | 72 | No aplicable | no asignado |
IRQ11 | 73 | No aplicable | no asignado |
IRQ12 | 74 | No aplicable | Ratón PS2 |
13 | 75 | No aplicable | Coprocesador 80287* |
IRQ14 | 76 | No aplicable | Contr. disco IDE primario |
IRQ15 | 77 | No aplicable | Contr. disco IDE secundario |
Cuando se instala un dispositivo E/S que puede necesitar atención del procesador, debe asignársele una IRQ adecuada. Dicho en otras palabras, cuando requiera atención debe enviar una señal en la línea IRQ especificada. Inicialmente esta asignación se efectuaba de forma manual, por medio de puentes ("Jumpers") en la placa o dispositivo, pero actualmente esta selección puede hacerse por software. Los dispositivos son de enchufar y usar PnP ("Plug and play" ).
§3.1 A continuación se nuestra la distribución de líneas IRQ en un ordenador típico (AT), bajo Windows-98SE [7].
Nota: Los usuarios de Windows 98 pueden comprobar la asignación de IRQ's a los diversos dispositivos del sistema mediante el programa msinfo032.exe. Generalmente en C:\Archivos de programa\Archivos comunes\Microsoft Shared\MSINFO
IRQ Utilización
0 Cronómetro del sistema
1 Teclado estándar de 101/102 teclas o MS Natural Keyboard
2 Controlador programable de interrupciones
3 Puerto de infrarrojos rápidos ThinkPad de IBM
4 Puerto de comunicaciones (COM1)
5 Crystal SoundFusion(tm) Game Device
6 Controlador estándar de disquetes
7 Puerto de impresora (LPT1)
8 Sistema CMOS/reloj en tiempo real
9 (libre)
10 (libre)
11 Marcador IRQ para manejo de PCI
11 Marcador IRQ para manejo de PCI
11 Marcador IRQ para manejo de PCI
11 Marcador IRQ para manejo de PCI
11 Controlador universal de host Intel 82371AB/EB PCI a USB
11 Crystal SoundFusion(tm) PCI Audio Accelerator
11 Lucent Win Modem
11 Intel(R) PRO/100 SP Mobile Combo Adapter
11 Texas Instruments PCI-1450 CardBus Controller
11 Texas Instruments PCI-1450 CardBus Controller
11 RAGE MOBILITY-M AGP (English)
12 Puerto de mouse compatible con PS/2
13 Procesador de datos numéricos
14 Controlador estándar para disco duro Bus Mastering IDE
15 Controlador estándar para disco duro Bus Mastering IDE
§3.2 Interrupciones en el ordenador anterior bajo Linux:
Nota: Los usuarios de Linux pueden consultar las interrupciones utilizadas en el sistema en el fichero /proc/interrupts mediante el comando cat /proc/interrupts. También mediante la utilidad dmesg en la forma dmesg | grep -i irq
IRQ Utilización
CPU0
0: 3407670 XT-PIC timer
1: 7149 XT-PIC keyboard
2:
0 XT-PIC cascade
8:
2 XT-PIC rtc
9: 1461 XT-PIC acpi
11: 2508 XT-PIC usb-uhci, Texas Instruments PCI1450, Texas Instruments PCI1450 (#2), CS46XX
12: 74331 XT-PIC PS/2 Mouse
14: 90666 XT-PIC ide0
15: 50966
XT-PIC ide1
NMI: 0
LOC: 0
ERR: 0
MIS: 0
§4 Controlador PIC
Las peticiones hardware de interrupción del PC son manejadas por un chip, conocido como PIC#1 ("Programmable Interrupt Controller"). Originariamente era un 8259A, que puede manejar 8 peticiones (IRQ0/IRQ7), pero pronto se hizo evidente que eran un número excesivamente corto, por lo que en 1984 IBM añadió un segundo controlador PIC#2 en el modelo AT, que podía manejar las peticiones IRQ8 a IRQ15, aunque las interrupciones utilizables resultantes no fuesen de 16 como cabría suponer, por las razones apuntadas en el párrafo anterior.
§4.1 Nivel de prioridad
El PIC dispone de 16 niveles de prioridad, numerados del 0 al 15, de forma que los de número más bajo se atienden antes que los de número más alto. La asignación a cada nivel es como sigue:
Nivel | Asign. | Nivel | Asign. | Nivel | Asign. | Nivel | Asign. |
0 | NMI | 1 | IRQ0 | 2 | IRQ1 | 3 | IRQ8 |
4 | IRQ9 | 5 | IRQ10 | 6 | IRQ11 | 7 | IRQ12 |
8 | IRQ13 | 9 | IRQ14 | 10 | IRQ15 | 11 | IRQ3 |
12 | IRQ4 | 13 | IRQ5 | 14 | IRQ6 | 15 | IRQ7 |
Como puede verse, la prioridad más alta se asigna a las interrupciones no enmascarables (NMI ), a las que nos referimos más adelante. A continuación se atienden IRQ0 e IRQ1; asignadas como hemos visto al cronómetro del sistema y al teclado (el cronómetro no puede ser interrumpido por nadie porque perdería la hora). Después se atienden las peticiones IRQ8 a IRQ15 del controlador esclavo, que hereda la prioridad de IRQ2 de la que está colgado (en realidad no existe IRQ2). A continuación se atienden las IRQ3 a IRQ7 de PIC#1. Las peticiones de prioridad más baja son las del controlador estándar de disquetes (IRQ6) y las del puerto de impresora LPT1 (IRQ7).
Físicamente, el 8259A es un chip de 28 patillas, 8 de las cuales conectan con las líneas IRQ0-IRQ7; ocho para el bus de datos (D0-D7), una entrada INTA ("Interrupt Acknowledge") y una salida INTR ("Interrupt Request"). Aparte de otras auxiliares, como tensión de alimentación y masa. Como veremos a continuación , cuando el 8259A recibe una señal IRQ, activa la señal INTR que es recibida por el procesador. Cuando este responde con un INTA, pone en el bus de datos un byte en el rango 0/256, que es identificado a su vez por el procesador como un número de interrupción.
Desde el punto de vista lógico, PIC #1 responde a las direcciones 020h-021h, mientras que PIC#2 lo hace en 0A0h-0A1h. Cada PIC dispone de tres registros de 1 byte; IRR, ISR e IMR, que en conjunto gobiernan las decisiones del dispositivo:
Registro de solicitud de interrupción IRR ("Interrupt Request Register"). Cada bit de este registro controla el estado de una línea IRQ. Cuando se detecta una petición en una de estas líneas, el bit correspondiente del IRR es pueto a 1.
Registro de interrupciones activas ISR ("In Service Register"). Cada bit indica si ya existe una interrupción activada en la línea correspondiente.
Registro de máscara de interrupciones IMR ("Interrupt Mask Register"). También aquí cada bit corresponde a una línea IRQ, e indica si esta permitida un interrupción de ese nivel en ese momento.
El PIC es un dispositivo complejo que realiza varias tareas; a continuación se muestra un resumen de ellas:
- Puesto que existen muchos dispositivos que pueden solicitar interrupciones, es responsabilidad del PIC priorizarlas según el esquema indicado en el punto anterior, cuando existen varias IRQ's simultáneas [5].
- Después de enviar una solicitud de interrupción y el procesador contesta que está listo para atenderla, debe enviar un número de interrupción (número de vector).
- Mantiene un registro de que se está procesando una interrupción. Cuando esto sucede, no envía más peticiones del mismo dispositivo al procesador hasta que este le responde con una señal EOI ("End Of Interrupt"), indicando que la rutina de servicio precedente ha terminado, o puede aceptar otra interrupción.
- Puede enmascarar de forma selectiva cualquiera de las 8 IRQ's que tiene conectadas (como se verá más adelante, es la única forma de enmascarar las interrupciones no enmascarables).
El 8259A tiene distintos modos de operación, uno de los cuales es el utilizado por los diseñadores del PC; esta selección se realiza vía software en los momentos iniciales. También se decide en este momento que número de interrupción deberá devolver el PIC en respuesta a las señales recibidas en las líneas IRQ.
Puntos importantes a destacar es que, como se ha señalado, se trata de un dispositivo programable; que esta programación es realizada por el BIOS en la fase de inicio, y que el PIC es una parte fundamental del mecanismo de excepciones hardware.
§5 Patillas del procesador
Otro elemento que interviene en el mecanismo de excepciones son ciertas patillas del procesador. Todos los miembros de la saga 8088 disponen de dos patillas, designadas INTR y NMI, para este servicio específico (H3.2.1). Sirven respectivamente para atender las interrupciones enmascarables y no enmascarables (nos referimos a ellas inmediatamente). A su vez, el procesador utiliza ciertas señales en algunas de sus patillas para generar un ciclo INTA ("Interrupt Acknowledge"), que sirve para notificar al PIC que ha recibido la interrupción.
§6 Tipos de interrupción
Atendiendo a su origen, en el PC existen tres tipos de interrupciones: Interrupciones hardware; interrupciones software , y excepciones del procesador .
§6.1 Las interrupciones hardware ocurren cuando un dispositivo necesita atención del procesador y genera una señal eléctrica en la línea IRQ que tiene asignada. Esta señal es recogida y procesada por el controlador de excepciones PIC antes de ser enviada al procesador, lo que puede realizarse de dos formas, según el tipo de interrupción sea enmascarable o no enmascarable.
§6.1.1 Interrupción enmascarable significa que, bajo control del software, el procesador puede aceptar o ignorar (enmascarar) la señal de interrupción. Para ello se envía una señal a la patilla INTR , y el procesador la atiende o la ignora en función del contenido de un bit (IF) en un registro (FLAGS) que puede estar habilitado o deshabilitado ( H3.2). En el primer caso, cuando se recibe la señal, el procesador concluye la instrucción que estuviese en proceso y a continuación responde con una combinación de señales en algunas de sus patillas componiendo una sucesión de dos señales INTA ("Interrupt Acknowledge" H3.2.1).
La primera señal es simplemente un aviso; la segunda es una petición para que el PIC coloque en el bus de datos un Byte con el número de interrupción, de forma que el procesador pueda localizar el servicio solicitado.
El valor recibido (0-255) es multiplicado por 4 para calcular la dirección del vector correspondiente en la tabla de vectores de interrupción, lo que se realiza mediante un desplazamiento binario de dos posiciones a la izquierda ( 4.9.3). A continuación, el procesador salva en la pila los valores del registro de estado ( H3.2), del contador de programa (PC) y del segmento de código (CS); deshabilita el bit IF del registro de estado, para que la interrupción no pueda ser molestada con una nueva interrupción enmascarable hasta que sea específicamente permitido, y finalmente ejecuta el servicio.
La penúltima secuencia de la rutina de servicio es enviar una señal de que la interrupción ha terminado (EOI) para que el PIC pueda seguir enviando interrupciones. A continuación debe restaurar los registros a su estado inicial (existente antes de que se produjera la interrupción).
La señal de terminación del servicio de la interrupción EOI ("End of interrupt") es la siguiente secuencia:
MOV DX, PIC0
MOV AL, EOI
OUT DX, AL
La primera instrucción mueve el contenido PIC0 al registro DX (PIC0 es el nemónico de la dirección más baja de puerto A0 = 0).
La segunda mueve el valor EOI (nemónico del valor 20h) al registro AL.
La tercera es una sentencia de escritura a puerto; escribe el contenido del registro AL (el valor EOI puesto en la sentencia anterior) en el puerto señalado por el contenido del registro DX (establecido en la primera instrucción).
Para facilitar el manejo de interrupciones, el 8088 y sucesores disponen de algunas instrucciones específicas:
- IRET Retorno de interrupción ("Interrupt Return"). Recupera de la pila el contador de programa PC; el segmento de código CS (lo que supone devolver el programa al punto de ejecución original), y el registro de estado FLAGS (lo que supone devolver las interrupciones enmascarables al estado inicial).
- CLI Limpiar la interrupción ("Clear Interrupt"); pone a cero el registro IF, deshabilitando las interrupciones enmascarables.
- STI Es la instrucción opuesta ("Set Interrupt") pone a 1 el registro IF habilitando las interrupciones enmascarables.
La idea importante a resaltar aquí, es que el PIC asocia un número entre 0 y 255 a cada petición. Este número, que se conoce como número de interrupción, no debe ser confundido con el número de línea IRQ's que realizó la solicitud. El número de interrupción sirve para identificar el servicio mediante la tabla IDT . Una vez ejecutado el servicio, deben dejarse las cosas como estaban para que el programa original pueda continuar su ejecución.
§6.1.2 Interrupción no enmascarable significa que la interrupción no puede ser deshabilitada por software. Este tipo de interrupciones ocurren cuando se recibe una señal en la patilla NMI ("Nonmaskable Interrupt" §5 ) del procesador. Se reservan para casos en que es crítica la respuesta, por ejemplo que se detecte un error de paridad en la memoria. Además son de prioridad más alta que las enmascarables.
Nota: La única forma de enmascarar estas interrupciones es a través de circuitos externos al procesador, por ejemplo a nivel del PIC.
Cuando el procesador recibe una de estas instrucciones no se genera ningún ciclo de reconocimiento de la instrucción (INTA), y el procesador le asigna un 2 como número de excepción.
§6.2 Interrupciones software
Los procesadores Intel de la gama x86 y compatibles, disponen de una instrucción INT que permite generar por software cualquiera de los 256 tipos de interrupción anteriormente descritos (§2 ). El proceso seguido es exactamente el mismo que si se recibe una interrupción hardware en la patilla INTR, salvo que en este caso se conoce el tipo de interrupción, y no se requiere ningún ciclo INTA. Por ejemplo, en lenguaje ensamblador, la instrucción INT 21 invoca la interrupción 33d (21h), que en MS-DOS es la llamada a los servicios del Sistema.
Este tipo de interrupciones son de prioridad más alta que las de hardware (enmascarables y no enmascarables), de forma que si se recibe una interrupción hardware mientras que se ejecuta una software, esta última tiene prioridad.
Este tipo de interrupciones son utilizadas tanto por el Sistema Operativo como por los programas de usuario que pueden instalar las suyas particulares (hemos señalado , que algunas de las 255 posiciones de la tabla de vectores de interrupción están desocupadas). Precisamente, aquellas posiciones de la IDT que señalan a posiciones dentro de la ROM-BIOS (por encima de la dirección F0000h H5.1) se refieren a interrupciones relacionadas con servicios de la BIOS, mientras que las situadas en la zona de memoria convencional, se refieren a interrupciones instaladas por el Sistema o los programas de aplicación.
§6.3 Excepciones del procesador
Durante el funcionamiento del procesador pueden ocurrir circunstancias excepcionales; es usual citar como ejemplo el caso de una división por cero. En estos casos, el procesador genera una excepción, que es tratada como si fuese una interrupción software (§6.2 ), con la diferencia de que el número de interrupción asociado depende del tipo de excepción.
En el caso de la división por cero el número asociado es cero. Este era el único tipo de excepción de procesador prevista en el 8088, pero en los modelos sucesivos de la saga x86 y Pentium esta posibilidad fue ampliándose paulatinamente.
§6.5 Orden de prioridad
Las interrupciones tienen un orden de prioridad, de forma que si ocurren dos de forma simultánea es atendida la de prioridad más alta. El orden en que se atienden es el siguiente:
1º: Excepciones del procesador.
2º: Interrupciones software.
3º: Interrupciones hardware no enmascarables.
4º: Interrupciones hardware enmascarables.
§7 Evolución
§7.1 El estándar PnP
El sistema de interrupciones es una excepción en lo que a evolución se refiere. A partir de la introducción del segundo controlador 8259A en 1.984, el diseño ha permanecido invariable. La razón es que su modificación supondría un cambio demasiado drástico en la arquitectura del PC, con un parque de millones de sistemas y periféricos instalados con millones de programas y Sistemas Operativos funcionando que no podrían ser trasladados "tal cual" a las nuevas máquinas [6].
Puede decirse que desde su nacimiento, el PC arrastraba ciertas carencias congénitas, que podían resumirse en escasez de Líneas de acceso directo a memoria DMA's ( H2.3); líneas de interrupciones IRQ's; direcciones de puertos, y memoria convencional ( H5.1). El resultado era que la configuración de los primeros sistemas era una pesadilla para los instaladores, que debían configurar manualmente los dispositivos instalados poniendo y quitando los fastidiosos "Jumpers" [1]. A pesar de todo, muchas veces el resultado era que sencillamente no podía instalarse el nuevo dispositivo porque los canales DMA o líneas IRQ que podían seleccionarse estaban ya ocupadas por otros.
Como consecuencia de tales deficiencias, en una conferencia sobre hardware para Windows celebrada en marzo de 1.993, Microsoft e Intel propusieron un nuevo estándar que intentaba simplificar el problema. Conocido como Plug and Play (PnP), enchufar y usar (precisamente el "sueño" de los instaladores en la época), que se basa en varias premisas. La principal, que los dispositivos fueran configurables por software mediante un programa especial de "Set-up". Además tanto el hardware como el software (controladores de dispositivos cargados por el Sistema), deberían ser reconfigurables dinámicamente para adaptarse a los cambios de configuración. Por ejemplo, insertar o retirar un dispositivo PC-Card de un bus PCMCIA [2].
§7.2 Compartir IRQs
La especificación PnP antes comentada, aunque simplificaba las cosas, en realidad no resolvía el problema de fondo: la escasez de ciertos recursos, principalmente líneas de interrupción. Por lo que al desarrollar la interfaz PCI ( 6.4), Intel incluyó la posibilidad de que estos dispositivos pudieran compartir la misma IRQ.
A continuación se muestra la distribución de IRQs en un sistema Linux dotado de bus PCI, tal como se obtiene con el comando dmesg señalado anteriormente . (se han resaltado las sentencias interesantes) :
PCI: Using IRQ router PIIX [8086/7110] at 00:02.0
PCI: Found IRQ 11 for device 00:03.0
PCI: Sharing IRQ 11 with 00:03.1
PCI: Sharing IRQ 11 with 01:00.0
Serial driver version 5.05c (2001-07-08) with HUB-6 MANY_PORTS MULTIPORT SHARE_IRQ SERIAL_PCI enabled
PIIX4: not 100% native mode: will probe irqs later
ide0 at 0x1f0-0x1f7,0x3f6 on irq 14
ide1 at 0x170-0x177,0x376 on irq 15
PCI: Found IRQ 11 for device 00:02.2
usb-uhci.c: USB UHCI at I/O 0x1060, IRQ 11
PCI: Found IRQ 11 for device 00:03.0
PCI: Sharing IRQ 11 with 00:03.1
PCI: Sharing IRQ 11 with 01:00.0
PCI: Found IRQ 11 for device 00:03.1
PCI: Sharing IRQ 11 with 00:03.0
PCI: Sharing IRQ 11 with 01:00.0
Yenta IRQ list 0698, PCI irq11
Yenta IRQ list 0698, PCI irq11
eth0: AboCom FE2000VX (RealTek RTL8139) at 0xd0afa000, 00:4f:62:01:5c:7a, IRQ 11
eth1: Xircom: port 0x300, irq 3, hwaddr 00:10:A4:01:FF:F1
ttyS03 at port 0x02e8 (irq = 3) is a 16550A
PCI: Found IRQ 5 for device 00:07.0
Puede apreciarse que los dispositivos PCI comparten las IRQ11 e IRQ5. Como es habitual, las controladoras IDE primaria y secundaria, identificadas aquí como ide0 e ide1, utilizan IRQ14 e IRQ15. Los dispositivos identificados como eth0 y eth1 son sendas tarjetas de red. ttyS03 es un puerto serie cuya UART es una 16550A ( 2.5.11). Yenta se refiere al tipo de controladora de conexión de los dispositivos PCMCIA (se trata de un equipo portátil que dispone de este tipo de bahías).
§8 Interrupciones en Windows
La descripción anterior corresponde a lo que ocurre en el hardware, o lo que es lo mismo, en una aplicación trabajando en modo real (H5.1); es la descripción clásica del mecanismo de interrupciones de una aplicación bajo MS-DOS.
Hemos señalado que en los sistemas Windows, cada aplicación corre en una máquina virtual MV ( 0.2), de modo que está más alejada del hardware que las aplicaciones que se ejecutan en modo real. En este caso, las aplicaciones interactúan con dispositivos virtuales VDs ("Virtual devices") a través de controladores virtuales de dispositivos VxDs.
En concreto, el controlador PIC es virtualizado por el VPICD ("Virtual PIC Device"); este es un controlador virtual proporcionado de forma estándar por Windows que emula las funciones del auténtico controlador programable de interrupciones. Esta simulación implica reflejar las interrupciones en las máquinas virtuales y simular E/S, por ejemplo, reconocer cuando una MV emite un final de interrupción EOI ("End of interrupt").
Lo mismo que ocurre en modo real, durante la inicialización del controlador virtual VPICD, se establece un manejador de excepciones por defecto para cada petición de interrupción (IRQ). Estos manejadores determinan que máquina virtual será afectada y con que interrupción. También arbitran los posibles conflictos cuando diversas máquinas virtuales intentan desenmascarar la misma interrupción.
Cualquier interrupción no enmascarada cuando se inicia Windows es considerada una interrupción global. Este tipo de interrupciones serán reflejadas en la máquina virtual que esté en ejecución en ese momento (a su vez la MV puede enmascarar o no enmascarar esta IRQ).
Si una MV desenmascara una IRQ que fue enmascarada cuando se inició Windows, es declarada propietaria de dicha interrupción, y la IRQ será reflejada exclusivamente en su máquina propietaria (si alguna otra MV intenta desenmascarar dicha interrupción, Windows terminará la segunda MV, y puede señalar la necesidad de reiniciar el sistema).
Si algún otro VxD virtualiza una petición IRQ, es su responsabilidad determinar que MV debe recibir las interrupciones y arbitrar los posibles conflictos. Además, el controlador por virtual por defecto VPICD dejará de proporcionar soporte para dicha IRQ.
§9 Webografía
The x86 interrupt list ftp.cs.cmu.edu/
Conocida también como RBIL ("Ralf Brown's Interrupt List"), esta página de la universidad Carnegie Mellon en Pittsburg (Pensilvania - USA), es quizás la más famosa y extensa fuente de información respecto al asunto de las interrupciones; puertos Entrada/Salida; posiciones de memoria y otros detalles técnicos de diseño de los PCs IBM y compatibles. Casi seis Megabytes de información que incluyen algunos programas de utilidad.
[1] Un estudio de 1.993 sobre el costo total a 5 años para las empresas que utilizaban sistemas PC-Windows, revelaba que este se elevaba a 37.000 USD, debidos principalmente a su complejidad.
[2] PCMCIA "Personal Computer Memory Card International Association". Un estándar para conexión de dispositivos en el PC, especialmente difundido en los portátiles, aunque también existen adaptadores para los buses ISA y PCI de los equipos de sobremesa.
[3] Estas direcciones se guardan en forma segmentada ( H5.1) y la forma real de almacenamiento es de palabras invertidas ("Back-words" H5), de forma que los dos bytes más bajos contienen el desplazamiento, y los dos más altos el segmento. Esto supone que al recuperarlos para ejecutar la interrupción, los dos bytes más bajos pasan al registro de instrucción IP, y los dos siguientes al registro de segmento de código CS ( H3.2).
[4] El sistema opuesto al de interrupciones requiere que el procesador interrogue periódicamente a los dispositivos, lo que evidentemente requiere mucho tiempo si el número de candidatos potenciales es elevado. Este sistema se denomina de encuesta o interrogación ("Polling"); también como entrada programada, ya que la información llega del exterior cuando se ha decidido aceptarla.
[5] El PIC puede incluso rotar las prioridades de forma que las de prioridad más baja tengan alguna posibilidad de ser atendidas incluso si hay muchas de prioridades más altas. La rotación de prioridad se ha comparado a dar la posibilidad de conectar a un teléfono que estuviese siempre comunicando.
[6] De acuerdo con ciertos autores, una de las razones del tremendo éxito de la plataforma PC, ha sido precisamente la estabilidad de su arquitectura, que ha posibilitado ejecutar programas desarrollados hace 25 años en las máquinas actuales.
[7] Se trata de un equipo dotado de bus PCI ( 6.4) donde puede apreciarse como algunas IRQs son compartidas por varios dispositivos. Esta capacidad de compartir una IRQ entre distintos dispositivos (a la que nos referimos más adelante), es una característica del bus PCI, que no es compartida por el bus tradicional ISA.