2012-03-26 3 views
1

Ich versuche, meinen eigenen Bootloader zu bauen, lädt dann wechselt vom Real-Modus in den geschützten Modus, lädt den GDT-Deskriptor und ruft dann einige Phase 2-Code. Da ich keine gute Möglichkeit finde, meine Programme zu debuggen, war es ein harter Kampf, die Dinge zum Laufen zu bringen. Aus irgendeinem seltsamen Grund schlägt mein Code fehl, den zweiten Sektor meines Bootloaders in Speicher unter 0x1000 Adresse zu lesen. Ich habe versucht, die int 0x13 mit al = 0x01, die eine Get Status of Last Drive Operation Interrupt ist. Es gibt 0x01 zurück, was Invalid Command bedeutet, was mich weiter verwirrt.Laden Sektor von Boot-Image schlägt in Bootloader

mov ah, 0  ;reset drive 
    int 0x13 
    or ah, ah  ;check for error 
    jnz err  ;error handling function (prints ASCII A) 

    mov ax, 0 
    mov es, ax 
    mov bx, 0x1000 ;read sector into 0000:0x1000 

    mov ah, 0x02 ;read sector 
    mov al, 1  ;# of sectors to read = 1 
    mov ch, 0  ;Cylinder = 0 
    mov cl, 0x02 ;Sector to read = 2 (second as first sector is this code) 
    mov dh, 0  ;head = 0 

        ;dl should equal the drive number as BIOS automatically detects it 
    int 0x13 
    or ah, ah 
    jnz err  ;check for error again (this is where the error occurs) 

Wenn der Computer gestartet wird, wie ich höre, dass das BIOS den Laufwerksbuchstaben in das dl Register platziert, so dass alle meine Interrupts sollte auf dem richtigen Laufwerk durchgeführt werden. Ich habe sogar versucht, dl auf 0x00 zu setzen, was gleich dem Diskettenlaufwerk A: wäre, und in BOCHS (CPU-Emulator) setze ich das Diskettenlaufwerk A: auf mein Boot-Image und es würde immer noch nicht booten. Gibt es einen Grund, warum QEMU und BOCHS den Code nicht korrekt emulieren? Ich muss noch versuchen, dies auf einen USB zu brennen und es von einem Live-BIOS zu booten. Ich werde meinen vollständigen Code here veröffentlichen, damit Sie es bei Bedarf überprüfen können. Ich entschuldige mich, wenn ich nicht klar genug bin, bin ich Anfänger bei OS-Entwicklung. Danke vielmals!

Bearbeiten: Betriebssystem: Windows 7 x64 (Entwicklung von x32 OS) Emulation: BOCHS mit boot.img von NASM-Compiler erstellt.

+0

Habe ich Ihre Frage beantwortet? – Stewart

+0

@Stewart Ich schreibe meinen Bootloader um, damit ich ihn testen kann. Ich werde zurückkommen und akzeptieren, sobald ich deinen neuen Code darin einfüge. Mach dir keine Sorgen :) – user99545

Antwort

0

Sie suchen fälschlicherweise nach Fehlern. int 0x13 ah = 0 zeigt zum Beispiel einen Fehler an, indem das Übertrags-Flag gesetzt wird, nicht indem etwas in ah gemeldet wird. Anstatt oder ah, ah jnz err, sollten Sie springen, wenn carry mit jc err eingestellt wird.

Verwandte Themen