如何在多引导头文件中正确使用QEMU

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)

我还有什么需要做的吗?

Cir*_*四事件 9

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中编译简单内核?

  • QEMU 目前只能引导到 multiboot1 头文件。尚不支持 multiboot2。 (2认同)

Dre*_*wen -1

QEMU 没有对多重引导的本机支持。相反,您需要创建一个虚拟硬盘驱动器映像并安装某种多重引导引导加载程序(例如 grub),然后将多重引导映像放在驱动器上的某个位置(即分区上的文件中)。

至于实际将 grub 安装到虚拟 HDD 上,有多种方法可以实现,但这是我经常使用的过程:

  1. 使用qemu-imgdd if=/dev/zero创建硬盘映像。
  2. 下载 Linux 安装程序 ISO(我通常使用 Arch Linux)。
  3. qemu使用空白 HDD 映像和 ISO启动-hda <HDD-image-filename> -cdrom <ISO-file-name> -boot once=d。最后一位确保qemu将首先尝试从 CD 启动。
  4. 使用fdisk/ parted/etc 格式化磁盘。
  5. 挂载您的引导分区(您想要安装 grub 的分区)并使用grub-install.
  6. 卸载并关闭模拟器。

然后,您将能够启动 HDD 映像并使用 grub 或您选择的任何加载程序来启动多重启动映像。


您的简单 ASM 示例之所以有效,是因为您有效地模拟了 MBR(典型硬盘驱动器的第一个扇区),因此 QEMU 的 BIOS 将从它启动(具体来说,它会看到该0xaa55签名)。

  • QEMU 确实支持多重引导。`-kernel` 选项允许您指定一个兼容多重启动的 ELF 可执行文件,并且它将从中启动。它不支持多重启动2 (7认同)