2012-04-04 2 views
6

В течение прошлой недели я разрабатывал простую ОС для учебных целей и ... «весело». VirtualBox и NASM на буксире, я действительно очень хорошо начал. В конце концов, я решил, что я хотел бы также развить загрузчик (после довольно сильно ударить по 512-байтовой стене), включив пресловутый Brokenthorn tutorial, вплоть до момента загрузки из файловых систем.Рабочий загрузчик FAT16 генерирует ошибку чтения на фактическом оборудовании?

С некоторыми синтаниганами HexFiend и некоторыми пустыми изображениями FAT16 я в конечном итоге получил BPB. С некоторыми дополнительными ассемблерами сборки (основой является учебник Brokenthorn, part 6), я также загрузил загрузку файлов с моим загрузчиком, который загружает файл с загрузкой aptly-named с моего виртуального диска (сделанный с использованием dd if =/dev/zero = boot.img bs = 512 count = 2880)

Итак, в чем же проблема? Это то, что я вижу, когда я загружаю на имеющееся оборудование через флешку (в данном случае/DEV/disk3, где скомпилированный файл boot.bin):

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

Вот ожидаемый результат (в VirtualBox):

Current output

по сравнению с actual output (на старом ноутбуке)

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 

(я использовал бы фактических отладочных сообщения, но лимит 512 байт довольно ужасный.)

Таким образом, разница в том, что один является USB палки, и один есть (виртуальная) дискета диск. Они оба имеют точные одинаковые данные, загружаемые на каждый, включая BPB. Тем не менее, один работает, а другой нет. Вот основная часть моего кода для загрузки сектора (с использованием ах 02h/INT 13h, который я слышал, работало должным образом для 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 

(полного источника, в том числе ВРВА, можно найти на Pastebin (http://pastebin.com/SeUm7xu6)

я преодолел ряд вопросов, с Ассамблеей до сих пор, но это один имеет меня в тупик. Надеюсь, я могу пройти загрузчик и абстрагировать файл IO как можно скорее.

Любые предложения были бы очень благодарны. Спасибо заранее!

ответ

6

Ваш код читается с номера диска 0, который не может быть загружен загрузчиком устройства (и очень часто это не так, если вы загружаетесь с USB-накопителя). Номер диска, который вы должны прочитать, загружается BIOS в регистр dl. Это уже answered question на SO.

Смежные вопросы