运行Qemu后只需黑屏

时间:2013-12-24 15:40:52

标签: linux linux-kernel linux-device-driver virtualization qemu

我刚刚安装了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

此处的加载和输入点是否正常?

3 个答案:

答案 0 :(得分: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的情况下内核将be 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.

答案 1 :(得分:1)

当你问Is this config file is responsible for setting up entry and load address of 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 ?= $@

- &GT;

如果用户在命令行中没有提及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) - &gt;这个变量负责加载入口地址

阀门$(ZRELADDR)取自我们案例中的特定用途,因此

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

时内核脚本自动化的方式

执行。

答案 2 :(得分:1)

对于SINGH的问题

what make ARCH=arm versatile_defconfig will do?

1)当你编译内核时,第一个问题是你正在构建哪个架构?

假设您正在为x86架构构建,则默认情况下无需提供ARCH = x86 它需要x86和x86你不需要任何交叉编译器,本机编译器需要小心编译。您可以在顶级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

顶级makefile读取此命令,该架构是arm副本versatile_defconfig,它存在于arch / arm / configs / versatile_defconfig中

并写入.config。

在这里,您将获得最低配置,接下来使用menuconfig启用您需要的东西。