Betriebs System Programmierung
 
StartSeite | Neues | TestSeite | ForumSeite | Teilnehmer | Kategorien | Index | Hilfe | Einstellungen | Ändern

ToDo: Einführung


Links:


Der Bootvorgang (BootLoader?)

Wer einen Bootloader für sein eigenes oder ein bereits existierendes Betriebssystem schreiben möchte, benötigt zunächst einmal etwas Erfahrung mit dem Umgang von Assembler. Im Gegensatz zur Entwicklung von Software auf einer bestimmten Plattform müssen hier keine Eigenschaften/-heiten des Systems berücksichtigt werden. Weiterhin sind nur drei Richtlinien zu beachten.

  1. Der BootLoader? muss exakt (!) 512 Bytes groß sein. 512 Byte = 1 Sektor, daher die Bezeichnung BootSector?.
  2. Die letzten zwei Bytes bzw. das letzte Word müssen/muss gleich 0xAA 0x55 bzw. 0xAA55 sein. Dieser "magische" Wert signalisiert dem BIOS, welches den BootLoader? laden und ausführen soll, dass es sich hierbei um einen gültigen BootSector? handelt. Fehlt dieser Wert, wird der BootLoader? gar nicht erst ausgeführt.
  3. So lange man im RealMode? arbeitet, dürfen BIOS-Interrupts verwendet werden. Ein Versuch, system-spezifische Interrupts auszulösen (z. B. ein DOS-Interrupt) würde im Chaos und höchstwahrscheinlich mit einem Absturz enden. Im ProtectedMode? dagegen sind überhaupt keine Interrupts erlaubt, so lange man sie nicht selbst aufgesetzt hat.
Das BIOS lädt den BootSector? (von Diskette, Festplatte etc.) in den Speicher, und speichert ihn an der Adresse 0x0000:0x7C00. Damit im Bootloader Variablen (bzw. deren Adressen (Offsets)) korrekt gehandhabt werden, muss der Programmierer das Daten Segement (data segment) manuell einstellen. In der Regel funktioniert das mit

mov ax, 0x07C0
mov ds, ax

Ich hacke hier schnell mal ein kurzes Beispiel zusammen (NASM Syntax).

BITS 16
jmp START

msg: db "Hello, world!",0x00

START:
cli ; Interrupts abschalten
mov ax, 0x07C0
mov ds, ax
mov ax, 0x9000 ; Den stack aufsetzen
mov ss, ax ; Anfang des Stacks
mov sp, 0xFFFF ; Ende bzw. Größe
sti ; Interrupts wieder anschalten
mov si, msg ; Unsere Nachricht
call PRINT ; Ausdrucken
jmp $ ; Endlos-Schleife

PRINT: mov ah, 0x0E ; BIOS-Funktion zum Ausdrucken eines Zeichens
.LOOP: lodsb ; Zeichen lesen
or al, al ; Überprüfen, ob das Zeichen = 0x00 ist
jz .DONE ; Wenn = 0x00 (Ende des Strings), dann abbrechen
mov bl, 0x09 ; Attribut; 0x09 = blaue Schrift auf schwarzem Hintergrund
xor bh, bh ; VideoPage 1 (sollte die z. Z. aktive sein)
int 0x10 ; BIOS-Interrupt
jmp .LOOP
.DONE: ret

times 510-($-$$) db 0x00 ; Den Rest mit Nullen füllen, um auf die Größe von 510 Bytes zu kommen
dw 0x0AA55 ; plus die letzten zwei "magischen" Bytes sind das 512b, also ein Sektor

Nun gut, das war nicht sehr übersichtlich, und ich kann auch nicht dafür garantieren, dass es funktioniert. Aber es ist ja auch nur ein Beispiel.

Zu assemblen mit dem Befehl

 nasm -fbin -o boot.bin source.asm

Anschließend muss der Loader noch auf eine Floppy geschrieben werden. Dazu können unter Linux die Programme cat und dd benutzt werden.

dd if=boot.bin of=/dev/fd0
oder: cat boot.bin > /dev/fd0

Unter Windows kann das Programm rawrite benutzt werden, das es irgendwo im Internet gibt. (Link?) Mit debug könnte es auch laufen. Meine Windows-Zeiten sind zwar längst vorbei, aber es muss irgendwie so gehen:

debug boot.bin
w 100 1 0 0
oder: w 1 100 0 0
oder: w 0 100 0 1
BITTE UM KORREKTUR!

So, jetzt weißt ich nicht, wie ich weiterschreiben soll. Ich überlege mir das mal und mach dann weiter.

--Lizer


StartSeite | Neues | TestSeite | ForumSeite | Teilnehmer | Kategorien | Index | Hilfe | Einstellungen | Ändern
Text dieser Seite ändern (zuletzt geändert: 31. August 2007 13:50 (diff))
Suchbegriff: gesucht wird
im Titel
im Text