Я сейчас разрабатываю операционную систему для класса. ОС отлично загружается как на реальном оборудовании, так и на QEMU. Тем не менее, мне нужно, чтобы он загружался на Virtualbox или DOSBox, так как я работаю над тем, чтобы заставить работать Soundblaster 16. Мне нужно использовать прямой режим, но QEMU поддерживает только передачи DMA на Soundblaster. Я загружаюсь в qemu с:
qemu-system-i386 \
-cpu "SandyBridge-v2" \
-m 256M \
-no-reboot \
-drive format=raw,file=usb.image \
-serial stdio \
-smp 1 \
-usb \
-vga std \
-soundhw sb16
DOSBox может обрабатывать мой img-файл напрямую, но Virtualbox нужен VMDK. Я создаю файл VMDK, который сопоставляется с необработанным IMG с:
VBoxManage internalcommands createrawvmdk -filename OS.VMDK -rawimage os.img
В обоих случаях загрузчик, который мне дали, дает сбой в этом разделе кода:
/*
** Read one complete program block into memory.
**
** ax: number of sectors to read
** es:bx = starting address for the block
*/
readprog:
pushw %ax /* save sector count */
movw $3,%cx /* initial retry count is 3 */
retry:
pushw %cx /* push the retry count on the stack. */
movw sec,%cx /* get sector number */
movw head,%dx /* get head number */
movb drive, %dl
movw $0x0201,%ax /* read 1 sector */
int $0x13
jnc readcont /* jmp if it worked ok */
movw $err_diskread,%si /* report the error */
call dispMsg
popw %cx /* get the retry count back */
loop retry /* and go try again. */
movw $err_diskfail,%si /* can't proceed, */
call dispMsg /* print message and freeze. */
jmp .
Диск инициализируется следующим образом:
/* get drive parameters to determine number of heads and sectors/track */
xorw %ax, %ax /* set ES:DI = 0000:0000 in case of BIOS bugs */
movw %ax, %es
movw %ax, %di
movb $0x08, %ah /* get drive parameters */
movb drive, %dl /* hard disk or floppy */
int $0x13
Я предполагаю, что виртуальная материнская плата в Virtualbox и DOSBox настроена неправильно, либо неправильно реагирует на прерывание 0x13, либо неправильно установлено смещение, вызывающее загрузчик попытаться получить неверные или ненужные данные. В DOSBox и Virtualbox загрузчик распечатывает:
Read failed
Read failed
Read failed
Can’t proceed
Сама ОС печатает это из предоставленного мною фрагмента кода, а не из Virtualbox или DOSBox