Qemu在从硬盘启动时遇到困难

时间:2017-05-30 19:00:24

标签: linux qemu

我正在尝试使用qemu模拟器加载一个简单的内核,但qemu卡在“从硬盘启动”。 A screenshot of the problem

可以在以下链接中找到内核的源代码:https://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-828-operating-system-engineering-fall-2012/,在目录obj/kern/kernel.img中的实验1分配中。 Pdf of lab1tar.gz of lab1pointers1.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 

3 个答案:

答案 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:stdiohttp://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。