我使用以下步骤编译了linux内核v4.9:
export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabi-
make vexpress_defconfig
make all -j40
然后我用一个简单的hello world程序创建了ramdisk作为init进程
#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并使用this article作为参考。
答案 0 :(得分:2)
“QEMU对黑屏一无所知”几乎总是意味着“QEMU正常运行,但是客户代码在启动过程中早期崩溃或停止而没有发送任何输出”。
您的命令行最明显的问题是您没有使用-dtb向QEMU传递设备树blob。较旧的Arm内核只使用内核和initrd启动,但较新的内核需要dtb,否则它们将无法启动。您正在查看的教程使用的内核版本早于此更改,但看起来您使用的是更新版本需要dtb。您应该能够在内核构建树中的arch / arm / boot / dts /中找到相关的dtb(可能是vexpress-v2p-ca9.dtb)。您可能需要专门告诉内核makefile从dts构建它 - 我忘了。检查内核构建文档以了解如何在必要时执行此操作。
答案 1 :(得分:0)
我已经与上面的人合作
qemu-system-arm -monitor none -nographic -M vexpress-a9 -kernel linux/arch/arm/boot/zImage -initrd initramfs -dtb linux/arch/arm/boot/dts/vexpress-v2p-ca9.dtb -serial stdio
内核版本 | v5.8-rc7 |
arm-linux-gnueabi-gcc --version | (Ubuntu / Linaro 7.5.0-3ubuntu1〜18.04)7.5.0 |