Я пытаюсь создать свой собственный загрузчик, который загружает, затем переключается из реального режима в защищенный режим, загружает дескриптор GDT и затем вызывает некоторый код этапа 2.Так как я не могу найти хороший способ отладки своих программ, это было тяжелое сражение, чтобы заставить вещи работать.По какой-то странной причине мой код не может прочитать второй сектор моего загрузчика в память по адресу 0x1000
.Я попытался использовать int 0x13
с al = 0x01
, что является Get Status of Last Drive Operation
прерыванием.Он возвращает 0x01
, что означает Invalid Command
, что смущает меня еще больше.
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)
Когда компьютер загружается, мне говорят, что BIOS помещает букву диска в регистр dl
, поэтому все мои прерывания должны выполняться на правильном диске.Я даже попытался установить dl
на 0x00
, что было бы равносильно дисководу гибких дисков A:
, и в BOCHS (эмуляторе ЦП) я установил дисковод гибких дисков A:
в свой загрузочный образ, но он все равно не загрузился.Есть ли какая-то причина, почему QEMU и BOCHS не будут корректно эмулировать код?Я еще не попробовал записать это на USB и загрузить с живого BIOS.Я опубликую свой полный код здесь , чтобы вы могли просмотреть его при необходимости.Я прошу прощения, если я не достаточно ясно, я новичок в разработке ОС.Большое спасибо!
Редактирование: ОС: Windows 7 x64 (разработка x32 OS). Эмуляция: BOCHS работает с boot.img, созданным компилятором NASM.