Ошибка контроллера (20h) для int 13h для записи загрузчика - PullRequest
2 голосов
/ 03 мая 2019

Я сейчас пишу загрузчик и не могу сделать никакого прогресса.Работа моего загрузчика состоит в том, чтобы загрузить некоторый код (написанный на C) с эмулируемой дискеты и выполнить его.Однако части чтения диска, которые используют int 13h, терпят неудачу с кодом ошибки 20h (Ошибка контроллера).Я не смог найти никакого описания того, что именно означает эта ошибка.

Я уже просмотрел многочисленные учебные пособия, вопросы переполнения стека и вики разработчика ОС, и я проверял код для чтения с диска более 10 рази попробовал немного вещей с изменением параметров, но я не делаю никакого прогресса сейчас.Возможно, проблема не в коде, а в самом образе (который я запускаю с Qemu как дискета).Я создаю образ, компилируя фактический код загрузчика (который работает и работает до сих пор, поэтому подпись и т. Д. Должны быть правильными), а затем добавляю скомпилированный код C.Я проверяю с помощью hexdump, и код находится по адресу 0x200, сразу после подписи, так что это должно быть правильно.Я подозревал, что чтение одного сектора превышает фактический размер изображения, поэтому я заполняю файл нулями.

Вот раздел ассемблера:

// Number of sections
    mov $0x1, %al

    // 0x2 - Read sections
    mov $0x2, %ah

    // Section number (starting from 1)
    mov $0x2, %cl

    // Boot device and head (0)
    mov $0x0, %dx

    // Cylinder
    mov $0x0, %ch

    // Dest Address
    mov $0x7E00, %bx
    mov %bx, %es
    mov $0x0, %bx

    int $0x13
    jc .disk_error

Вот как я собираю и запускаюизображение (с make):


os.bin: bootloader.bin kernel.bin
    cat bootloader.bin kernel.bin > os.bin
    dd if=/dev/zero bs=1 count=1024 >> os.bin

run: os.bin
    qemu-system-x86_64 -drive format=raw,file=os.bin

Я также могу опубликовать hexdump, если это полезно.

Ожидаемый результат: а равно 0, а al равно 1, флаг переноса незадавать.По адресу 0x7E00 находится код, который я загрузил с дискеты.

Фактический результат: ах равен 20h, установлен флаг переноса.После адреса 0x7E00 остаются только нули.

...