There are a lot of question on stackoverflow with the similar title. I read all of them, but none of them answers my problem. This is why I opened this question.
I am creating an operating system in assembler and C. I found that I must compile C code to binary format, extract text section and save it as a file, then convert it to ISO, then mount it to virtual optical dive of diskete and then load my OS in VirtualBox. So, that is a lot of work I want to avoid. I don't want to convert my binary file to ISO every time.
So, I decided to put the binary machine code of my OS to virtual hard drive (VDI
file) and then set it to the top of boot order and load it instead of loading from virtual optical drive ISO
.
I was researching how VDI
works and I found that it is usually dinamically allocated and that only the beginning of data is stored. So, the start of VDI
represents a header and the the rest is actual data stored on virtual drive. So, I found that data starts at some address (in my case it is 0x00200000
from the start of the VDI
file).
Then, I basically filled from that address to the end of VDI
file with pattern 55 AA
. So, I suppose it now means that the disk is bootable (because at the end of first sector is still signature 55 AA
).
I started virtual machine and it says:
No bootable medium found! System halted
Is there any way to solve this? Why is my virtual disk still not bootable?
Edit
Here is actual VDI
file: 1.vdi
You don't provide a minimal complete verifiable example showing a bootloader and how you get it into a VDI. But at a minimum you'll need to place 0xAA55 in the last 2 bytes of the master boot record. The example below creates a simple bootloader; creates a 2MiB raw image; places the bootloader in the raw image; and converts the raw image to a VDI.
boot.asm
:I then use this command to create the bootloader file
boot.bin
:Create a 2MiB disk image file
1.raw
:Place the bootloader
boot.bin
at beginning of file1.raw
without truncating the rest of file:Create a VDI image called
1.vdi
from1.raw
:When added to a virtual machine under VirtualBox I get this on the display:
Your VDI File
In your supplied image file
1.vdi
I noticed this when I did ahexdump
:This output suggests to me that you reversed the bytes of the boot signature in your file. It should be 0x55 followed by 0xaa. 0xaa55 as a WORD is stored with the bytes reversed.
Valid boot medium may be more than just getting the boot signature correct. Some BIOSes may search for certain instructions in the first few bytes that are typically found in bootloaders. Failure to find such instructions (examples often include things like JMP, XOR, CLI, MOV) may cause it to think that it isn't valid boot medium.
One way to test whether 0xAA55 at the end is enough by itself I used hexedit and modified your
1.vdi
file to look like this:Running with that change alone didn't work. I then used hexedit and placed a CLI opcode (0xFA) as the first byte of the sector. The resulting file now looked like:
I have placed
fa
as the first byte int the bootloader. Now when I use your image the error No bootable medium found! System halted no longer appears. This suggests that VirtualBox is looking for more than a boot signature, and is doing some kind of sanity check to determine if the start of the bootloader appears to be executable instructions. This is not uncommon for BIOSes. Some may do such a check, some may not. At this time I haven't looked over the VirtualBox source code to determine the exact checks it performs to make its determination.