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

内核的源代码可以在以下链接中找到:https://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-828-operating-system-engineering-fall-2012/,在obj/kern/kernel.img目录中的实验室1赋值中。lab1格式,tar.gz of lab1,pointers1.c。任务是:
第一部分主要介绍了x86汇编语言、QEMU x86仿真器和PC机的power引导过程。第二部分检查我们的6.828内核的引导加载程序,它驻留在实验室树的引导目录中. % cd实验室% make .+ mk obj/kern/kernel.img 。。现在您已经准备好运行QEMU,提供上面创建的obj/kern/kernel.img文件,作为模拟PC的“虚拟硬盘”的内容。这个硬盘映像包含我们的引导加载程序(obj/ boot /boot)和内核(obj/内核)。 %制造qemu
发布于 2017-12-30 12:21:32
eng140,您可以使用32位Linux.我也有同样的问题。在使用了32位Linux之后,这个问题得到了解决.在下面“使用虚拟机”一节中的web https://pdos.csail.mit.edu/6.828/2017/tools.html中,他们建议我们使用32位Linux。
发布于 2020-07-30 22:29:22
这也可能是gcc版本的问题。最近可用的秋季(2018年)对此进行了修正
Author: Jonathan Behrens <fintelia@gmail.com>
Date: Tue Sep 4 14:10:42 2018 -0400
Tweak kernel.ld linker script so edata and end are set correctly
This change should hopefully resolve issues when compiling with newer versions
of GCC.
commit a56269d4beefc7d0b3672180aa46c654cfb63af4
diff --git a/kern/kernel.ld b/kern/kernel.ld
index 45a0b6a..a219d1d 100644
--- a/kern/kernel.ld
+++ b/kern/kernel.ld
@@ -47,13 +47,13 @@ SECTIONS
*(.data)
}
- PROVIDE(edata = .);
-
.bss : {
+ PROVIDE(edata = .);
*(.bss)
+ PROVIDE(end = .);
+ BYTE(0)
}
- PROVIDE(end = .);
/DISCARD/ : {
*(.eh_frame .note.GNU-stack)发布于 2017-05-31 02:13:30
eng140,正如pdf - lab1.pdf课程中所解释的,您应该从makefile开始使用make qemu。
它使用设置硬盘和将串行端口输出定向到终端所需的选项来执行QEMU。一些文本应该出现在QEMU窗口中:.
您不应该像以前那样用手动过程启动它(qemu-system-x86_64 ..)。此目标在实验室GNUmakefile中实现为
qemu: $(IMAGES) pre-qemu
$(QEMU) $(QEMUOPTS)QEMU在大多数平台上都是qemu,在MacOS上是i 386-softmmu。尝试使用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)实验室选项有-serial mon:stdio,这是. http://download.qemu.org/qemu-doc.html
-serial dev--将虚拟串行端口重定向到主机字符设备开发。。。此选项可多次用于模拟多达4个串口。..。 mon:dev_string 这是一个特殊的选项,允许监视器被多路复用到另一个串口上。监视器是用控制-a的键顺序访问的,然后按c。dev_string应该是上面指定的任何一种串行设备。将监视器复用到侦听端口4444的telnet服务器的一个示例是:
可能您的映像要引导使用串口,而不是显示打印的东西。尝试将以下内容添加到命令中:
qemu-system-i386 -drive format=raw,file=obj/kern/kernel.img -serial mon:stdio或
qemu-system-i386 -hda obj/kern/kernel.img -serial mon:stdiohttps://stackoverflow.com/questions/44269968
复制相似问题