Qemu-Arm 卡在黑屏 - 运行香草内核

sbo*_*rpo 5 qemu linux-kernel

我尝试使用编译好的 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"
Run Code Online (Sandbox Code Playgroud)

然后,qemu 向我显示了这些错误并且它的图形窗口卡住了:

pulseaudio: set_sink_input_volume() failed
pulseaudio: Reason: Invalid argument
pulseaudio: set_sink_input_mute() failed
pulseaudio: Reason: Invalid argument
Run Code Online (Sandbox Code Playgroud)

即使我在没有 -initrd 参数的情况下运行它,只是为了加载内核 - 也没有任何反应。

示例中,当我尝试使用 vmlinuz-3.2.0-4-vexpress 图像运行它时,它对我有用。

有人知道可能是什么问题吗?它是一个 zImage 的事实?有没有办法调试它?

谢谢!

Pet*_*ell 1

“QEMU 坐在那里,什么也不打印”是一种很常见的症状,它几乎总是意味着“来宾内核在能够打印任何内容之前崩溃了,因为它配置不正确”。如果您尝试在真实硬件上启动错误配置的内核,这几乎与您获得的效果相同,并且调试过程也大致相同:

  • 检查明显的内核配置选项是否设置正确:特别是,您已将其构建为支持您尝试运行它的 ARM 板和 CPU,并且您已启用对您尝试运行的任何设备的支持用于控制台输出
  • 通过配置 QEMU 来输出串行端口信息,配置来宾将其控制台输出发送到串行,并启用任何可以使用的 Earlycon/earlyprintk 选项(串行输出比图形输出早得多),给自己最大的机会看到一些东西输出,Linux 内核 Earlycon/earlyprintk 选项意味着内核将比默认值更早开始打印输出)
  • 如果您有一个可以工作的内核,一个不能工作的内核,请查看内核配置之间的差异,看看是否缺少某些内容
  • 如果一切都失败了,你必须打破调试器来找出发生了什么

这并不是 QEMU 特有的——如果您尝试在硬件上启动内核,这与您必须经历的痛苦是一样的。

PS:我的第一个猜测是内核崩溃是因为它没有足够的内存——你没有向 QEMU 传递“-m”选项,所以它默认为 128MB;vexpress-a9 板可处理高达 1GB 的内存。Earlycon 可能足以提供足够的调试输出来识别此问题。您也没有通过 -dtb 传递设备树 blob,这对于较新的内核可能是一个问题(较旧的内核很乐意在没有设备树的情况下启动)。