Interrupciones de BIOS vs interrupciones de hardware

Oct 12 2020

En un chip x86 que se ejecuta en modo real, las interrupciones se resuelven con la ayuda de la IVT (Tabla de vectores de interrupción), que es una matriz ubicada en la dirección 0000h: 0000h que consta de 256 entradas, direcciones de 32 bits (segmento + desplazamiento) que apunte al código del controlador de interrupciones.

Esta página (junto con muchas otras) enumera que el primer controlador de interrupciones definible por el usuario es 20h. Los primeros 32 controladores están reservados y se utilizan para diversos fines. Por ejemplo, la interrupción 10h se usa para las excepciones de x87 FPU, mientras que la interrupción 13h se usa para las excepciones de SIMD FP. Sin embargo, esta página (junto con muchas otras, incluida la Lista de interrupciones de Ralf Brown) muestra que las interrupciones 10h y 13h están definidas por el BIOS para servicios de video y disco, respectivamente. ¿Hay algo que me falta o estas direcciones de interrupción se utilizan para interrupciones de hardware y software al mismo tiempo?

Respuestas

20 Noname Oct 12 2020 at 22:29

Mientras que la documentación de la CPU 8088 utilizada en la IBM PC original reservaba los primeros 32 vectores de interrupción para las excepciones de la CPU, la 8088 solo hizo uso de algunos de ellos. Cuando IBM diseñó la PC, optaron por ignorar esto y asignaron los vectores reservados pero no utilizados para sus propios fines.

El 8088 original solo definía excepciones para los primeros 5 vectores de interrupción, para error de división, paso único, NMI, punto de interrupción y desbordamiento, respectivamente. Los vectores de interrupciones del 5 al 31 se marcaron como reservados en el Manual del usuario de la familia 8086 de Intel:

A pesar de esto, IBM decidió que su BIOS configurara el controlador de interrupciones para entregar interrupciones de hardware comenzando en el vector de interrupciones 8. Dado que la PC IBM original solo admitía 8 interrupciones de hardware, esto significaba que los vectores 8 a 15 se usaban para las interrupciones de hardware. Luego, IBM comenzó a asignar servicios de BIOS comenzando con el vector 16 (10h), para ser invocados usando interrupciones de software. Además, el vector 5 se utilizó para implementar una función de pantalla de impresión. Los vectores reservados 6 y 7 no se utilizaron.

Desafortunadamente, esto resultó ser un error de IBM, ya que cuando Intel diseñó el 80286 definieron excepciones de CPU adicionales en el rango reservado, subiendo hasta el vector 13 (0Dh). Esto significaba que IBM PC / AT, que usaba la CPU 80286 pero también necesitaba ser compatible con versiones anteriores de la IBM PC original basada en 8088, tenía vectores de interrupción con dos propósitos diferentes, uno definido por la CPU y otro definido por la BIOS.

En particular, tener tanto la pantalla de impresión como la BOUNDexcepción de violación usando el vector 5 resultó ser una molestia bastante grande. En teoría, esto no debería haber sido un problema, ya que cualquier programa que use la nueva BOUNDinstrucción necesitaría instalar su propio controlador de interrupciones, uno que pudiera distinguir entre las dos fuentes. En la práctica, sin embargo, la BOUNDinstrucción terminó siendo ejecutada involuntariamente por programas que se habían bloqueado y el controlador de BIOS predeterminado se atascaba en un ciclo infinito de impresión de la pantalla.

Los otros usos conflictivos para los vectores no fueron un gran problema, ya que las excepciones 10 a 13 normalmente solo se generarían en modo protegido. Un sistema operativo en modo protegido no necesitaba ser compatible con versiones anteriores y no podía usar el BIOS, por lo que podría reconfigurar el controlador de interrupciones para entregar interrupciones de hardware a través de vectores fuera del rango reservado.

El resto de las excepciones de CPU definidas por el procesador Intel posterior tampoco fueron generadas normalmente por código de modo real que necesitaba ser compatible con versiones anteriores o manejadas por controladores de BIOS predeterminados que podían distinguir adecuadamente entre fuentes.

8 TeaRex Oct 12 2020 at 21:03

En la arquitectura original de PC / AT, la señal de excepción de FPU que debe conectarse directamente a un pin de entrada dedicado en la CPU principal y debe aparecer como INT 10h se redirige mediante la lógica de pegamento al segundo controlador IRQ para que aparezca como IRQ 13 (es decir, INT 75h) en su lugar. La mayoría de los otros vectores en conflicto son de tal naturaleza que los vectores definidos por hardware son de interés solo en modo protegido, y los vectores definidos por BIOS solo en modo real, por lo que normalmente no habrá conflicto real. Básicamente, todo es un caso de ingenieros de IBM que hacen las cosas de manera diferente a lo que pretendían los ingenieros de Intel.