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

时间:2014-08-24 07:15:25

标签: c assembly operating-system qemu grub

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

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

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

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

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

我还有什么需要做的吗?

3 个答案:

答案 0 :(得分:8)

QEMU 2.0.0支持多重启动

grub-mkrescue说:

  

-kernel bzImage

     

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

我在UserName Property

上传了一个最小的hello world示例

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

.iso还可以将多引导二进制文件转换为可引导的String value = "<html>Visit my blog <a href=\"http://www.maxartists.com\">mysite</a> View <a href=\"sherif-activity://myactivity?author=sherif&nick=king\">myactivity</a> callback</html>"; TextView text = (TextView) findViewById(R.id.text); text.setText(Html.fromHtml(value)); text.setMovementMethod(LinkMovementMethod.getInstance()); 图像,这是另一种好方法。

不支持Barry https://github.com/cirosantilli/x86-bare-metal-examples/tree/dbbed23e4753320aff59bed7d252fb98ef57832f/multiboot multiboot2。如何生成multiboot2映像以防测试:mentions that

答案 1 :(得分:-1)

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

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

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


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

答案 2 :(得分:-1)

不,QEMU确实对旧的多引导规范有本机支持,虽然它不支持VBE,例如。只需将具有正确的旧多引导头的独立编译器编译成ELF可执行文件并使用-kernel选项运行< / p>