Anda di halaman 1dari 6

Las fases de la sincronización por interrupción

Petición de interrupción
El proceso de sincronización por interrupción se inicia cuando el controlador informa al procesador,
mediante una petición de interrupción, de que ha ocurrido un evento que requiere su atención.
Lógicamente, si el controlador no está capacitado para generar tal petición entonces la sincronización por
interrupción entre el procesador y el controlador no es posible.

En la descripción de un controlador debe siempre quedar claro en qué condiciones el controlador generará
una petición de interrupción. En el caso de los controladores con los que trabajamos es este curso, los
motivos de interrupción se recogen en la tabla siguiente.

Controlador Circunstancias en que pide interrupción

Reloj 18 veces cada segundo

Teclado Cada vez que se produce un MAKE o un BREAK

Pantalla No produce interrupciones

Disco Cuando ha finalizado la última operación solicitada por el


procesador (lectura o escritura de un sector)

Impresora Cuando se ha enviado a imprimir el carácter y ha quedado


libre el registro de datos para alojar uno nuevo

Algunos controladores tienen un bit en el registro de control que se utiliza para inhibir las interrupciones
del controlador. Por ejemplo, el procesador puede inhibir las interrupciones del controlador de impresora
poniendo un 0 en el bit 0 del registro de control (sin alterar el resto de los bits de este registro). El código
necesario para hacer esta operación es:
IN AL, Rcont_imp
AND AL, 11111110b; pone a 0 el bit 0 sin modificar los otros bits
OUT Rcont_imp, AL

El controlador de teclado no tiene registro de control (y por tanto, no tiene bit de inhibición de
interrupciones. Las interrupciones en el controlador de disco se inhiben poniendo a 0 el bit 0 del registro
de control Rcont_disc.

A menos que se especifique lo contrario, supondremos que las interrupciones están permitidas en el
controlador (es decir, el bit correspondiente del registro de control está a 1). Por tanto, la operación de
inhibición de la interrupción será necesaria cuando se quiera realizar una sincronización por encuesta. En
ese caso, además, antes de finalizar el programa deberán restaurarse las interrupciones inhibidas,
volviendo a poner un 1 en el bit correspondiente del registro de control.

Detección de la petición por parte del procesador


El procesador comprueba si hay alguna petición de interrupción pendiente cada vez que acaba la
ejecución de una instrucción y antes de iniciar el fetch de la instrucción siguiente. Así pues, el diagrama
de estados que representa, de forma general, el proceso de ejecución de una instrucción de lenguaje
máquina, es el siguiente:

1
Búsqueda
Fetch Decodificación
operandos

NO
¿Interrupción Almacenamiento
pendiente? Ejecución
resultado
SI

Tratamiento

Es importante comprender que una petición de interrupción que se produzca mientras el procesador está
ejecutando una instrucción no será atendida por el procesador hasta que éste finalice la ejecución de la
instrucción. Esta circunstancia puede resultar problemática cuando la instrucción en curso tiene un tiempo
de ejecución grande, ya que en ese caso podría pasar un tiempo excesivo entre el instante en que el
controlador solicita la atención del procesador y el instante en que el procesador inicia la atención,
pudiéndose producir como resultado un error de funcionamiento del sistema.

¿Qué harías cuando existe realmente este riesgo? Describir una situación en la que esto puede ocurrir.

El procesador tiene un bit que le permite protegerse de las interrupciones. En el caso del i80X86, este bit
es el IF (Interrupt flag) que está en la palabra de estado (EFLAGS). Mientras el bit IF esté a 0 el
procesador ignorará cualquier petición de interrupción. El valor del bit IF se controla mediante dos
instrucciones de lenguaje máquina (son instrucciones sin operandos):
CLI pone el bit IF a 0 (inhibe las interrupciones en el procesador)
STI pone el bit IF a 1 (permite las interrupciones en el procesador)

Inhibir las interrupciones en el procesador es una operación peligrosa porque deja sin atención a todos los
controladores. Tal y como se ha mencionado antes, esto puede provocar un mal funcionamiento del
sistema. Por ese motivo, en muchos sistemas las instrucciones tipo CLI y STI son privilegiadas (no
pueden formar parte del programa de un usuario normal). Tal y como usamos nosotros el PC, nuestros
programas si podrán usar las instrucciones CLI y STI.

Finalmente, hay que comprender también que la instrucción CLI inhibe todas las interrupciones. Si sólo
queremos inhibir las interrupciones de un controlador determinado entonces hay que usar el bit de
inhibición de interrupción que tiene el registro de control del controlador en cuestión (si es que ese bit
existe).

Salvar el contexto del programa interrumpido


Cuando el procesador decide atender una petición de interrupción entonces debe tomar las medidas
necesarias para que, una vez finalizada la rutina de atención a la interrupción, pueda retornar al programa
interrumpido y reanudar la ejecución en el punto en que fue abandonado. Para ello, debe guardar en la
pila la dirección de la instrucción que habrá que ejecutar al retornar. En el caso del i80X86 se guarda en la
pila un puntero (segmento:desplazamiento) a la instrucción de retorno, tal y como ocurre cuando se
ejecuta la instrucción CALL. Además de la dirección de retorno, el procesador salva en la pila, de forma
automática el valor de la palabra de estado para que no se pierda el valor de los bits de condición
(ZF,CF,OF y SF).

Finalmente, el procesador pone automáticamente el bit IF a 0, de manera que la ejecución de la rutina de


atención a la interrupción se inicia con las interrupciones inhibidas.

2
Identificación del motivo de la interrupción
Habitualmente, el sistema que usa el procesador para detectar peticiones de interrupción sólo le permite
averiguar que existe un controlador que requiere su atención. El procesador debe ahora averiguar cuál de
los posibles controladores es el que ha solicitado la interrupción. Además, puede ocurrir que sean varios
los han pedido interrupción. En ese caso, será necesario determinar cuál de los controladores es atendido.

El problema de la identificación del motivo de la interrupción puede resolverse por software o por
hardware.

Solución software
En este caso, después de salvar el contexto del programa interrumpido, el procesador pasa a ejecutar una
rutina de atención a las interrupciones. Se trata de la única rutina de atención a las interrupciones y
siempre se ejecuta la misma.

Las primeras instrucciones de la rutina determinan cuál es el controlador que ha realizado la petición.
Para ello, se consulta el valor del registro de estado de cada uno de los controladores hasta encontrar uno
que indique que el controlador requiere atención (recuérdese que la consulta del registro de estado es la
idea en la que se basa la sincronización por encuesta). Por ejemplo, la rutina de atención a las
interrupciones podría comenzar así:
Rsi PROC
IN AL, Rest_K1
TEST AL, 00000001b
JNE atención_K1
IN AL, Rest_K2
TEST AL,00000001b
JNE atención_K2

En el código anterior se ha supuesto que en ambos controladores (K1 y K2) es el bit 0 del registro de
estado el que indica que el controlador está esperando el tratamiento por parte del procesador.

En el caso en que varios controladores estén pendientes de atención entonces el orden en el que la rutina
de atención consulta los registros de estado determina el orden de prioridad de los controladores. En el
caso del código anterior, si K1 y K2 solicitan interrupción al mismo tiempo, entonces K1 será atendido
antes que K2.

La ventaja principal de la identificación software es que no necesita ningún elemento hardware de


soporte a la identificación. El problema es que el tiempo que se emplea en la identificación es grande,
especialmente si el controlador que ha interrumpido tiene prioridad baja (está en los últimos lugares en el
orden de consulta del registro de estado).

Identificación hardware
En este caso, hay una rutina de atención diferente para cada uno de los controladores que pueden
interrumpir. Existe un sistema hardware, externo al procesador (que se estudia más adelante en este curso)
que averigua cuál es el controlador que ha interrumpido y que hace que el procesador, después de salvar
el contexto del programa interrumpido, salte a ejecutar directamente la rutina de atención adecuada.
Además, el sistema hardware decide qué controlador tiene prioridad en caso de que haya varias peticiones
simultáneas pendientes.

El i80X86 utiliza un sistema de identificación hardware que se denomina mecanismo de interrupciones


vectorizadas, y que es muy habitual en otros procesadores. En un sistema de interrupciones vectorizadas,
cada controlador tiene asociado un número que se denomina identificador de interrupción. El sistema
hardware responsable de la identificación hace llegar al procesador el identificador de interrupción del
controlador que debe ser atendido. El procesador usa el identificador como índice a un vector de punteros
que contiene las direcciones lógicas de memoria donde comienzan cada una de las rutinas de atención a
las interrupciones. Este vector, que denominaremos vector de interrupciones, se encuentra, en el caso del

3
i80X86 a partir de la dirección física 0 de memoria. Los identificadores de interrupción de cada uno de
los controladores con los que trabajamos en este curso son:
Reloj 8
Teclado 9
Disco 13
Impresora 15

Cuando se escribe un programa para el i80X86 en el que debe haber una sincronización por
interrupciones con un controlador determinado, entonces, además de escribir la rutina que queremos que
se ejecute cada vez que se produzca una interrupción de ese controlador, habrá que colocar en la posición
correspondiente del vector de interrupciones el puntero a la posición en que comienza la rutina de
atención. Además, antes de acabar, el programa deberá restaurar el vector de interrupciones con sus
valores originales, para dejar el sistema en las misma condiciones en las que estaba antes de iniciarse la
ejecución de nuestro programa.

La figura resume el funcionamiento del sistema de interrupciones vectorizadas en el i80X86.

Vector de Rutina de atención al


El procesador recibe del
interrupciones controlador i
exterior el identificador Dirección física 0
de interrupción
0 RSI_i PROC



1 RSI_i ENDP

Desplaz.
i
Seg.

Puntero (4 bytes) a la
rutina de atención

Las características de la identificación hardware son justamente las complementarias a las de la


identificación software: la identificación es rápida pero se requiere el soporte de un hardware externo al
procesador (cuyos detalles se estudian más adelante en este curso).

Salvar el estado
Nos encontramos ya al inicio de la rutina de atención a la interrupción. Lo primero que debe hacer esa
rutina es salvar en la pila el valor de los registros que van a usarse durante la ejecución de la rutina. Esos
valores se restaurarán antes de retornar al programa interrumpido, para que éste se reanude exactamente
en la misma situación en que fue interrumpido (el problema es análogo al caso de las subrutinas).

4
Eliminar la petición de interrupción
Se trata de informar al controlador de que el procesador ha decidido ya atender su petición de
interrupción, para que el controlador retire la petición. Si no se hace esta operación entonces, más
adelante, durante la ejecución de la rutina de atención de la interrupción, el procesador puede detectar una
nueva petición de interrupción del mismo controlador, que es en realidad la petición anterior que aún no
ha sido retirada. Esta situación provocaría un error en el funcionamiento del sistema.

La eliminación de la petición puede realizarse por software o de forma automática (por hardware).

Eliminación por software


En este caso, la propia rutina de atención a la interrupción debe informar al controlador de que ya puede
eliminar la petición. Esta operación suele consistir en leer o escribir alguno de los registros del
controlador. Por ejemplo, en le PC las rutinas de atención a las interrupciones del teclado deben leer el
registro de datos para que el controlador elimine la petición, incluso aunque no sea necesario conocer el
contenido del registro de datos para realizar el tratamiento de la interrupción.

Eliminación automática
En este caso, el mismo sistema hardware que identifica el controlador que debe ser atendido informa
también al controlador para que elimine ya la petición. Por tanto, al escribir la rutina de atención a las
interrupciones no es necesario preocuparse de la eliminación de la petición ya que esta operación se
realiza de forma automática.

Para cada controlador habrá que tener presente si las interrupciones se eliminan por software o de forma
automática. La siguiente tabla resume el caso de cada uno de los controladores usados en este curso.

Controlador ¿Cómo se elimina la petición de interrupción?

Reloj De forma automática

Teclado Leyendo el registro de datos Rtec_dat

Disco De forma automática

Impresora De forma automática

Ejecución de la rutina de atención a la interrupción


Las operaciones que debe hacer la rutina de atención a la interrupción dependerán de la aplicación que se
desea realizar, aunque hay algunas operaciones, que ya se han mencionado antes (salvar y restaurar
registros o eliminar la petición, si hay que hacerlo por software), que son independientes de la aplicación.

Al escribir una rutina de atención debe tenerse en cuenta que durante la ejecución de la rutina las
interrupciones están inhibidas. Por tanto, la rutina debe ser rápida para evitar que otras peticiones de
interrupción deban esperar mucho tiempo para ser atendidas. En particular, deben evitarse los bucles en
las rutinas de atención a las interrupciones.

En cualquier punto de la rutina pueden permitirse las interrupciones (ejecutando la instrucción STI).
Debe tenerse muy en cuenta que, en ese caso, la rutina que se está ejecutando será abandonada
temporalmente si se produce otra interrupción, y, por tanto, el tratamiento de la interrupción se demorará.

Restaurar el estado
Tal y como ya se ha mencionado, antes de finalizar la rutina de atención deben restaurarse los valores de
los registros utilizados, que fueron salvados en la pila al inicio de la rutina.

5
Retorno al programa interrumpido
Esta operación se consigue ejecutando la instrucción IRET, que debe ser la última de la rutina de
atención a la interrupción.

La instrucción IRET toma de la pila la dirección de retorno y el valor de la palabra de estado (que fueron
salvados en la pila por el procesador cuando decidió aceptar la interrupción).

Después de ejecutar la instrucción IRET, el procesador ejecuta siempre la siguiente instrucción del
programa interrumpido, incluso aunque haya una nueva petición de interrupción pendiente. De esta forma
se garantiza que el programa interrumpido puede avanzar en su ejecución a pesar de que se produzcan
múltiples interrupciones.

Preguntas
¿Cuál es el código necesario para restaurar las interrupciones del controlador de disco?

Describe una situación en la que puede ser peligroso inhibir las interrupciones en el procesador

¿Por qué no es necesario salvar en la pila los bits de condición en el caso de una llamada a subrutina y si
lo es cuando el procesador decide atender una interrupción?

¿Por qué es más rápida la identificación hardware que la identificación software?

¿Qué ocurriría si la rutina de atención a la interrupción del teclado no leyese el registro de datos?

¿Por qué hay que evitar los bucles en las rutinas de atención a las interrupciones?

¿Por qué el procesador no atenderá ninguna interrupción inmediatamente después de ejecutar un IRET?

Anda mungkin juga menyukai