我正在尝试使用qemu模拟器加载一个简单的内核,但qemu卡在“从硬盘启动”。
可以在以下链接中找到内核的源代码:https://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-828-operating-system-engineering-fall-2012/,在目录obj/kern/kernel.img
中的实验1分配中。 Pdf of lab1,tar.gz of lab1,pointers1.c。任务是:
第一部分专注于熟悉x86汇编语言 QEMU x86仿真器,以及PC的开机自举程序。第二部分检查我们的6.828内核的引导加载程序,它位于实验树的引导目录中......
% cd lab % make ... + mk obj/kern/kernel.img
..现在你已准备好运行QEMU,提供上面创建的文件obj / kern / kernel.img作为内容 仿真PC的“虚拟硬盘”。此硬盘映像包含我们的引导加载程序(obj / boot / boot)和我们的内核 (OBJ /内核)。
% make qemu
答案 0 :(得分:1)
gcc版本也可能有问题。最新的Fall(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)
答案 1 :(得分:0)
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中所解释的那样,您应该使用make qemu
从makefile启动qemu:
这将执行QEMU,其中包含将硬盘和直接串行端口输出设置到终端所需的选项。一些文本应出现在QEMU窗口中:...
您不应该像使用手动程序一样启动它(qemu-system-x86_64 ..
)。此目标在实验室GNUmakefile中实现为
qemu: $(IMAGES) pre-qemu
$(QEMU) $(QEMUOPTS)
和QEMU var在大多数平台上都是qemu
,在MacOS上是i386-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
- 将虚拟串行端口重定向到主机字符设备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:stdio
答案 2 :(得分:0)
eng140,您可以使用32位Linux。我有同样的问题。在使用32位Linux之后,这个问题就解决了。在以下网站https://pdos.csail.mit.edu/6.828/2017/tools.html中 在“使用虚拟机”一节中,他们建议我们使用32位Linux。