Construindo um Sistema Operacional Mínimo com Ferramentas de Código Aberto

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 ...

Tags: operating-system-development nasm assembly multiboot linker-scripts

Publicado em 7-27 05:56