Получение пользовательской ОС для загрузки на Virtualbox - PullRequest
0 голосов
/ 28 апреля 2020

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

...