Virtualbox issues

Question about which tools to use, bugs, the best way to implement a function, etc should go here. Don't forget to see if your question is answered in the wiki first! When in doubt post here.
Post Reply
alextaffe
Posts: 1
Joined: Tue Apr 28, 2020 8:25 am

Virtualbox issues

Post by alextaffe »

I’m working on developing my own OS for a class. The OS boots fine on qemu and real hardware. However, I cannot for the life of me make it work on Virtualbox or DOSBox, which I need for Soundblaster 16 direct mode (QEMU only supports DMA transfers). I’m running the OS with:

Code: Select all

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 can work with the .img file natively, for Virtualbox I’m using the following command to link a VMDK to the img. I’ve tried selecting the DOS preset, Other preset, and Other 64 bit preset:

Code: Select all

VBoxManage internalcommands createrawvmdk -filename OS.vmdk -rawdisk os.img
We were given a boot loader and it seems to always fail here:

Code: Select all

/*
** 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	.
In Virtualbox and DOSBox, the OS just spits out "Read failed" 3 times and "Can’t proceed” before halting (those strings are constants in the boot loader). I haven’t had luck with getting Bochs to even attempt to start. My guess is some offset is wrong and the boot loader is failing to calculate where it’s supposed to be reading from, or interrupt 0x13 isn’t working properly due to the virtual motherboard being configured incorrectly. I’m just confused as to why it works on real hardware and qemu but not Virtualbox nor DOSBox.
Octocontrabass
Member
Member
Posts: 5575
Joined: Mon Mar 25, 2013 7:01 pm

Re: Virtualbox issues

Post by Octocontrabass »

You haven't included enough information to say exactly what's wrong, but the most common mistake in legacy BIOS bootloader development is using uninitialized registers. It could also be a problem in how the CHS address is being calculated.
User avatar
iansjack
Member
Member
Posts: 4703
Joined: Sat Mar 31, 2012 3:07 am
Location: Chichester, UK

Re: Virtualbox issues

Post by iansjack »

Have a look here for suggestions as to how to use a raw disk image with VirtualBox.

https://lira.epac.to/MyPublicWiki/VBox: ... alBox.html
Post Reply