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: 12304
O código que deve ser executado
Poderíamos escolher uma linguagem diferente do Assembly para criar o código que deve ser executado, mas, para não introduzir mais coisas novas do que o estritamente necessário, vamos mantê-la. Mesmo porque o código que deve ser executado já é nosso velho conhecido, pois é muito parecido com o do loader anterior. Veja abaixo:
Este é o programa que será transferido para o buffer de memória pelo loader e depois executado. Nosso loader agora tem um companheiro: um KERNEL! Basta salvá-lo como kernel3.asm - escolhi kernel3, apesar de ser o primeiro, apenas para fazer dupla com o loader3. Compile o código com nasm kernel3.asm -f bin -o kernel3.bin para obter o binário puro. Agora, estamos a um passo do teste final.
O disquete de boot da dupla dinâmica
Desta vez, ao invés do usar o debug.exe para transferir os arquivos para o disquete, vamos usar o PartCopy. Está na hora de conhecer este utilitário fantástico criado pelo John S. Fine. Se você ainda não fez o download, aproveite a oportunidade e baixe a versão 2.0 na seção de downloads (Informática / Utilitários). Descompacte o arquivo zip num diretório próprio e, antes de utilizá-lo, dê uma lida nas instruções.
O utilitário PartCopy
O PartCopy, nome derivado de Partial Copy (cópia parcial), faz o que promete: copia porções contíguas de dados puros entre arquivos e/ou discos. É um programa poderoso e deve ser usado com cautela. O formato do comando de linha do PartCopy é o seguinte:
PARTCOPY fonte offset_fonte comprimento destino {offset_destino}
- O único parâmetro opcional é o offset_destino.
- Os deslocamentos (offset) e o comprimento devem sempre estar em notação HEXAdecimal.
- Se o destino for um arquivo, o offset_destino for omitido e o arquivo existir, ele é deletado. Um novo arquivo será criado.
- Se o destino não for um arquivo, o padrão do offset_destino será 0 (zero) se este for omitido.
- Qualquer nome que não começar com "-" será um nome de arquivo e será acessado usando os serviços da INT 21 do MS-DOS.
- -aL acessa o drive de letra L usando os serviços das INT 25 e INT 26 (Disco Absoluto). Apenas o formato "novo" (cx=0xFFFF) é usado.
- -hN acessa o HD N usando os serviços da INT 13.
- -fN acessa o drive de disquete N usando os serviços da INT 13.
- -iN ou -iAAA:N acessam diretamente a IDE do HD N na interface do endereço AAA (padrão é 1F0). Este acesso usa polling com as interrupções desabilitadas, de modo que controladoras secundárias (e seguintes) possam ser gerenciadas sem a preocupação de qual IRQ estejam conectadas. Nesta versão, o acesso direto à IDE é apenas para leitura.
Transferindo arquivos para disquete
Agora que sabemos como usar o PartCopy e já temos os dois arquivos binários, basta fazer a transferência dos mesmo para um disquete. Para o loader3.bin use
partcopy loader3.bin 0 200 -f0
O arquivo fonte é loader3.bin e seu deslocamento é 0 (zero). Portanto, a transferência começa a partir do seu primeiro byte. O comprimento (a quantidade de bytes que deve ser transferida) é 200 em notação hexadecimal, o que corresponde a 512 decimal. -f0 indica que o destino é o drive de disquete A (o primeiro drive). Como o offset_destino foi omitido, o deslocamento no destino será 0 (zero), fazendo com que o primeiro setor do disquete, o setor de boot, receba os dados transferidos. Para o kernel3.bin use
partcopy kernel3.bin 0 200 -f0 200
A única diferença nesta linha de comando é o offset_destino, cujo valor hexadecimal de 200 corresponde a um deslocamento de 512 bytes. Isto coloca nosso kernel no segundo setor do disquete, logo após o setor do boot.
Testando o Sistema Operacional NumaBoa II
Agora fica a seu critério: você pode simplesmente reiniciar sua máquina com o disquete de boot no drive ou fazer uma imagem do disquete usando o RawWrite e acioná-la usando o Bochs.
Considerações finais
Agora não tem o que reclamar - teve programação e novidade à bessa! Espero que tenha ficado claro o grande passo que demos ao criar a dupla dinâmica loader + kernel. Preciso agradecer novamente o texto de Daniel Marjamäki - Daniels NASM Bootstrap Tutorial - do qual extraí o exemplo para poder criar este módulo. O original você encontra na seção de downloads da Aldeia em Tutoriais / Sistemas Operacionais.
- << Anterior
- Próximo