Qemu 卡在从硬盘启动

eng*_*140 6 linux qemu

我正在尝试使用 qemu 模拟器加载一个简单的内核,但是 qemu 卡在“从硬盘启动”。 问题截图

内核的源代码可以在以下链接中找到:https : //ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-828-operating-system-engineering-fall-2012/,在lab 1作业目录中obj/kern/kernel.imglab1中的的PDF阅读器lab1中的tar.gz的的pointers1.c。任务是:

第一部分专注于熟悉 x86 汇编语言、QEMU x86 仿真器和 PC 的开机引导程序。第二部分检查我们 6.828 内核的引导加载程序,它位于实验室树的引导目录中......

 % cd lab
 % make
 ...
 + mk obj/kern/kernel.img 
Run Code Online (Sandbox Code Playgroud)

.. 现在您已准备好运行 QEMU,提供上面创建的文件 obj/kern/kernel.img 作为模拟 PC 的“虚拟硬盘”的内容。这个硬盘映像包含我们的引导加载程序(obj/boot/boot)和我们的内核(obj/kernel)。

 % make qemu 
Run Code Online (Sandbox Code Playgroud)

osg*_*sgx 1

eng140,如课程 pdf MIT6_828F12_lab1.pdf 中所述 - https://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-828-operating-system-engineering-fall-2012/labs/ MIT6_828F12_lab1.pdf,您应该使用以下命令从 makefile 启动 qemu make qemu

这将使用设置硬盘和直接串行端口输出到终端所需的选项来执行 QEMU。QEMU 窗口中应出现一些文本:...

您不应该像您那样通过手动程序启动它 ( qemu-system-x86_64 ..)。该目标在实验室 GNUmakefile 中实现为

qemu: $(IMAGES) pre-qemu
    $(QEMU) $(QEMUOPTS)
Run Code Online (Sandbox Code Playgroud)

QEMU var 适用qemu于大多数平台,i386-softmmu 适用于 MacOS。要,尝试使用32位系统版本的qemu或标准qemu命令。makefile 中的选项如下:

QEMUOPTS = -hda $(OBJDIR)/kern/kernel.img -serial mon:stdio -gdb tcp::$(GDBPORT)
QEMUOPTS += $(shell if $(QEMU) -nographic -help | grep -q '^-D '; then echo '-D qemu.log'; fi)
IMAGES = $(OBJDIR)/kern/kernel.img
QEMUOPTS += $(QEMUEXTRA)
Run Code Online (Sandbox Code Playgroud)

实验室选项有-serial mon:stdio... http://download.qemu.org/qemu-doc.html

-serial dev -- 将虚拟串口重定向到主机字符设备 dev。.. 该选项可以多次使用,最多可模拟 4 个串口。...

mon:dev_string
Run Code Online (Sandbox Code Playgroud)

这是一个特殊选项,允许监视器多路复用到另一个串行端口。使用 Control-a 的按键序列然后按 c 可以访问监视器。dev_string 应该是上面指定的任一串行设备。将监视器多路复用到侦听端口 4444 的 telnet 服务器上的示例如下:

可能您要启动的图像使用串行端口,而不是显示来打印内容。尝试添加到您的命令中,例如:

qemu-system-i386 -drive format=raw,file=obj/kern/kernel.img -serial mon:stdio
Run Code Online (Sandbox Code Playgroud)

或者

qemu-system-i386 -hda obj/kern/kernel.img -serial mon:stdio
Run Code Online (Sandbox Code Playgroud)