【问题标题】:Buildroot and QemuBuildroot 和 Qemu
【发布时间】:2020-04-27 02:24:36
【问题描述】:

我正在使用 buildroot 编译一个带有 4.19-rt 内核的简约 linux。它应该在树莓派 3b(ARM 处理器)上运行。此外,我想在 x86_64 linux 计算机上运行它,并发现 qemu 作为其仿真解决方案。

  1. 构建 linux 和内核并在 raspi 上运行它。它启动了,我可以登录并使用它。

  2. 为了测试 qemu,我遵循了这个指令 [1]。最近一个 4.19 内核的 raspbian 可以正常启动,所以 qemu 似乎安装正确。

sudo qemu-system-arm -kernel ./qemu-rpi-kernel/kernel-qemu-4.19.50-buster -hda 2019-09-26-raspbian-buster-lite.img -cpu arm1176 -m 256 -M versatilepb -no-reboot -serial stdio -append "root=/dev/sda2 panic=1 rootfstype=ext4 rw" -dtb qemu-rpi-kernel/versatile-pb.dtb
  1. 将 1. 和 2. 放在一起失败。当我尝试模拟任何自建 linux 时,qemu 只显示黑屏,并且一个 CPU 正在使用 100%。

我使用了与真实硬件相同的 sdcard.img。我还尝试使用普通的 4.19 内核(没有实时)重新编译整个系统。我尝试构建一个多功能系统(make qemu_arm_versatile_defconfig && make)。都不行。

启动仿真的命令:

sudo qemu-system-arm -kernel zImage -drive format=raw,file=sdcard.img -cpu arm1176 -m 256 -M versatilepb -no-reboot -append "root=/dev/mmcblk0p2 panic=1 rootfstype=ext4 rw" -serial stdio

我的主要问题是,绝对没有有用的输出。该命令输出以下内容

ALSA lib pulse.c:242:(pulse_connect) PulseAudio: Unable to connect: Connection refused

sdl: SDL_OpenAudio failed
sdl: Reason: ALSA: Couldn't open audio device: Connection refused
ALSA lib pulse.c:242:(pulse_connect) PulseAudio: Unable to connect: Connection refused

sdl: SDL_OpenAudio failed
sdl: Reason: ALSA: Couldn't open audio device: Connection refused
audio: Failed to create voice `lm4549.out'

并打开一个图形输出窗口(不显示任何内容)。该消息在模拟 raspbian 时也会出现,所以这似乎不是原因。

当我使用 prebuild raspbian 但没有 -dtb 参数运行 qemu 时,我收到类似“错误:无效 dtb 和无法识别/不支持的机器 ID”的消息。我至少希望我的自建代码会出现这样的情况。但是因为没有输出,我什至不知道谷歌是为了什么。

是否有人知道我做错了什么,或者我如何让 qemu 为我提供任何有用的信息来说明问题所在?


[1]https://blog.agchapman.com/using-qemu-to-emulate-a-raspberry-pi/

【问题讨论】:

    标签: raspberry-pi arm kernel qemu buildroot


    【解决方案1】:

    Advanced Linux Sound Architecture (ALSA) 尝试打开音频接口设备。您必须在 qemu 中提供音频设备。因为内核是用 ALSA 音频驱动编译的,而你在 Buildroot 中编译了 sdl 库。

    【讨论】:

      【解决方案2】:

      问题在于,如果内核是为某个硬件编译的,那么它只能在某个 Arm 硬件上启动。否则它通常会失败,通常是在它能够输出任何有用的东西之前崩溃。

      特别是,QEMU 'versatilepb' 机器与 Raspberry Pi 完全不同。任何使用该机器类型的工作指令集实际上都在运行一个内核,该内核是为使用通用 pb 板和一个 raspi 用户空间/文件系统而构建的。您正在尝试在不是 raspi 的机器上构建仅支持 raspi 的内核,这将无法正常工作。

      如果您编译支持两种板类型(两者的所有设备驱动程序等),则可以构建一个可在多个 Arm 硬件上运行的内核。如果您想走这条路,我建议您查看有效内核的内核配置与您的内核配置之间的差异,并添加看似合理的缺失内容,直到您找出实际需要的内容。

      您尝试直接从 sdcard.img 在 QEMU 上启动是行不通的,因为 QEMU 的通用 pb 板模型不支持从 sdcard 直接启动(这需要我们在客户机中运行某种 BIOS/固件映像,我们没有)。对于多功能 pb,您需要直接向 QEMU 提供内核,可能是 initrd,并且绝对是多功能 pb 的正确 dtb。

      您可以尝试查看 QEMU 的“raspi2”和“raspi3”板模型,它们确实模拟了 Raspberry Pi 的硬件。然而,缺点是这些模型缺少一些功能并且不是非常积极地开发,因此通常较新的内核不会在它们上启动,而且由于没有 USB 控制器模型,因此无法获得网络连接。 (这就是为什么大多数博客文章等都建议使用“versatilepb”——用户空间通常并不真正关心它运行在什么硬件上,所以除非你尝试进行内核开发,否则你可以运行一个通用的 pb 内核并采取QEMU 模型所具有的网络等功能的优势。)

      【讨论】:

        猜你喜欢
        • 2020-04-11
        • 1970-01-01
        • 1970-01-01
        • 2016-01-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多