如何在 QEMU(raspi2) 上 运行 u-boot?

How to run u-boot on QEMU(raspi2)?

我正在尝试 运行 QEMU 上的 u-boot。但是当启动QEMU时它什么也没给出,那么为什么这不起作用以及如何调试找出原因?

这是我试过的:

  1. 在 Windows 上安装 Ubuntu 18.04 WSL2

  2. 为Raspi2编译u-boot

    sudo apt install make gcc bison flex
    sudo apt-get install gcc-arm-none-eabi binutils-arm-none-eabi
    export CROSS_COMPILE=arm-none-eabi-
    export ARCH=arm
    make rpi_2_defconfig all
    
  3. 启动QEMU

    qemu-system-arm -M raspi2 -nographic -kernel ./u-boot/u-boot.bin

    并且也在Windows端尝试了QEMU,结果是一样的。

    PS C:\WINDOWS\system32> qemu-system-arm.exe -M raspi2 --nographic -kernel E:\u-boot\u-boot.bin

然后QEMU没有给出输出,即使我试图ctrl+c也无法停止进程。

不幸的是,u-boot 期望在 raspberry pi 上启动的方式与 QEMU 支持此板的二进制文件启动方式不兼容。

QEMU一般支持两种在Arm上启动guest代码的方式:

  1. Linux 内核;这些启动与预期的任何东西 该板上内核的启动协议是。对于树莓派 那将是“启动主要 CPU,但将次要放入 笔在 mbox 上等待”。实际上,QEMU 模拟了一个 非常少的固件,足以启动 Linux.

  2. 不是 Linux 内核;这些被引导就好像它们是 首先要在原始硬件上执行,也就是说 所有 CPU 立即开始执行,这是 来宾代码以提供次要 CPUs 的任何笔数 它想做。也就是说,您的来宾代码必须完成这项工作 这里的固件,因为它实际上就是固件。

如果您是原始图像,我们假设您是 Linux 内核, 或合适的 uImage。如果您是 ELF 图像,我们假设您是 不是 Linux 内核。 (这不是很理想,但我们要 由于向后兼容的原因,在某种程度上与它笨拙。)

在 raspberry pi 板上,u-boot 二进制文件期望的启动方式很可能是 "as if the firmware launched it",这与 QEMU 支持的两个选项中的任何一个都不完全相同。这种不匹配往往会导致 u-boot 崩溃(通常是因为它不期望 "all CPUs run at once" 行为)。

修复需要更改 u-boot 以便它可以像 QEMU 启动它一样处理启动,或者更改 QEMU 以支持对该板固件的更多仿真(QEMU 上游将不愿意接受) ).

如果没有必要特别使用 raspi 板,另一种方法是使用其他一些板,如 'virt' 板,u-boot 确实以允许它在 QEMU 上启动的方式处理. ('virt' 开发板也有更好的设备支持;例如它可以做网络和 USB 设备,而 'raspi' 和 'raspi2' 目前还做不到。)