4

我正在学习操作系统制作的基础知识。我制作了一个多引导头兼容的 .asm 文件和一个 .c 文件。.asm 文件中的代码调用了 .c 文件的 main 函数。

问题是 QEMU 无法从 .asm 和 .c 文件编译链接后生成的文件启动。

它只是说它找不到可启动设备。

虽然,我可以从一个简单的 .asm 文件启动,例如:-

  mov ax, 0x0e
  mov al, 'H' 
  int 10h 
  times 510 - ($ - $$) db 0 
  jmp $ 
  dw 0xaa55 

还有什么我必须做的吗?

4

3 回答 3

11

QEMU 2.0.0 确实支持多重引导

man qemu说:

-内核 bzImage

使用 bzImage 作为内核映像。内核可以是 Linux 内核或多重引导格式。

我在以下位置上传了一个最小的 hello world 示例:https ://github.com/cirosantilli/x86-bare-metal-examples/tree/dbbed23e4753320aff59bed7d252fb98ef57832f/multiboot

它生成一个 GAS + C 多重引导文件,并使用 QEMU 运行它。

grub-mkrescue还可以将多重引导二进制文件转换为可引导.iso映像,这是另一种好方法。

Barry提到不支持 multiboot2。How to generate a multiboot2 image in case you want to test it: How to compile the simple kernel in multiboot2 Spec corrently?

于 2015-09-13T13:44:40.203 回答
-1

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

至于实际将 grub 安装到虚拟硬盘上,有多种方法可以做到,但这是我一直使用的过程:

  1. 使用qemu-imgdd if=/dev/zero创建您的 HDD 映像。
  2. 下载 Linux 安装程序 ISO(我通常使用 Arch Linux)。
  3. qemu使用空白硬盘映像和 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签名)。

于 2014-08-24T14:48:18.393 回答
-1

不,QEMU 确实对旧的多重引导规范有原生支持,尽管它不支持 VBE,例如。只需从具有正确旧多重引导头文件的独立编译器编译成 ELF 可执行文件并使用 -kernel 选项运行

于 2015-02-22T07:41:37.653 回答