Сбой загрузки сектора из образа загрузки в загрузчике - PullRequest
1 голос
/ 26 марта 2012

Я пытаюсь создать свой собственный загрузчик, который загружает, затем переключается из реального режима в защищенный режим, загружает дескриптор 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.

1 Ответ

0 голосов
/ 26 марта 2012

Вы проверяете ошибки неправильно. int 0x13 ah = 0, например, указывает на ошибку, устанавливая флаг переноса, а не сообщая что-то в ах. Вместо или ах, ах jnz err, вы должны прыгать, если перенос установлен с использованием jc err.

...