next up previous contents
Next: El modo protegido Up: El manejo de excepciones Previous: Excepciones generadas por hardware

La instrucción de interrupción por software INT.

Los procesadores la familia de INTEL80x86 ejecutan la misma secuencia de operaciones para la instrucción de interrupción por software (INT) como para las interrupciones por hardware. En ambos casos, el control del CPU se transfiere a un programa denominado manejador de interrupción. La instrucción INT se complementa con la instrucción IRET, que es la instrucción utilizada por el manejador de interrupciones para regresar el control del CPU al programa que ha sido interrumpido.

Cuando ocurre una instrucción INT, ya sea generada por el hardware o por el programa, el CPU conserva el estado actual del registro de banderas (FLAGS) guardándolo en la pila. Entonces se limpia la bandera de interrupciones y se coloca el valor 0 en la bandera TRAP. Limpiar la bandera IF is igual que ejecutar la instrucción CLI (Clear Interrupt), en ambos casos se deshabilitan las interrupciones y se asegura que el CPU no sea interrumpido hasta que procedimiento de INT realice su tarea crítica. Un manejador de interrupciones puede habilitar las interrupciones tan pronto como termine, utilizando la instrucción STI (Set Interrupt) para que otra interrupción pueda ocurrir. La instrucción STI se puede omitir si el código del manejador es muy corto.

Después el CPU guarda el valor actual del registro CS colocándolo en la pila. Entonces se carga el CS que corresponde al manejador de interrupciones que se encontraba almacenado en la tabla del vector de interrupciones. La tabla del vector de interrupciones se encuentra al fondo de la memoria RAM. La tabla se indexa multiplicando el número de la interrupción por 4 y después sumándole 2. Esto es:

\begin{displaymath}CS = (\mbox{n\'umero de interrupci\'on})\ast 4 + 2
\end{displaymath}

El valor actual del IP se guarda colocandolo en la pila. El nuevo IP se carga con el valor del offset del manejador de instrucciones almacenado en el vector de interrupciones. La tabla del vector de interrupciones se indexa multiplicando el valor de la interrupción por 4. Esto es:

\begin{displaymath}IP = (\mbox{n\'umero de interrupci\'on})\ast 4
\end{displaymath}

Este procedimiento le pasa el control al procedimiento apuntado por el nuevo CS:IP. Cualquier registro que utilice el manejador debe almacenarse en la pila, y cuando termine su tarea se deben reestablecer los valores que se almacenaron en la pila a sus respectivos registros. Si el manejador es una interrupción por hardware, entonces le informa al PIC (Programable Interrupt Controller) que a finalizado enviandolo un EOI (End Of Interrupt).
  
Figure 2.4: Registros de propósito general del 80486
\begin{figure}
\epsfxsize=220pt
\hspace{1in}
\epsffile{reg80386.eps}
\end{figure}

Lo último que hace un manejador de interrupciones es ejecutar la instrucción IRET. La instrucción IRET regresa el control del CPU al proceso interrumpido haciendo lo opuesto a la instrucción INT. Esto es, toma una palabra de la pila (2 bytes) y la coloca en el IP, y que es el offset de la siguiente instrucción que se ejecutará. La siguiente palabra se saca de la pila y se almacena en el registro CS y que corresponde al segmento de la siguiente instrucción a ejecutarse. La última palabra que se recupera de la pila se almacena en el registro de bandera (FLAGS).

Este proceso le regresa el control al programa interrumpido. Puesto que el estado de la máquina se ha reestablecido (esto es, el valor de los registros) a como estaban, el programa interrumpido no se da cuenta que fue suspendido y continúa su ejecución sin cambios.

La técnica del vector de interrupciones proporciona un forma muy pura para hacer modificaciones a las interrupciones de los programas sin cambiar las formas de las funciones del CPU. Todo lo que se debe hacer es cambiar las direcciones de puntos de entrada en la tabla. La cambios más comunes en los programas de manejo de interrupciones (o programas de servicio) se hacen cuando se carga un sistema operativo.


  
Figure 2.5: Registro de banderas del 80486, EFLAGS.
\begin{figure}
\epsfxsize=250pt
\hspace{.45in}
\epsffile{flags80386.eps}
\end{figure}


next up previous contents
Next: El modo protegido Up: El manejo de excepciones Previous: Excepciones generadas por hardware
Amilcar Meneses
2002-10-03