В течение прошлой недели я разрабатывал простую ОС для учебных целей и ... «весело». 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):
по сравнению с actual 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 как можно скорее.
Любые предложения были бы очень благодарны. Спасибо заранее!