2012-04-04 7 views
6

Seit ungefähr einer Woche habe ich ein einfaches OS für Lernzwecke entwickelt und ... "Spaß". VirtualBox und NASM im Schlepptau, ich hatte eigentlich einen guten Start. Schließlich entschied ich, dass ich auch einen Bootloader entwickeln wollte (nachdem ich die 512-Byte-Wand ziemlich hart getroffen hatte), indem ich durch das berüchtigte Brokenthorn tutorial bis zum Laden von Dateisystemen lief.Working FAT16 Bootloader erzeugt Lesefehler auf der tatsächlichen Hardware?

Mit einigen HexFiend Shenanigans und einigen leeren FAT16 Bildern, bekam ich schließlich die BPB ausgearbeitet. Mit einigen zusätzlichen Assembly-Hackereien (die Basis ist Brokenthorns Tutorial, part 6), habe ich auch das Laden von Dateien mit meinem Bootloader gestartet, der die Boot-Datei mit dem passenden Namen von meinem virtuellen Laufwerk lädt (mit dd if =/dev/zero von = boot.img bs = 512 count = 2880)

Also, was ist das Problem dann? Es ist, was ich sehe, wenn ich über einen USB-Stick an aktueller Hardware auf geladen werden (in diesem Fall/dev/disk3, wo die kompilierte Datei ist boot.bin):

dd bs=512 count=1 if=compiled/boot.bin of=/dev/disk3 

Hier ist die erwartete Ausgabe (in VirtualBox):

Current output

im Vergleich zum actual output (auf einem alten Laptop)

Old output

'-' indicates a sector is being loaded 
'_' indicates a sector was loaded 
'!' indicates all of the desired sectors were loaded properly 
'R' indicates a read error 
'T' indicates the FAT table is being loaded 
'D' indicates the FAT table was loaded properly 
'F' means the file is being located (or Found, hence the F) 
'L' means the file is being loaded 

(ich würde tatsächliche Debug-Nachrichten verwendet habe, aber die 512-Byte-Grenze ist ziemlich grausam.)

also der Unterschied ist, dass man ein USB-Stick ist, und man ist eine (virtuelle) Floppy Scheibe. Beide haben die genaue gleiche Informationen auf jedem, einschließlich der BPB geladen. Man arbeitet jedoch, und man tut es nicht. Hier ist der wichtigste Teil meines Codes zum Laden eines Sektors (mit ah 02h/int 13h, was ich hörte war richtig für einen USB):

ReadSectors: 
    mov di, 0x0005     ; How many times should we retry the read? 

ReadSectors.loop: 
    ; DEBUG 
    push ax 
    mov ah, 0eh 
    mov al, '-' 
    int 10h 
    pop ax 
    push ax 
    push bx 
    push cx 
    call LBAToCHS 
    mov ah, 02h      ; Set the interrupt to the 
            ; 'read sector' function 
    mov al, 1      ; Only read one sector 
    mov ch, byte[chs.track]   ; The track to read from 
    mov cl, byte[chs.sector]  ; The sector to read from 
    mov dh, byte[chs.head]   ; The head to read from 
    mov dl, byte[_bpb.driveNumber] ; The drive to read from 
    int 13h       ; Call our 'disk IO' interrupt 
    jnc ReadSectors.success   ; If we successfully read the data, 
            ; we don't have to try again 
    mov ah, 00h      ; Set the interrupt to the 
            ; 'reset disk' function 
    int 13h       ; Call our 'disk IO' interrupt 
    dec di       ; Decrement our error counter 
    pop cx 
    pop bx 
    pop ax 
    jnz ReadSectors.loop   ; Try again if we've failed 
    jmp ReadSectors.fail   ; RED ALERT 

(Der vollständige Quelle, einschließlich der BPB, finden sich unter Pastebin (http://pastebin.com/SeUm7xu6)

ich habe eine Reihe von Problemen mit Montage überwinden, so weit, aber dieses hat mich ratlos. Hoffentlich kann ich an den Bootloader erhalten und abstrakt die Datei IO so schnell wie möglich.

Irgendwelche Vorschläge würden sehr geschätzt werden. Vielen Dank im Voraus!

Antwort

6

Ihr Code liest von Laufwerk Nummer 0, die möglicherweise nicht der Gerät Bootloader geladen wurde (und sehr oft nicht, wenn Sie von USB-Stick booten). Die Laufwerksnummer, von der Sie lesen sollten, wird vom BIOS in das Verzeichnis dl geladen. Es ist bereits ein answered question auf SO.