运行Qemu后只有黑屏

4

我刚刚安装了QEMU并编译了带有ARM支持的Linux内核,但是当我运行以下命令时:

qemu-system-arm -M versatilepb -m 128M -kernel /home/arit/QEMU/linux-3.8.4/arch/arm/boot/uImage -append "console=tty1"

我只能看到黑屏,我也尝试了下面这个帖子中建议的方法:

Qemu shows a black screen

但仍然没有起作用。

以下是我运行编译内核源代码的make命令的输出:

make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- uImage -s

 Image Name:   Linux-3.8.4
 Created:      Tue Dec 24 12:49:07 2013
 Image Type:   ARM Linux Kernel Image (uncompressed)
 Data Size:    4406472 Bytes = 4303.20 kB = 4.20 MB
 Load Address: fffffff2
 Entry Point:  fffffff2

这里的载入点和入口点是否OK?

尝试使用 -sdl 选项。我从未成功使用过 gtk 界面。 - Bandrami
@Bandrami,您能更具体地说明-sdl选项吗?我该如何使用它? - Amit Singh Tomar
这是qemu的一个选项,就像-m一样。只需在您的qemu命令末尾添加-sdl即可。 - Bandrami
串行工作吗?您可以尝试使用VNC而不是SDL吗?我在此处发现了一个特定于SDL的错误:https://bugs.launchpad.net/qemu/+bug/1778182 - Ciro Santilli OurBigBook.com
3个回答

7
您的加载地址和入口点不正确。通常下面是正确的加载地址和入口点:
Image Name:   Linux-3.9.0
Created:      Thu Dec 26 09:50:57 2013
Image Type:   ARM Linux Kernel Image (uncompressed)
Data Size:    1908056 Bytes = 1863.34 kB = 1.82 MB
Load Address: 00008000
Entry Point:  00008000

此外,如果您试图使用您的命令,在没有rootfs的情况下内核会发生“panic”。缺少initrd参数。另外,在构建内核时,您可能会缺少一些配置。
请尝试以下步骤:
1) make ARCH=arm distclean
2) make ARCH=arm versatile_defconfig
3) make ARCH=arm menuconfig
在这里,您需要启用以下功能。
Kernel Features ---> [*] Use the ARM EABI to compile the kernel. (enable this).
4) make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- uImage 5) qemu-system-arm -M versatilepb -m 128M -kernel arch/arm/boot/uImage -append "console=tty1"
在这里,您将获得控制台,显示内核恐慌。为了避免这种情况,请传递您的rootfs参数。
我猜您是从busybox构建rootfs,如果是这样,请尝试以下命令以完全启动系统:
6) qemu-system-arm -M versatilepb -m 128M -kernel arch/arm/boot/uImage -initrd rootfs.img -append "root=/dev/ram mem=128M rdinit=/sbin/init" -serial stdio。

感谢Vinay的回答。我尝试使用mkimage命令将加载地址和入口地址更改为00008000和00008000,但没有成功。此外,我已经启用了内核功能中的ARM EABI。我是否需要通过内核配置文件提供入口和加载地址? - Amit Singh Tomar
不要尝试使用mkimage,只需运行make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- uImage即可。在编译结束时它会自动添加入口地址。 - vinay hunachyal
我还注意到你的图像尺寸太大了..在默认配置中做了太多的更改..首先尝试使用我的上述步骤和默认配置,如果可以正常工作..那么就启用你的要求。 - vinay hunachyal
谢谢Vinay,我尝试了你的步骤,它可以正常工作。我们之前漏掉了make ARCH=arm versatile_defconfig这一步。这个配置文件负责设置uImage的入口和加载地址吗?或者加载和入口地址是如何设置的? - Amit Singh Tomar
@vinayHunachyal 你是如何构建你的rootfs的? - codey modey
显示剩余2条评论

1
作为您的帮助助手,我将为您翻译以下内容:

你问:“这个配置文件是否负责设置uImage的入口和加载地址?”

是的,make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- uImage这个命令负责加载入口点。

如何操作?

在内核源代码中打开vi scripts/mkuboot.sh

在这里检查MKIMAGE=$(type -path "${CROSS_COMPILE}mkimage")

脚本将负责调用scripts/Makefile.lib.

在此处的代码中:

MKIMAGE := $(srctree)/scripts/mkuboot.sh

  UIMAGE_ARCH ?= $(SRCARCH)
  UIMAGE_COMPRESSION ?= $(if $(2),$(2),none)
  UIMAGE_OPTS-y ?=
  UIMAGE_TYPE ?= kernel
  UIMAGE_LOADADDR ?= arch_must_set_this
  UIMAGE_ENTRYADDR ?= $(UIMAGE_LOADADDR)
  UIMAGE_NAME ?= 'Linux-$(KERNELRELEASE)'
  UIMAGE_IN ?= $<
  UIMAGE_OUT ?= $@

如果用户在命令行中没有提到LOADADDR,地址将从以下位置获取
UIMAGE_LOADADDR ?= arch_must_set_this
ifneq ($(LOADADDR),)
UIMAGE_LOADADDR=$(LOADADDR)
else
   ifeq ($(CONFIG_ZBOOT_ROM),y)
   UIMAGE_LOADADDR=$(CONFIG_ZBOOT_ROM_TEXT)
  else
UIMAGE_LOADADDR=$(ZRELADDR)
endif
endif

UIMAGE_LOADADDR=$(ZRELADDR) --> 这个变量负责加载入口地址

值 $(ZRELADDR) 是从特定于板子的变量中获取的,在我们的情况下是 versatile。

arch/arm/mach-versatile/Makefile.boot

这里。
   zreladdr-y   += 0x00008000
params_phys-y   := 0x00000100
initrd_phys-y   := 0x00800000

这是在执行 make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- uImage 命令时,内核脚本自动化的方式。

感谢Vinay提供详细的答案,您能否也告诉我make ARCH=arm versatile_defconfig命令的用途? - Milan
@ singh 对不起,我没听懂你的意思,请你再重复一遍你的请求。 - vinay hunachyal
只是想知道 ARCH=arm versatile_defconfig 会做什么? - Milan

1

对于SINGH的问题

ARCH=arm versatile_defconfig会做什么?

1)当您编译内核时,第一个问题是为哪种架构进行构建?

假设您正在为x86架构构建,则无需提供ARCH=x86,默认情况下将采用x86,而对于x86,您不需要任何交叉编译器,本地编译器负责编译。您可以在Top-level Makefile中进行验证。

如果您输入命令`make menuconfig',则默认采用/boot/config-x.x.x,这是针对x86的。

因此,系统的当前配置将从/boot/config-x.x.x写入.config。

但是,如果您正在x86架构上构建ARM架构,而且具有本地编译器,该怎么办?

在这里,您应该需要交叉编译工具链来编译ARM内核。

因此,从这个背景中清楚了为什么需要提供ARCH和CROSS_COMPILE变量。

make ARCH=arm versatile_defconfig

Top-level makefile读取此命令,表示体系结构为arm,复制位于arch/arm/configs/versatile_defconfig中的versatile_defconfig,并写入.config。

在这里,您将得到最少的配置,接下来使用menuconfig启用所需的内容。


好的,@Vinay,versatile_defconfig是用于Versatile物理板的配置文件,对吗? - Milan
是的,它是用于多功能板的。 - vinay hunachyal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接