Bootloader
-
Wollte ein OS auf Diskette schreiben...
Hab jetzt foldenden Code herausgebracht:org 0x7c00 start: mov ax, 4F00h mov es, ax mov bx, 0F00h mov ah, 02h mov al, 1 mov cl, 2 mov ch, 0 mov dh, 0 mov dl, 0 int 13h jmp [es:bx] times 512-($-$$)-2 db 0 dw 0AA55h
Nun wollte ich fragen ob dieser Code stimmt, bzw. was falsch ist. Wenn ich den Code + Kernel boote passiert nichts. Hier noch der Code der C-Kernels:
void WriteCharacter(unsigned char c, unsigned char forecolour, unsigned char backcolour, int x, int y) { unsigned short attrib = (backcolour << 4) | (forecolour & 0x0F); volatile unsigned short *where; where = 0xB8000 + (y * 80 + x); *where = c | (attrib << 8); }
(hab ich auf die schnelle von www.osdev.org kopiert
).
Ich benütze die GCC als C Compiler und NASM als Assembler.
Ich benütze folgende Befehlszeilenargumente:gcc -c kernel.c -o kernel.o
ld kernel.o -t Linkerfile.txt -o kernel.binnasm bootloader.asm -f bin -o bootloader.bin
Stimmt nun der Bootloader, der Kernel oder die Befehlszeilenargumente nicht?
Dazu noch eine Frage: fangen bei der Diskette die Sektoren ab 0 oder ab 1 an?
-
cpp_1 schrieb:
Stimmt nun der Bootloader, der Kernel oder die Befehlszeilenargumente nicht?
So gefragt: Alle 3 sind nicht ok.
Zum Bootloader:
Fehlerbehandlung fehlt. Kann gut sein, dass das Lesen mit int 0x13, Funktion 2 fehlschlaegt. In diesem Fall solltest du es noch einige Male versuchen. Vor jedem Lesen sollte das Laufwerk mit int 0x13, Funktion 0 zurueckgesetzt werden.Ich denke nicht, dass du nach dem Einlesen wirklich zu [es:bx], also der Adresse, die bei [es:bx] gespeichert ist, springen willst, sondern vielmehr an die Adresse, auf die es:bx zeigt.
Mal abgesehen davon, dass es mich wundert, dass NASM dieses Konstrukt so schluckt, kannst du so eh nichts Passendes formulieren.
Springe also entweder direkt an Adresse (jmp 0x4F00:0x0F00 oder so aehnlich, kenne die genaue Syntax gerade nicht), oder speichere die Adresse irgendwo und mache dann einen indirekten Jump...Zum Kernel:
Dieser Code macht so genau das, was du beobachtest: Gar nichts.Zur Kommandozeile:
Wenn es beim Compilieren keine Fehler gibt, so weit ok. Bleibt offen: Wie verbindest du Bootloader.bin und Kernel.bin und wie bringst du das Ganze auf eine Diskette, bzw. in ein Image?Siehe dazu auch nochmal deinen letzten Thread und meinen schoenen Beitrag hier.
Allgemein kann ich zur OS-Entwicklung auch bochs und seinen Debugger sehr empfehlen.
cpp_1 schrieb:
Dazu noch eine Frage: fangen bei der Diskette die Sektoren ab 0 oder ab 1 an?
Siehe meinen oben verlinkten Beitrag: Bei CHS zaehlen die Sektoren immer von 1 an.
-
Ich kopiere bootloader.bin und kernel.bin per cmd:
copy /b bootlaoder.bin+kernel.bin floppy.img
und schreibe das img mit RawWrite auf Diskette.
Danke für deine Hilfe! Probiere das gleich aus!
-
Kennt jemand einen guten Testkernel?
Hab' jetzt folgenden Code:
org 0x7c00 start: mov ah, 00h mov dl, 0 int 13h call loader retn loader: mov ax, 4F00h mov es, ax mov bx, 0F00h mov ah, 02h mov al, 1000 mov cl, 2 mov ch, 0 mov dh, 0 mov dl, 0 int 13h jmp es:bx retn times 512-($-$$)-2 db 0 dw 0AA55h