Bootloader - Ladeproblem



  • Hallo, hoffe es ist okay, dass ich hier eine Frage stelle, obwohl das nichts mit eurem PrettyOS zu tun hat?
    Falls nicht, bitte einfach löschen...

    Also, ich habe mir auch mal vorgenommen, etwas OS ähnliches zu basteln. Ich möchte von fast Null anfangen, deswegen tüftel ich gerade an einem Bootloader, welcher in den MBR der Festplatte kommt und der dann meine FAT32-Partition mit dem nächsten Bootloader läd...
    Zunächst einmal ein paar Infos: Ich benutze einen USB-Stick, welcher eine FAT32-Partition besitzt, welche als "bootable" markiert ist...
    Zum kompilieren verwende ich momentan NASM.
    Als Emulator verwende ich QEMU (bin unter Ubuntu unterwegs), als "echten" PC meinen Laptop.

    So, nun zum Problem. Mein Bootloader kopiert sich selbst zunächst einmal aus dem Weg. Dann liest er den 1. Sektor der Festplatte ein und sucht den CHS-Eintrag der Partitionstabelle für die FAT-32 Partition.
    Anschließend wird der 1. Sektor der Partition nach 0x7C00 geladen... und dann beginnt das Problem. Zum Testen versuche ich anschließend, den OEM-Namen auszugeben, welcher theoretisch jetzt bei 0x7c00 + 3 liegen sollte. Im Emulator funktioniert das auch, versuche ich das am echten PC, kommt im besten Fall Müll heraus.
    Hier der relevante Code:

    [ORG 0x8000]
    ; Bootloader nach 0x8000 verschieben...
    ; ...
    ; ...
    ; Partitionstabelle parsen und nach dem bootable Flag (0x80) suchen.
    ; DI zeigt nun genau auf den CHS-Eintag für den ersten Sektor der Partition
    mov		AH, [DI]			; head
    mov		BL, [DI+1]			; sector
    mov		BH, [DI+2]			; cylinder / track
    
    mov		AL, 1
    mov		CH, BH
    mov		CL, BL
    mov		DH, AH
    mov		BX, 0x7C00
    mov		AH, 2
    mov		DL, [g_BootDrive]
    int		0x13
    jnc		.finish
    ; ...
    .finish:
    mov		SI, 0x7C00
    add		SI, 3
    call	        rmPrintString16    ; Emulator sagt "mkdosfs", PC sagt null...
    

    Mit freundlichen Grüßen!



  • Hallo,

    ich habe leider keine Lösung für den Threadstarter, aber eine weitere Frage:

    Mit welchem/welchen Bios-Interrupt(s) kann ich Bytes von der Festplatte/sonstigem Medium laden?



  • sorry-hab auch ne frage schrieb:

    Mit welchem/welchen Bios-Interrupt(s) kann ich Bytes von der Festplatte/sonstigem Medium laden?

    Hi, das siehst du sogar in meinem Code 😉
    int 0x13 wäre das
    Kleiner Tipp, schau mal http://www.ctyme.com/intr/cat.htm



  • Hallo, hoffe es ist okay, dass ich hier eine Frage stelle, obwohl das nichts mit eurem PrettyOS zu tun hat?

    Ja klar.

    mov     AH, [DI]            ; head
    mov     BL, [DI+1]          ; sector
    mov     BH, [DI+2]          ; cylinder / track
    

    Warum kopierst Du die werte nicht gleich an Ort und Stelle?

    Ist das Register ES gesetzt? Die 0x13-funktion schreibt ja nach ES:BX...



  • Hi, hab das nur zur besseren Übersicht (für mich) in die Register geschoben, hatte keine tieferen Gründe.
    ES ist 0.

    Gruß


Anmelden zum Antworten