Oficina
11. Interrupções, Exceções e IDTs
Dom 27 Mai 2007 08:55 |
- Detalhes
- Categoria: Sistemas Operacionais
- Atualização: Quarta, 22 Abril 2009 11:38
- Autor: vovó Vicki
- Acessos: 22780
MÓDULO 11 do SO Numaboa
O módulo 10. Definição de Sistema Operacional ressaltou as principais funções de um sistema operacional: atender chamadas de interrupção e alocar recursos. Antes de tentar melhorar o Sistema Operacional NumaBoa, o melhor que temos a fazer é buscar mais informações sobre interrupções e seus mecanismos de controle.
O que é uma interrupção
Apesar de já termos citado e explicado parcialmente o que são interrupções, vamos dar uma revisada no assunto. A Intel define uma interrupção como "elas [as interrupções] alteram o fluxo normal do programa para manipular eventos externos ou para reportar erros ou condições de exceção".
Esta definição é um tanto simplista e deixa de fora alguns aspectos relevantes. O primeiro deles é como ocorre uma interrupção. Já sabemos que uma interrupção pode ser gerada por software ou por hardware. Tomemos como exemplo uma interrupção de hardware quando uma tecla é digitada. Se tudo estiver configurado corretamente, quando uma tecla é digitada, o teclado envia um pedido de interrupção para a CPU. Neste caso, a CPU pára o código em execução e chama uma função que fará a leitura da porta 0x60 (a porta de saída do teclado) para determinar o que o teclado está enviando. Esta função, então, deverá devolver o controle para o que estava sendo executado antes do teclado ter enviado o pedido de interrupção. O código original, com frequência, nem fica sabendo que ocorreu uma interrupção. Uma interrupção também pode ser gerada via software através da instrução Assembly int
Neste ponto é interessante saber que o sistema de interrupções pode ser ativado ou desativado através dos comandos de Assembly cli (desativar) e sti (ativar).
Como as interrupções podem ser usadas
Não é só o teclado que pode disparar uma interrupção. Qualquer outro dispositivo do computador, como HDs, drives de disquete, placas de som, drives de CD-ROM, placas de rede, etc, podem (e precisam) fazer o mesmo. Todos utilizam interrupções por dois motivos: para avisar o sistema operacional que completaram alguma tarefa ou que possuem dados para para o sistema operacional. O PIT (Programable Interrupt Timer - Temporizador de Interrupções Programável) também dispara interrupções em intervalos de tempo pré-determinados, o que é muito útil na multitarefa preemptiva (que não será tema deste módulo).
Programas de usuários também podem usar interrupções. O MS-DOS e a BIOS fornecem várias interrupções para este fim. As interrupções da BIOS só funcionam em modo real.
O que é uma ISR
Uma ISR (Interrupt Service Routine - Rotina do Serviço de Interrupções) é o código executado quando ocorre uma interrupção, portanto existe uma ISR para cada interrupção. A forma como a CPU fica sabendo qual ISR executar será analisada mais adiante.
Como escrever uma ISR
Nada impede que se codifique ISRs próprias, ainda mais quando se pretende escrever um novo sistema operacional. Pode parecer difícil escrever um código que não conflite com o processo em execução, mas a coisa é menos complicada do que se pensa. É que a CPU se encarrega automaticamente da parte mais complicada, salvando os registradores SS, EIP, ESP e CS na pilha. Se o ponteiro da pilha estiver apontando para o mesmo endereço no início da ISR e quando a instrução iret for chamada, então esta instrução restaura os registradores automaticamente. Portanto, é só controlar a pilha: caso um ou mais dos registradores EAX, EBX, ECX, EDX, EBP, ESI, EDI, ES, DS, FS ou GS forem utilizados na função (o que é mais do que provável), primeiro é preciso salvá-los na pilha e não esquecer de restaurá-los após o uso. Vamos a um exemplo para as máquinas mais modernas (que possuem registradores para o terceiro e quarto segmento de dados):
IRQ
As IRQs (Interrupt Request - Requisição de Interrupção) são interrupções disparadas pelo hardware. Existem 16 no total e são numeradas de 0 a 15. O PIC (Programable Interrupt Controller) mapeia estas IRQs em dois blocos com 8 IRQs cada. É padrão que as 8 primeiras IRQs sejam mapeadas em interrupções de 8 a 15 e que as 8 últimas seja mapeadas em interrupções de 112 a 119. Isto acaba interferindo com as exceções (o que será visto adiante), de modo que se torna necessário remapear as IRQs para um bloco diferente de números de interrupção.
O PIC, a ponte entre as IRQs e a CPU
Quando ocorre uma interrupção de hardware, uma série de eventos é desencadeada. Para simplificar o processo e aumentar a compatibilidade dos dispositivos nas diferentes plataformas, quando um dispositivo dispara uma IRQ, ele a dirige para o PIC enviando toda a informação necessária. O PIC identifica o número da IRQ e depois avisa a CPU. A CPU, assim que terminar a instrução corrente, executa o número da interrupção recebida.
- Anterior
- Próximo >>