Interrupções de BIOS vs interrupções de hardware

Oct 12 2020

Em um chip x86 em modo Real, as interrupções são resolvidas com a ajuda do IVT (Interrupt Vector Table), que é um array localizado no endereço 0000h: 0000h que consiste em 256 entradas, endereços de 32 bits (segmento + deslocamento) que aponte para o código do manipulador de interrupção.

Esta página (junto com muitas outras) lista que o primeiro manipulador de interrupção definido pelo usuário é de 20h. Os primeiros 32 manipuladores são reservados e usados ​​para vários fins. Por exemplo, a interrupção 10h é usada para exceções x87 FPU, enquanto a interrupção 13h é usada para exceções SIMD FP. No entanto, esta página (junto com muitas outras, incluindo a Lista de interrupções de Ralf Brown) mostra que as interrupções 10h e 13h são definidas pelo BIOS para serviços de vídeo e disco, respectivamente. Há algo que estou perdendo ou esses endereços de interrupção são usados ​​para interrupções de hardware e software ao mesmo tempo?

Respostas

20 Noname Oct 12 2020 at 22:29

Enquanto a documentação da CPU do 8088 usada no IBM PC original reservava os primeiros 32 vetores de interrupção para exceções da CPU, o 8088 fez uso de apenas alguns deles. Quando a IBM projetou o PC, optou por ignorar isso e atribuiu os vetores reservados, mas não utilizados, para seus próprios fins.

O 8088 original apenas definiu exceções para os primeiros 5 vetores de interrupção, para Divide Error, Single Step, NMI, Breakpoint e Overflow, respectivamente. Os vetores de interrupção 5 a 31 foram marcados como reservados no Manual do usuário da família 8086 da Intel:

Apesar disso, a IBM decidiu fazer com que seu BIOS configurasse o controlador de interrupção para fornecer interrupções de hardware começando no vetor de interrupção 8. Como o IBM PC original suportava apenas 8 interrupções de hardware, isso significava que os vetores de 8 a 15 eram usados ​​para interrupções de hardware. A IBM então começou a atribuir serviços BIOS começando com o vetor 16 (10h), para serem chamados usando interrupções de software. Além disso, o vetor 5 foi usado para implementar uma função de impressão de tela. Os vetores reservados 6 e 7 não foram usados.

Infelizmente, isso provou ser um erro da IBM, pois quando a Intel projetou o 80286, eles definiram exceções de CPU adicionais na faixa reservada, subindo até o vetor 13 (0Dh). Isso significava que o IBM PC / AT, que usava a CPU 80286, mas também precisava ser compatível com as versões anteriores do IBM PC original baseado no 8088, tinha vetores de interrupção com duas finalidades diferentes, uma definida pela CPU e outra definida pelo BIOS.

Em particular, ter a tela de impressão e a BOUNDexceção de violação usando o vetor 5 provou ser um grande incômodo. Em teoria, isso não deveria ser um problema, já que qualquer programa usando a nova BOUNDinstrução precisaria instalar seu próprio manipulador de interrupção, um que pudesse distinguir entre as duas fontes. Na prática, no entanto, a BOUNDinstrução acabou sendo executada acidentalmente por programas que travaram e o manipulador padrão do BIOS ficou preso em um loop infinito de impressão da tela.

Os outros usos conflitantes para os vetores não eram tão problemáticos, já que as exceções de 10 a 13 normalmente só seriam geradas no modo protegido. Um sistema operacional de modo protegido não precisava ser compatível com as versões anteriores e não podia usar o BIOS, portanto, podia reconfigurar o controlador de interrupção para fornecer interrupções de hardware por meio de vetores fora do intervalo reservado.

O restante das exceções de CPU definidas por processadores Intel posteriores também não eram normalmente gerados por código de modo real que precisava ser compatível com versões anteriores ou manipuladas por gerenciadores de BIOS padrão que podiam distinguir corretamente entre as fontes.

8 TeaRex Oct 12 2020 at 21:03

Na arquitetura PC / AT original, o sinal de exceção da FPU que deve ser conectado diretamente a um pino de entrada dedicado na CPU principal e deve aparecer como INT 10h é redirecionado pela lógica de colagem para o segundo controlador de IRQ para que apareça como IRQ 13 (ou seja, INT 75h) em vez disso. A maioria dos outros vetores conflitantes são de tal natureza que os vetores definidos por hardware são de interesse apenas no modo protegido, e os vetores definidos pelo BIOS apenas no modo real, de modo que geralmente não haverá conflito real. Basicamente, a coisa toda é um caso de engenheiros da IBM fazendo as coisas de forma diferente do que os engenheiros da Intel pretendiam.