我正在尝试在 QEMU 上运行 u-boot。但是当启动 QEMU 时它什么也没给出,那么为什么这不起作用以及如何调试以找出原因?
这是我尝试过的:
在 Windows 上安装Ubuntu 18.04 WSL2。
为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
Run Code Online (Sandbox Code Playgroud)启动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
不幸的是,u-boot 期望在树莓派上启动的方式与 QEMU 支持该板的二进制文件的启动方式之间存在不兼容。
QEMU 一般支持两种在 Arm 上启动访客代码的方式:
Linux 内核;这些启动无论该板上内核的预期启动协议是什么。对于 raspi,这将是“启动主 CPU,但将辅助 CPU 放入笔中等待 mbox”。实际上,QEMU 模拟了极少量的固件,仅足以启动 Linux。
不是 Linux 内核;它们被启动,就好像它们是在原始硬件上执行的第一件事一样,也就是说,所有 CPU 立即开始执行,并且来宾代码的工作是提供它想要执行的辅助 CPU 的任何操作。也就是说,您的访客代码必须在这里完成固件的工作,因为它实际上就是固件。
如果您是原始映像或合适的 uImage,我们假设您是 Linux 内核。如果您是 ELF 映像,我们假设您不是 Linux 内核。(这并不完全理想,但出于向后兼容性的原因,我们在某种程度上陷入了困境。)
在树莓派板上,u-boot 二进制文件期望的启动方式可能是“就像固件启动它一样”,这与 QEMU 支持的两个选项都不完全相同。这种不匹配往往会导致 u-boot 崩溃(通常是因为它不期望“所有 CPU 立即运行”行为)。
修复需要对 u-boot 进行更改,以便它可以按照 QEMU 启动它的方式处理启动,或者对 QEMU 进行更改以支持对该板固件的更多模拟(QEMU 上游将不愿意接受)。
如果不需要特别使用 raspi 板,另一种方法是使用其他一些板,例如 u-boot 确实以允许在 QEMU 上启动的方式处理的“virt”板。(“virt”板还具有更好的设备支持;例如,它可以支持网络和 USB 设备,而“raspi”和“raspi2”目前还无法做到这一点。)
| 归档时间: |
|
| 查看次数: |
4256 次 |
| 最近记录: |