LAS INTERRUPCIONES:
En el contexto de la informática, una interrupción (del inglés interrupt request, en español «petición
de interrupción») es una señal recibida por el procesador de una computadora, para indicarle que
debe «interrumpir» el curso de ejecución actual y pasar a ejecutar código específico para tratar esta
situación.
Una interrupción es una suspensión temporal de la ejecución de un proceso, para pasar a ejecutar
una subrutina de servicio de interrupción, la cual, por lo general, no forma parte del programa, sino
que pertenece al sistema operativo o al BIOS. Una vez finalizada dicha subrutina, se reanuda la
ejecución del programa.
Las interrupciones son generadas por los dispositivos periféricos habilitando una señal del CPU
(llamada IRQ del inglés "interrupt request") para solicitar atención del mismo. Por ejemplo. cuando
un disco duro completa una lectura solicita atención al igual que cada vez que se presiona una tecla
o se mueve el ratón.
La primera técnica que se empleó para esto fue el polling, que consistía en que el propio procesador
se encargara de sondear los dispositivos periféricos cada cierto tiempo para averiguar si tenía
pendiente alguna comunicación para él. Este método presentaba el inconveniente de ser muy
ineficiente, ya que el procesador consumía constantemente tiempo y recursos en realizar estas
instrucciones de sondeo.
El mecanismo de interrupciones fue la solución que permitió al procesador desentenderse de esta
problemática, y delegar en el dispositivo periférico la responsabilidad de comunicarse con él cuando
lo necesitara. El procesador, en este caso, no sondea a ningún dispositivo, sino que queda a la espera
de que estos le avisen (le "interrumpan") cuando tengan algo que comunicarle (ya sea un evento,
una transferencia de información, una condición de error, etc.).
Funcionamiento del mecanismo de interrupciones
Todos los dispositivos que deseen comunicarse con el procesador por medio de
interrupciones deben tener asignada una línea única capaz de avisar al CPU cuando le
requiere para realizar una operación. Esta línea se denomina IRQ.
Las IRQ son líneas que llegan al controlador de interrupciones, un componente de hardware
dedicado a la gestión de las interrupciones, y que puede estar integrado en el procesador
principal o ser un circuito separado conectado al mismo. El controlador de interrupciones
debe ser capaz de habilitar o inhibir las líneas de interrupción y establecer prioridades entre
las mismas. Cuando varias líneas de petición de interrupción se activan a la vez, el
controlador de interrupciones utilizará estas prioridades para escoger la interrupción sobre
la que informará al procesador principal. También puede darse el caso de que una rutina de
tratamiento de interrupción sea interrumpida para realizar otra rutina de tratamiento de
una interrupción de mayor prioridad a la que se estaba ejecutando; aunque hay
interrupciones que no se pueden deshabilitar (conocidas como interrupciones no
enmascarables o NMI).
Un procesador principal que no tenga un controlador de interrupciones integrado, suele
tener una única línea de interrupción llamada habitualmente INT. Esta línea es activada por
el controlador de interrupciones cuando tiene una interrupción que servir. Al activarse esta
línea, el procesador consulta los registros del controlador de interrupciones para averiguar
cuál IRQ hay que atender. A partir del número del IRQ busca en la tabla de vectores de
interrupción la dirección de la rutina a la que debe llamar para atender la petición del
dispositivo asociado a dicha IRQ.
Procesamiento de una interrupción
1. Terminar la ejecución de la instrucción máquina en curso.
2. Salvar el estado del procesador (valores de registros y flags) y el valor del contador
de programa, IP, en la pila, de manera que en la CPU, al terminar el proceso de
interrupción, pueda seguir ejecutando el programa a partir de la última instrucción.
3. La CPU salta a la dirección donde está almacenada la rutina de servicio de
interrupción (Interrupt Service Routine, o abreviado ISR) y ejecuta esa rutina que
tiene como objetivo atender al dispositivo que generó la interrupción.
4. Una vez que la rutina de la interrupción termina, el procesador restaura el estado
que había guardado en la pila en el paso 2 y retorna al programa que se estaba
usando anteriormente.
Mecanismo y líneas de petición de interrupción
El bus de control de la placa base dispone de líneas específicas para el sistema de
interrupciones. Un PC típico dispone en su placa base de un controlador de interrupciones
8259 de Intel o de un circuito integrado análogo. Este dispositivo electrónico dispone de
hasta 16 líneas IRQ, numeradas desde el 00 hasta el 15. En las nuevas placas base este
circuito está integrado junto con el resto del chipset y permite hasta 24 interrupciones.
En el IBM PC y XT existían 8 líneas de petición de interrupción manejadas por el controlador
de interrupciones Intel 8259. Estas líneas están numeradas del 0 al 7, las dos primeras están
asignadas al timer tick del temporizador Intel 8253, y al teclado. 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
controlador de interrupciones (PIC), aunque la tecnología empleada exigió colgarlo de la
línea IRQ2 del primero, 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 solo son usadas por ciertos
dispositivos instalados en la propia placa base. 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 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 el IRQ4 al 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.
En sistemas más modernos utilizan la arquitectura APIC de Intel con 24 líneas y 8 extra para
enrutar las interrupciones PCI.
Nombre Int (hex) XT: Descripción AT: Descripción
NMI --- Paridad* Paridad*
IRQ0 08 Temporizador* Temporizador*
IRQ1 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 Puertos serie COM1/COM3
IRQ5 0D Disco duro Puerto Paralelo LPT2
IRQ6 0E Disquete Disquete
IRQ7 0F Puerto Paralelo LPT1 Puerto Paralelo LPT1
IRQ8 70 No existe Reloj de tiempo real*
IRQ9 71 No existe Redirigido a IRQ2*
IRQ10 72 No existe no asignado
IRQ11 73 No existe no asignado
IRQ12 74 No existe Ratón PS2
IRQ13 75 No existe Coprocesador 80287*
IRQ14 76 No existe Contr. disco IDE primario
IRQ15 77 No existe Contr. disco IDE secundario
IRQ16 78 Existe Contr. disco SATA primario
Cuando se instala un dispositivo de entrada o de salida que puede necesitar muchísima
atención del procesador Pentium, debe asignársele una IRQ adecuada. Dicho en otras
palabras, cuando un dispositivo periférico requiera atención, debe enviar una señal en la
línea IRQ especificada. Inicialmente esta asignación se efectuaba de forma manual y
automática, por medio de puentes (jumpers) en la placa o dispositivo móvil, pero
actualmente esta selección puede hacerse mediante software.
Tipos de interrupciones
Atendiendo a la fuente que las produce, las interrupciones pueden clasificarse de la
siguiente forma:
• Interrupciones de hardware. Estas son asíncronas a la ejecución del procesador, es
decir, se pueden producir en cualquier momento independientemente de lo que
esté haciendo el CPU en ese momento. Las causas que las producen son externas al
procesador y a menudo suelen estar ligadas con los distintos dispositivos de entrada
o salida.
• Excepciones. Son aquellas que se producen de forma síncrona a la ejecución del
procesador y por tanto podrían predecirse si se analiza con detenimiento la traza
del programa que en ese momento estaba siendo ejecutado en la CPU.
Normalmente son causadas al realizarse operaciones no permitidas tales como la
división entre 0, el desbordamiento, el acceso a una posición de memoria no
permitida, etc.
• Interrupciones por software. Las interrupciones por software son aquellas
generadas por un programa en ejecución. Para generarlas, existen distintas
instrucciones en el código máquina que permiten al programador producir una
interrupción, las cuales suelen tener nemotécnicos tales como INT (por ejemplo, en
DOS se realiza la instrucción INT 0x21 y en Unix se utiliza INT 0x80 para hacer
llamadas de sistema).
Interrupciones de hardware
Las interrupciones de hardware son aquellas interrupciones que se producen como
resultado de, por lo general, una operación de E/S. No son producidas por ninguna
instrucción de un programa sino por las señales que emiten los dispositivos periféricos para
indicarle al procesador que necesitan ser atendidos.
Cuando el microprocesador accede a un periférico (disco duro, puerto de comunicación...),
puede transcurrir algún tiempo antes de que los datos sean obtenidos o transmitidos. La
solución más simple es esperar hasta recibir los datos o hasta que se haya efectuado la
transmisión (polling), pero esta solución bloquea todos los programas en ejecución, y eso
no puede admitirse en un sistema multitarea. Por ello, en los sistemas modernos se prefiere
un funcionamiento mediante interrupciones, ya que éstas permiten mejorar la
productividad del procesador, de forma que este último puede ordenar una operación de
entrada o salida y, en lugar de tener que realizar una espera activa, se puede dedicar a
atender a otro proceso o aplicación hasta que el dispositivo esté de nuevo disponible,
siendo dicho dispositivo el encargado de notificar al procesador mediante la línea de
interrupción que ya está preparado para continuar o terminar la operación de entrada o
salida.
Excepciones
Las excepciones son un tipo de interrupción sincrónica típicamente causada por una
condición de error en un programa, como por ejemplo una división entre 0 o un acceso
inválido a memoria en un proceso de usuario. Normalmente genera un cambio de contexto
a modo supervisor para que el sistema operativo atienda el error. Así pues, las excepciones
son un mecanismo de protección que permite garantizar la integridad de los datos
almacenados tanto en el espacio de usuario como en el espacio kernel. Cuando el Sistema
Operativo detecta una excepción intenta solucionarla, pero en caso de no poder
simplemente notificará la condición de error a la aplicación/usuario y abortará la misma.
Interrupciones por software
Las interrupciones por software, también denominadas llamadas al sistema, son aquellas
generadas por un programa mientras este está ejecutándose. En general, actúan de la
siguiente manera: Un programa en ejecución llega a una instrucción que requiere del
sistema operativo para alguna tarea, por ejemplo para leer un archivo en el disco duro
(cuando un programa necesita un dato exterior, se detiene y pasa a cumplir con las tareas
de recoger ese dato). En ese momento por tanto llama al sistema y se interrumpe
virtualmente hasta recibir respuesta, en el ejemplo anterior hasta que no se haya leído el
disco y el archivo esté en memoria principal. Durante esa espera las instrucciones que se
ejecutarán no serán del programa, sino del sistema operativo; Una vez éste termine su
rutina ordenará reanudar la ejecución del programa autointerrumpido en espera; Por
último la ejecución del programa se reanuda.
Determinación de la dirección de la rutina de servicio de interrupción
Hay dos alternativas para determinar la dirección de la rutina de servicio de interrupción
que se debe ejecutar al recibir una interrupción determinada:
• Direcciones fijas. Se hallan cableadas en el procesador y por tanto nunca pueden ser
cambiadas. Esto implica que las RSI siempre estarán en una determinada posición
de la memoria.
• Direcciones variables (por interrupciones vectorizadas). En este grupo se incluyen
aquellas que presentan una dirección variable y que, por tanto, no se halla cableada
en el procesador. De esta manera el dispositivo debe dar información acerca de la
localización de la dirección de comienzo de la RSI asociada a dicho periférico.
Direcciones variables
Hay distintas metodologías de diseño para las interrupciones con direcciones variables. En
la actualidad, las alternativas que son implementadas de manera habitual son las siguientes:
• Direccionamiento absoluto: En este caso es el dispositivo o la interfaz del dispositivo
la encargada de conocer la dirección de la RSI y de enviarla al procesador para que
éste pueda localizar dicha subrutina y ejecutarla.
• Direccionamiento relativo: El dispositivo solo suministra parte de la dirección de
comienzo y es el procesador el encargado de completarla (añadiendo bits o
sumando una determinada cantidad, que siempre será fija). Esta alternativa tiene
una ventaja sobre la anterior y es que permite especificar la dirección de comienzo
con menos bits y por tanto simplifica el diseño. Ahora bien tiene una desventaja
principal y es que limita el número de dispositivos que podemos conectar y además
ciertos bits de la dirección quedan fijados de forma permanente por la CPU lo que
reduce la capacidad de reubicabilidad de la RSI. Una alternativa que utilizan ciertos
procesadores como el 8080 o el 8085 es que en vez de enviar solamente la dirección
de comienzo de la RSI se envía también el código de la operación de salto (por
ejemplo CALL).
• Direccionamiento indirecto: También conocida como direccionamiento por
interrupciones vectorizadas. Se mantiene una tabla de vectores de interrupción
(direcciones de comienzo de las distintas RSI) y a cada interrupción se le asocia un
número que será el índice por el cual se accederá a la tabla y se recuperará la
información de la dirección de comienzo. Necesita señales de conformidad o
handshaking para sincronizar al procesador con la interfaz, ya que esta última tiene
que indicarle al procesador cuando va a enviarle el índice que necesita para buscar
el vector de interrupción (INT) y el procesador deberá enviar otra señal para indicar
que se ha reconocido la interrupción (INTA#).
Determinación de la fuente que genera la interrupción
Hay distintas formas de identificar la fuente de una determinada interrupción. La primera
alternativa que se consideró fue asignar una línea (un bit) para cada interrupción, lo cual
suponía un gran costo en cuanto a la relación de número de dispositivos y número de bits
usados y a menudo limitaba el número de dispositivos que se podían conectar. Por ello, se
pensó con posterioridad en que en cada patilla de interrupción debería poder conectarse
más de un dispositivo, debiendo implementar por tanto una metodología que permitiese
identificar de forma unívoca de qué dispositivo se trataba. Para ello hay varias directrices:
• Polling: el microprocesador comprueba de manera sistemática todos los dispositivos
de manera que «busca» cuál de ellos fue el que solicitó la interrupción. Esto tiene
una ventaja y es que es barato a nivel de coste hardware ya que el polling se
implementa en software, no obstante tiene otras desventajas que no podemos
olvidar y es que suele ser lento porque tiene que comprobar en serie todos los
dispositivos y establece una prioridad en los dispositivos (el orden de sondeo) y por
tanto puede provocar inanición.
• Interrupciones vectorizadas: este concepto fue ya tratado en el apartado anterior.
Como ventajas podemos destacar que suele ser rápido pero implica un alto costo en
el hardware.
• Hardware paralelo: se utiliza un registro de interrupción cuyos bits se controlan de
forma independiente por las señales de petición de interrupción de cada
periférico. Según la posición de cada bit en el registro, se establece la prioridad.
Sistemas de prioridad
El sistema operativo necesita un mecanismo para priorizar las interrupciones y tratar
primero las más urgentes. Para ello, existen varias alternativas:
• Interrupciones simultáneas: No tienen por qué ocurrir de manera simultánea sino
que se refiere a que en un momento dado pueden haber varias interrupciones
activas.
• Interrupciones anidadas: Mientras se está procesando una determinada rutina de
servicio de interrupción sucede otra señal de interrupción.
• Inhibición de interrupciones: Se deshabilitan las demás interrupciones mientras se
está tratando una.
Interrupciones simultáneas
En este método tenemos dos alternativas, una de ellas es que exista algún hardware que
tenga como entradas las señales de interrupción y de cómo salida la interrupción más
prioritaria que está activa en ese momento. Otra alternativa es tener un método de
identificación de prioridades distribuida y no generalizada como en el caso anterior, en este
caso tenemos que destacar dos técnicas distintas que se pueden implementar en la
práctica:
• Polling: el microprocesador verifica los dispositivos y el orden de sondeo determina
la prioridad.
• Daisy-chain (conexión en cadena): se puede conectar los distintos dispositivos en
cadena, en orden decreciente de prioridad y por tanto la señal de reconocimiento
de interrupción (INTA#) solo será pasada al siguiente dispositivo en caso de que el
anterior (más prioritario) no haya solicitado los servicios del procesador. Sin
embargo, algo importante es que las señales de interrupción que van al procesador
están conectadas todas a un mismo cable, por tanto, deberemos utilizar alguna
técnica especial para que no se produzca un cortocircuito. Para evitar precisamente
que la pista se cortocircuite se utiliza la técnica del open-collecto o «colector
abierto» y consiste en conectar el colector de un transistor a la pista común (un
transistor por cada dispositivo) y por tanto estarán tantos colectores conectados
como dispositivos tengamos (se entiende que son dispositivos que mandan petición
de interrupción al procesador).
• Híbrida: mezcla las dos técnicas explicadas anteriormente.
Interrupciones anidadas
Existen dos métodos para tratar las interrupciones anidadas. El primero se basa en
inhabilitar las interrupciones mientras se está ejecutando una determinada RSI. Esto puede
realizarlo el hardware de manera automática en algunos procesadores, pero en otros será
el usuario el encargado de deshabilitarlas en caso de que no desee que ninguna otra
interrupción pueda interrumpir el transcurso normal de la rutina de servicio de
interrupción. No es aconsejable deshabilitar las interrupciones durante mucho tiempo ya
que esto puede provocar errores y pérdida de información.
La otra alternativa es permitir que solo las interrupciones más prioritarias puedan
suspender la ejecución de la RSI actual. Para esto tendremos que definir qué líneas son más
prioritarias que otras. Otra consideración de esta segunda alternativa es que al anidar
distintas llamadas a rutinas tendremos que contar con una pila suficientemente grande para
que esta no se desborde.
Inhibición de interrupciones
Hay distintas alternativas de inhibición de interrupciones. Como ya hemos visto estas se
pueden hacer de manera automática por el hardware en algunos casos mientras que en
otros será el usuario el encargado de realizarlo por software y esto depende de la
arquitectura del procesador que consideremos. Las distintas opciones son:
• Deshabilitar todas las interrupciones. Para esto basta con inhibir el bit del registro
de flag dedicado a las interrupciones.
• Deshabilitar al principio de la RSI y activarlas de nuevo al finalizar la misma. Puede
ser de manera automática o por el usuario.
• Desactivar solo las interrupciones que tengan menor prioridad que la asociada a la
RSI que se está ejecutando en ese momento.
• Deshabilitar de forma selectiva distintos niveles de prioridad de interrupción. Para
lo cual se emplean registros especiales denominados máscaras en el que cada uno
de sus bits identifican a un nivel distinto y modificando su contenido se puede
establecer que niveles están activos en ese momento. Se puede cambiar por el
programador. 1
1
El texto está disponible bajo la Licencia Creative Commons Atribución Compartir Igual 3.0; podrían ser
aplicables cláusulas adicionales. Léanse los términos de uso para más información.
Wikipedia® es una marca registrada de la Fundación Wikimedia, Inc., una organización sin ánimo de lucro.