运行Qemu后只是黑屏

我刚刚安装了QEMU和编译Linux内核与ARM支持,但是当我运行下面的命令

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

我只能看到黑屏,我也试过在下面的线程中提示什么

Qemu显示黑屏

但仍然没有奏效。

以下是我运行编译内核Source的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 

加载和入口点在这里吗?

Solutions Collecting From Web of "运行Qemu后只是黑屏"

没有你的负载和入口点是不正确的。 通常在下面是加载和入口地址

 Image Name: Linux-3.9.0 Created: Thu Dec 26 09:50:57 2013 Image Type: ARM Linux coreel 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

在这里你需要启用下面的功能。

coreel Features ---> [*] Use the ARM EABI to compile the kernel. (enable this). [*] 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.

当你问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 ?= $@ 

– >

如果用户不在命令行中提到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)是从我们的案例多功能板特定的

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

执行。

对于SINGH的问题

what make ARCH=arm versatile_defconfig will do?

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

假设如果你正在构建x86架构,你不需要给ARCH = x86,默认情况下,它需要x86和x86,你不需要任何交叉编译器,本地编译器负责编译。 您可以在顶层Makefile中进行验证。

如果你给命令“make menuconfig”,那么默认情况下它需要/ boot / config-xxx这是x86。

所以现在的系统配置是从/ boot / config-xxx写到.config

但是,在x86架构上使用本机编译器构建的arm架构是什么?

在这里你需要交叉编译工具cahin来为ARM编译内核。

所以在这个背景下,清晰的yu需要提供ARCH和CROSS_COMPILE变量。

make ARCH=arm versatile_defconfig

顶级makefile读取这个命令,该体系结构是arm副本versatile_defconfig,它出现在arch / arm / configs / versatile_defconfig

并写入.config。

在这里你会得到最低配置,下一步使用menuconfig你启用你需要的东西。