【问题标题】:Qemu-Arm Is stuck with black screen - running vanilla kernelQemu-Arm 卡在黑屏上 - 运行 vanilla 内核
【发布时间】:2017-12-10 17:16:16
【问题描述】:

我尝试使用已编译的 linux 内核(版本 4.9)运行 qemu-arm 以及我使用示例程序创建的 initfs。

这是基于 here 的一篇优秀帖子。

这是我执行的命令:

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 参数的情况下运行它,只加载内核 - 也没有任何反应。

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

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

谢谢!

【问题讨论】:

    标签: linux-kernel qemu


    【解决方案1】:

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

    • 检查明显的内核配置选项设置是否正确:特别是,您已构建它以支持您尝试在其上运行它的 ARM 板和 CPU,并且您已启用对任何设备的支持。重新尝试用于控制台输出
    • 通过将 QEMU 配置为输出串行端口信息,并将客户机配置为将其控制台输出发送到串行,并启用任何您可以的 earlycon/earlyprintk 选项(串行输出经常早于图形输出,Linux 内核 earlycon/earlyprintk 选项意味着内核将比默认值更早开始打印输出)
    • 如果您有一个可以工作的内核和一个不能工作的内核,请查看内核配置之间的差异,看看其中是否缺少某些内容
    • 如果所有其他方法都失败了,您必须打开调试器以了解发生了什么

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

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

    【讨论】:

    • 我已经设置了最大内存量,但它仍然没有做任何事情。还尝试使用 android 模拟器运行它 - 没有任何运气...... qemu 监视器在这种情况下可以提供帮助吗?
    • android 模拟器将无济于事,因为它不是 vexpress 板的模拟器,我假设您已经为其编译了内核。您是否尝试过提供设备树 blob?否则,请尝试我上面推荐的调试方法。
    • 实际上使用 dtb 它可以工作,但是没有它有办法吗?与内核参数?我从 boot.img 认识他们
    • 没有。新内核需要 dtb。许多有关硬件的特定信息已从硬编码到内核可执行文件中转移到在 dtb 的数据结构中定义。
    猜你喜欢
    • 1970-01-01
    • 2014-08-18
    • 1970-01-01
    • 2015-04-01
    • 2016-11-14
    • 1970-01-01
    • 2018-08-12
    • 2016-01-26
    • 1970-01-01
    相关资源
    最近更新 更多