niedziela, 31 października 2010

Pisanie systemów operacyjnych cz. 1

Może zawsze zastanawiałeś się, jak pisze się systemy operacyjne od zera. Nawet jeśli nie, to jeśli masz wiedzę informatyczną ten kurs jest dla Ciebie. Podobne kursy po polsku sięgają jedynie GDT. W j. angielskim polecam OSDev.
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
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ć:

Brak komentarzy:

Prześlij komentarz