Ambiente de Hospedeiro
Este guia assume o uso de um sistema Ubuntu 14.10 como base para desenvolvimento. Assegure-se de ter as ferramentas necessárias instaladas.
apt-get install build-essential nasm genisoimage bochs bochs-sdl
Compilação do Carregador Multiboot
Crie um arquivo em Assembly para o carregador (loader) do sistema operacional. O código abaixo define os cabeçalhos Multiboot necessários e um ponto de entrada que coloca um valor no registrador EAX antes de entrar em um laço enfinito.
global ponto_de_entrada
NUMERO_MAGICO equ 0x1BADB002
BANDEIRAS equ 0x0
SOMA_VERIFICACAO equ -NUMERO_MAGICO
section .text:
align 4
dd NUMERO_MAGICO
dd BANDEIRAS
dd SOMA_VERIFICACAO
ponto_de_entrada:
mov eax, 0x12345678 ; Valor de teste
laco:
jmp laco
Compile o carregador usando o NASM:
nasm -f elf32 loader.s -o loader.o
Linkagem do Kernel
Defina um script de linkagem para organizar as seções do kernel e carregá-lo a partir do endereço 1MB. Altere o ponto de entrada para corresponder ao símbolo no código Assembly.
ENTRY(ponto_de_entrada)
SECTIONS {
. = 0x00100000;
.text ALIGN (0x1000) {
*(.text)
}
.rodata ALIGN (0x1000) {
*(.rodata*)
}
.data ALIGN (0x1000) {
*(.data)
}
.bss ALIGN (0x1000) {
*(COMMON)
*(.bss)
}
}
Execute o linker para gerar o executável do kernel:
ld -T link.ld -melf_i386 loader.o -o kernel.elf
Empacotamento em Imagem ISO
Baixe um estágio de bootloader compatível e crie a estrutura de diretórios para a imagem ISO.
wget http://littleosbook.github.com/files/stage2_eltorito
Use um script para montar a imagem ISO com o GRUB como bootloader.
#!/bin/bash
mkdir -p iso/boot/grub
cp stage2_eltorito iso/boot/grub/
cp kernel.elf iso/boot/
echo "default=0
timeout=0
title MeuOS
kernel /boot/kernel.elf" > iso/boot/grub/menu.lst
genisoimage -R \
-b boot/grub/stage2_eltorito \
-no-emul-boot \
-boot-load-size 4 \
-A MeuOS \
-input-charset utf8 \
-quiet \
-boot-info-table \
-o meu_os.iso \
iso
Execução no Emulador Bochs
Configure o Bochs para carregar a imagem ISO. Salve a seguinte configuração em um arquivo bochsrc.txt.
megs: 32
display_library: sdl
romimage: file=/usr/share/bochs/BIOS-bochs-latest
vgaromimage: file=/usr/share/bochs/VGABIOS-lgpl-latest
ata0-master: type=cdrom, path=meu_os.iso, status=inserted
boot: cdrom
log: bochslog.txt
clock: sync=realtime, time0=local
cpu: count=1, ips=1000000
Inicie a simulação. Note que pode ser necessário executar em uma interface gráfica local para evitar problemas com a biblioteca SDL.
bochs -f bochsrc.txt -q
Verificação do Funcionamento
Após encerrar a simulação (clique no botão de energia na janela do Bochs), examine o log gerado. O kernel carrega o valor 0x12345678 no registrador EAX, o que deve ser refletido no log.
Exemplo de saída no bochslog.txt:
... RAX=0000000012345678 ...