Oficina
12. O loader Numaboa II
Dom 27 Mai 2007 07:24 |
- Detalhes
- Categoria: Sistemas Operacionais
- Atualização: Quinta, 03 Abril 2008 14:51
- Autor: vovó Vicki
- Acessos: 12344
MÓDULO 12 do SO Numaboa
Depois de dois módulos de pura teoria, está na hora de programar um pouco. Com os conhecimentos recém adquiridos (ou revisados), vamos dar uma melhorada no Sistema Operacional NumaBoa. Desta vez vamos criar um loader que carrega um programa a partir do disco e salta para ele. Aliás, é bom saber que existe um outro nome para o loader: é também chamado de bootstrap.
Desabilitando as interrupções
Sempre é aconselhável acertar a pilha antes de começar a fazer qualquer coisa. Como você já sabe, a pilha também é usada para armazenar valores temporários - PUSH põe um valor no topo da pilha e POP tira o valor do topo da pilha. Acontece que a pilha também é usada por instruções de chamada CALL, as quais colocam o endereço de retorno no topo da pilha. Além disto, quando ocorre uma interrupção, também é executada uma instrução de chamada. Este é o motivo pelo qual precisamos desabilitar as interrupções antes de configurar a pilha. Veja como fazê-lo no exemplo abaixo:
O mnemônico da instrução cli é CLear Interrupts, ou seja, CLarear (ou limpar) o bit de Interrupção. Zerando o bit de interrupção desabilita as chamadas. Em contrapartida, sti deriva de SeT Interrupts e habilita as chamadas.
O registrador do segmento da pilha não pode ser acessado diretamente para evitar erros devidos à falta de atenção. Forçando o programador a fazer transferências indiretas, a possibilidade de erros diminui muito. É por isto que transferimos o endereço desejado para a pilha (9000) inicialmente para AX e, num segundo passo, transferimos este valor para SS. Se você ainda se lembra do duplo endereço, sabe que 9000:0000 indica o segmento 9000 e deslocamento 0000. Colocamos então o deslocamento em SP com a instrução mov sp,0. Terminada a configuração da pilha, podemos habilitar novamente as interrupções.
Identificando o drive de boot
A BIOS costuma estar configurada para procurar setores de boot numa determinada sequência, digamos no drive de disquete e depois no HD. Se nosso sistema operacional estiver em disquete e o disquete estiver inserido no drive, o primeiro setor de boot a ser lido será o do disquete. E se não for este o caso? Qual foi o disco utilizado? Sempre é bom saber, para ficar com a faca e o queijo na mão. Para isto, criamos uma variável bootdrv e lhe atribuímos o valor da identificação do drive logo no início do programa. Sabendo que a identificação do drive de boot é colocada no registrador DX, na sua porção baixa DL, basta acrescentar o seguinte código:
- Anterior
- Próximo >>