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

    nasm 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
    

Anmelden zum Antworten