Pra*_*hal 2 c assembly operating-system grub qemu
我正在学习操作系统制作的基础知识.我已经制作了一个兼容多引导头的.asm文件和一个.c文件..asm文件中的代码调用.c文件的主函数.
问题是QEMU无法从编译和链接.asm和.c文件后生成的文件启动.
它只是说它找不到可启动的设备.
虽然,我能够从一个简单的.asm文件启动,如: -
mov ax, 0x0e
mov al, 'H'
int 10h
times 510 - ($ - $$) db 0
jmp $
dw 0xaa55
Run Code Online (Sandbox Code Playgroud)
我还有什么需要做的吗?
QEMU 2.0.0确实支持多重启动
man qemu 说:
-kernel bzImage
使用bzImage作为内核映像.内核可以是Linux内核,也可以是多引导格式.
我已经上传了一个最小的hello world示例:https://github.com/cirosantilli/x86-bare-metal-examples/tree/dbbed23e4753320aff59bed7d252fb98ef57832f/multiboot
它生成一个GAS + C多引导文件,并使用QEMU来运行它.
grub-mkrescue还可以将多引导二进制转换为可引导.iso映像,这是另一种好方法.
Barry 提到不支持multiboot2.如何在需要测试的情况下生成multiboot2映像:如何在multiboot2中编译简单内核?
Dre*_*wen -1
QEMU 没有对多重引导的本机支持。相反,您需要创建一个虚拟硬盘驱动器映像并安装某种多重引导引导加载程序(例如 grub),然后将多重引导映像放在驱动器上的某个位置(即分区上的文件中)。
至于实际将 grub 安装到虚拟 HDD 上,有多种方法可以实现,但这是我经常使用的过程:
qemu-img或dd if=/dev/zero创建硬盘映像。qemu使用空白 HDD 映像和 ISO启动-hda <HDD-image-filename> -cdrom <ISO-file-name> -boot once=d。最后一位确保qemu将首先尝试从 CD 启动。fdisk/ parted/etc 格式化磁盘。grub-install.然后,您将能够启动 HDD 映像并使用 grub 或您选择的任何加载程序来启动多重启动映像。
您的简单 ASM 示例之所以有效,是因为您有效地模拟了 MBR(典型硬盘驱动器的第一个扇区),因此 QEMU 的 BIOS 将从它启动(具体来说,它会看到该0xaa55签名)。