A Aldeia Numaboa ancestral ainda está disponível para visitação. É a versão mais antiga da Aldeia que eu não quis simplesmente descartar depois de mais de 10 milhões de pageviews. Como diz a Sirley, nossa cozinheira e filósofa de plantão: "Misericórdia, ai que dó!"

Se você tiver curiosidade, o endereço é numaboa.net.br.

Leia mais...

Oficina

12. O loader Numaboa II

Dom

27

Mai

2007


07:24

(7 votos, média 3.86 de 5) 


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:

mov ax, 1000h ; Põe endereço em AX mov ds, ax ; Atualiza o segmento de dados mov es, ax ; Atualiza o segmento extra mov si, msg ; Aponta para a string da mensagem call poeString ; Chama a função para imprimir a mensagem pendura: ; Apenas pendura jmp pendura ; Imprime uma string terminada em 0 (SI=ponteiro para a string) poeString: lodsb ; Copia o byte em DS:SI para AL e incrementa SI or al,al ; Verifica se o byte lido é zero jz short volta ; Se sim, salta para volta mov ah,0x0E ; Serviço 0E da INT 10 da BIOS (Imprimir caracter) mov bx,0x0007 ; Imprimir branco em fundo preto int 0x10 ; Imprimir caracter jmp poeString ; Pegar próximo caracter volta: retn ; Terminada a tarefa, voltar ao ponto de chamada msg db 'Sistema Operacional NumaBoa II',13,10,0

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.

покер турниры онлайнсковорода гриль с антипригарным покрытием купитьотзыв написатьноутбук acerалександр лобановскийtranslate thisбиол

Informações adicionais