我刚刚安装了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"
我只能看到黑屏,我也尝试了下面线程中建议的内容
但它仍无效。
以下是我运行以编译内核源代码的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
此处的加载和输入点是否正常?
答案 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启用您需要的东西。