Olá a todos! Hoje vamos escrever um gerenciador de inicialização que exibirá "Hello World" e o executará no VirtualBox. Vamos escrever em assembler FASM. Você pode baixá-lo aqui . Também precisaremos do VirtualBox e UltraISO . Antes de escrever o código, entenderemos como os sistemas operacionais são carregados.Portanto, quando pressionamos o grande botão liga / desliga do computador, o sistema é iniciado, que está em qualquer computador - BIOS (sistema básico de entrada / saída ou sistema básico de entrada / saída). A tarefa do BIOS é:
- Detecte todos os dispositivos conectados e verifique sua operabilidade. O programa POST (Autoteste de inicialização, autoteste de inicialização) é responsável por isso. Se o ferro vital não for detectado, o alto-falante do sistema (se houver) guiará algo incompreensível e o download não irá mais longe.
- Forneça ao sistema operacional funções para trabalhar com hardware.
- Leia o primeiro setor do dispositivo de inicialização no segmento zero da RAM no deslocamento 0x7C00h e transfira o controle para lá. 1 setor no disco tem 512 bytes. Portanto, nosso carregador de inicialização não deve exceder 512 bytes. O BIOS determina que o setor é inicializável pela presença de 0x55 e 0xAA em seus últimos dois bytes.
Agora você pode começar a escrever o código. Execute o arquivo FASMW.EXE, localizado no arquivo morto com FASM, e insira o seguinte código:org 7C00h
start:
cli ; ( )
xor ax, ax ; ax
mov ds, ax ; dataSegment
mov es, ax ; es
mov ss, ax ; StackSegment
mov sp, 07C00h ;
sti ;
;
mov ax, 3
int 10h
mov ah, 2h
mov dh, 0
mov dl, 0
xor bh, bh
int 10h
;
mov ax, 1301h
mov bp, message
mov cx, 12
mov bl, 02h
int 10h
jmp $
message db 'Hello World!',0
times 510 - ($ - $$) db 0 ; 510-
db 0x55, 0xAA ;
Este código requer uma pequena explicação. O timeorg 7C00h
dizemos que o código precisa ser carregado na RAM em 0x7C00. Nas linhas mov ax, 3
int 10h
configuramos o modo de vídeo para 80x25 (80 caracteres por linha e 25 linhas) e, assim, limpamos a tela. mov ah, 2h
mov dh, 0
mov dl, 0
xor bh, bh
int 10h
Aqui nós ajustamos o cursor. A função 2h interrupção 10h é responsável por isso. No registro dh, colocamos a coordenada do cursor em Y e no registro dl em X. mov ax, 1301h
mov bp, message
mov cx, 12
mov bl, 02h
int 10h
Nós imprimimos uma linha. A função 13h interrupção 10h é responsável por isso. No registrador bp, colocamos a própria string, no registrador cx, o número de caracteres na string, no registrador bl, o atributo; no nosso caso, a cor será verde. Os primeiros 4 bits afetam a cor do plano de fundo, os segundos 4 bits afetam a cor do texto. Abaixo está a cartela de cores0 - , 1 - , 2 - , 3 - , 4 - , 5 - , 6 - , 7 - -, 8 - -, 9 - -, A - -, B - -, C - -, D- -, E - -, F – .
Na linhajmp $
O programa congela.Compilamos o código pressionando Ctrl + F9 e salvamos o arquivo resultante como boot.bin.Lançamento
Inicie o UltraISO e arraste nosso binário para uma área especial (marcada com uma seta vermelha).
Em seguida, clique com o botão direito do mouse no binarink e pressione o botão com a seguinte inscrição: “Instalar como arquivo de inicialização”. Em seguida, salve nosso arquivo no formato ISO.Abra o VIrtualBox e crie uma nova máquina virtual (se você não souber como fazer isso, clique aqui ). Então, depois de criar a máquina virtual, clique em "Configurar, selecione o item" Mídia ", clique em" Vazio ", onde" Unidade "é o ícone do disco óptico. Nós clicamos nele e selecionamos “Selecionar imagem de disco óptico”, procuramos nosso arquivo ISO, clique em “Abrir”. Salvamos todas as configurações e iniciamos a máquina virtual. Nosso "Olá, mundo!" Aparece na tela.![](https://habrastorage.org/webt/x3/m8/qh/x3m8qhqve5i2larphfrcec6sz6g.jpeg)
Sobre isso, a primeira edição chega ao fim. Na próxima parte, ensinaremos nosso gerenciador de inicialização a ler setores de disco e inicializar seu primeiro kernel!