Reputation: 6492
I am learning the basic of OS making. I have made a multi boot header compliant .asm file and a .c file. The code in the .asm file calls the main function of .c file.
The problem is that QEMU is unable to boot from the file produced after the compilation and linking of the .asm and the .c file .
It simply says that it can't find a bootable device.
Although, I am able to boot from a simple .asm file like :-
mov ax, 0x0e
mov al, 'H'
int 10h
times 510 - ($ - $$) db 0
jmp $
dw 0xaa55
Is there something more which I have to do?
Upvotes: 5
Views: 7162
Reputation: 382532
QEMU 2.0.0 does support multiboot
man qemu
says:
-kernel bzImage
Use bzImage as kernel image. The kernel can be either a Linux kernel or in multiboot format.
I have uploaded a minimal hello world example at: https://github.com/cirosantilli/x86-bare-metal-examples/tree/dbbed23e4753320aff59bed7d252fb98ef57832f/multiboot
It generates a GAS + C multiboot file, and uses QEMU to run it.
grub-mkrescue
can also convert a multiboot binary to a bootable .iso
image which is another good approach.
Barry mentions that multiboot2 is not supported. How to generate a multiboot2 image in case you want to test it: How to compile the simple kernel in multiboot2 Spec corrently?
Upvotes: 11
Reputation: 317
No, QEMU does have native support for the old multiboot spec, although it does not support VBE, ex.. Just compile from a freestanding compiler with the correct legacy multiboot header into an ELF executable and run with the -kernel option
Upvotes: -1
Reputation: 11706
QEMU doesn't have native support for multiboot. Instead, you'll need to create a virtual hard drive image and install some sort of multiboot boot loader (such as grub), then put your multiboot image somewhere on the drive (i.e. in a file on a partition).
As far as actually installing grub onto a virtual HDD, there's multiple ways to do it, but here's the process I always use:
qemu-img
or dd if=/dev/zero
to create your HDD image.qemu
with the blank HDD image and ISO using -hda <HDD-image-filename> -cdrom <ISO-file-name> -boot once=d
. The last bit ensures qemu
will try to boot from CD first.fdisk
/parted
/etc to format the disk.grub-install
.Then, you'll be able to boot off the HDD image and use grub or whatever loader you choose to boot your multiboot image.
The reason your simple ASM example works is because you're effectively emulating the MBR, the first sector of a typical hard drive, so QEMU's BIOS will boot from it (specifically, it sees that 0xaa55
signature).
Upvotes: 0