Musisz jedynie opanować asembler x86 (FASM) na poziomie średniozaawansowanym. Jeśli nie znasz asemblera, ten kurs jest jednym z najlepszych.
Po co pisać nowy system? Jedynie dla celów edukacyjnych. Samemu nie stworzysz systemu dorównującego obecnym, albo mającego podstawowe funkcje.
W tej części opiszę przygotowanie narzędzi i stworzenie absolutnej podstawy systemu operacyjnego.
Edytor tekstu
Warto przygotować sobie dobry edytor tekstu obsługujący składnię asemblera Intela. Dla Windowsa może to być Notepad++. Dla Linuksa najlepiej SciTE.
Kompilator
Używam popularnego Flat Assemblera. Pobieramy go i rozpakowujemy. Następnie używamy go poleceniem:
fasm <source> [output]
Piszemy kod
main.asm
format binary
use16
include "boot.inc"
times 510 - ($ - start) db 0
dw 0AA55h
boot.inc
format binary oznacza, że program jest napisany w formacie binarnym w odróżnieniu od formatu DOS-owego, ELF, wykonywalnego i innych.
Komenda org ustawia bezwzględny adres w pamięci, do którego zostaje załadowany program. Kompilator wymaga tej informacji, by znać adres zadeklarowanych zmiennych. W przypadku bootsektora jest to zawsze szesnastkowo 7C00.
use16 zmienia typ kodu na 16-bitowy.
Następnie kilka instrukcji w pętli powiększa o 1 podwójne słowo (4 bajty) w pamięci pod adresem B800:0000. W tym miejscu zaczyna się pamięć trybu tekstowego.
Instrukcja times 510 - ($ - start) db 0 dopełnia program zerami do 510 bajtów.
Na końcu stawiamy dwa bajty często wymagane przez BIOS - szesnastkowo AA55. Bootsektor ma łącznie pół kilobajta.
Całość kompilujemy poleceniem:
fasm main.asm main.bin
org 7C00h
start:
mov ax, 0B800h
mov es, ax
.loop:
inc dword[es:0]
jmp .loop
format binary oznacza, że program jest napisany w formacie binarnym w odróżnieniu od formatu DOS-owego, ELF, wykonywalnego i innych.
Komenda org ustawia bezwzględny adres w pamięci, do którego zostaje załadowany program. Kompilator wymaga tej informacji, by znać adres zadeklarowanych zmiennych. W przypadku bootsektora jest to zawsze szesnastkowo 7C00.
use16 zmienia typ kodu na 16-bitowy.
Następnie kilka instrukcji w pętli powiększa o 1 podwójne słowo (4 bajty) w pamięci pod adresem B800:0000. W tym miejscu zaczyna się pamięć trybu tekstowego.
Instrukcja times 510 - ($ - start) db 0 dopełnia program zerami do 510 bajtów.
Na końcu stawiamy dwa bajty często wymagane przez BIOS - szesnastkowo AA55. Bootsektor ma łącznie pół kilobajta.
Całość kompilujemy poleceniem:
fasm main.asm main.bin
Maszyna wirtualna
Oczywiście możemy zapisywać system na dyskietce poleceniem linuksowym:
dd if=bootloader.bin of=/dev/fd0
Następnie trzeba uruchomić komputer z dyskietki. Jednakże szybciej i bezpieczniej będzie użyć VirtualBoxa. Po instalacji tworzymy nową maszynę wirtualną. Wybieramy inny typ systemu:
Wystarczy kilkadziesiąt MB pamięci - przechodzimy dalej. Tworzymy wirtualny dysk twardy o rozmiarze kilkudziesięciu MB.
W ustawieniach wybieramy Nośniki.
Wybieramy dyskietkę. Klikamy na ikonkę po prawej stronie.
Pozostaje dodać i wybrać nasz skompilowany obraz main.bin.
Po uruchomieniu tego kodu dwa pierwsze znaki powinny się zmieniać: