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