我已经使用以下步骤编译了Linux内核v4.9:
export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabi-
make vexpress_defconfig
make all -j40
然后我用一个简单的hello world程序作为初始化过程创建了ramdisk
#include <stdio.h>
void main() {
printf("Hello World!\n");
while(1);
}
//compile and pack
arm-linux-gnueabi-gcc -static init.c -o init
echo init|cpio -o --format=newc > initramfs
现在,当我尝试与qemu一起运行时,我得到了黑屏,除此之外没有其他
qemu-system-arm -M vexpress-a9 -kernel linux-4.9/arch/arm/boot/zImage -initrd initramfs -append "console=tty1"
另外,在启动qemu的终端上,我得到以下打印(看起来无关紧要)
pulseaudio: set_sink_input_volume() failed
pulseaudio: Reason: Invalid argument
pulseaudio: set_sink_input_mute() failed
pulseaudio: Reason: Invalid argument
我是第一次使用Qemu,并且正在使用本文作为参考。
“ QEMU黑屏不执行任何操作”几乎总是表示“ QEMU运行正常,但是来宾代码在引导过程中早已崩溃或停止,但未发送任何输出”。
命令行最明显的问题是你没有通过-dtb向QEMU传递设备树blob。较早的Arm内核只能使用内核和initrd引导,而较新的ARM内核则需要dtb,否则它们将无法引导。你正在查看的教程使用的内核版本早于此更改,但看起来你正在使用的更高版本需要dtb。你应该能够在内核构建树的arch / arm / boot / dts /中找到相关的dtb(可能是vexpress-v2p-ca9.dtb)。你可能需要专门告诉内核makefile从dts进行构建-我忘记了。查看内核构建文档,以了解在必要时如何执行此操作。
你解释得很好。根据您提供的指导,我能够找出解决该问题的确切命令。为了完成答案,我编译了具有DTB支持的内核-
make zImage dtbs -j40
然后在使用Qemu引导时,我给出了一个额外的参数as-dtb ~/data/linux/arch/arm/boot/dts/vexpress-v2p-ca9.dtb
和boot。