我尝试使用编译好的 linux 内核(4.9 版)和我用示例程序创建的 initfs 运行 qemu-arm。
这是基于这里的一篇优秀文章。
这是我执行的命令:
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
即使我在没有 -initrd 参数的情况下运行它,只是为了加载内核 - 也没有任何反应。
在本示例中,当我尝试使用 vmlinuz-3.2.0-4-vexpress 图像运行它时,它对我有用。
有人知道可能是什么问题吗?它是一个 zImage 的事实?有没有办法调试它?
谢谢!
“QEMU 坐在那里,什么也不打印”是一种很常见的症状,它几乎总是意味着“来宾内核在能够打印任何内容之前崩溃了,因为它配置不正确”。如果您尝试在真实硬件上启动错误配置的内核,这几乎与您获得的效果相同,并且调试过程也大致相同:
这并不是 QEMU 特有的——如果您尝试在硬件上启动内核,这与您必须经历的痛苦是一样的。
PS:我的第一个猜测是内核崩溃是因为它没有足够的内存——你没有向 QEMU 传递“-m”选项,所以它默认为 128MB;vexpress-a9 板可处理高达 1GB 的内存。Earlycon 可能足以提供足够的调试输出来识别此问题。您也没有通过 -dtb 传递设备树 blob,这对于较新的内核可能是一个问题(较旧的内核很乐意在没有设备树的情况下启动)。