Bare metal Raspberry Pi 2:为QEMU仿真生成SD卡镜像

Bare metal Raspberry Pi 2: Generating an SD card image for QEMU emulation

我最近一直在为 Raspberry Pi 2 进行裸机开发,并取得了一些成功。不可否认,在我觉得我可以用它做一些有用的事情之前,我一直在犹豫是否要购买一个实际的物理设备,目前我一直在使用 qemu 2.11.0 模拟该设备。 到目前为止,我已经为我的内核开发了多核功能,以及简单的串行 I/O,但我觉得在使用物理设备之前我想更进一步。

我现在的问题是我正在尝试学习如何将我的内核放入 SD 卡映像并从该 SD 卡映像启动 qemu-system-arm,这样我就可以正确地模拟从raspberry pi 2 引导加载程序。

我已经从 https://github.com/raspberrypi/firmware ... aster/boot 获取 SD 卡内容,并使用以下脚本创建映像并将我的内核加载到其中。我看到人们已经弄清楚如何从模拟 SD 卡加载 Raspbian,所以我想我也可以这样做。

#!/bin/bash

OUTPUT_IMG=os.img
OUTPUT_IMG_SIZE=40
TEMP_MOUNT_DIR="$(mktemp -d)"
# the SD card boot partition contents are in this folder...
OUTPUT_IMG_CONTENTS_DIR="./sd"
OS_DIR="${HOME}/os"
OS_BINARY="${OS_DIR}/kernel.bin"

dd if=/dev/null of=${OUTPUT_IMG} bs=1M seek=${OUTPUT_IMG_SIZE}
mkfs.fat -F 32 ${OUTPUT_IMG}
sudo mount -t vfat -o loop ${OUTPUT_IMG} ${TEMP_MOUNT_DIR}
make -C ${OS_DIR} clean
make -C ${OS_DIR}
sudo cp -r ${OUTPUT_IMG_CONTENTS_DIR} ${TEMP_MOUNT_DIR}
sudo cp ${OS_BINARY} "${TEMP_MOUNT_DIR}/kernel.img"

唯一的问题是 qemu 似乎无法使用以下命令从此映像启动:

qemu-system-arm -machine raspi2 -serial file:serial.log -sd ./dev/os.img

我尝试了几种不同的组合,但都无济于事。

我可以从 hooking GDB 中看出内核根本不是从这个卡映像启动的。使用 -kernel 参数将内核直接加载到 qemu 中可以完美地工作。

我想知道这里是否有人对如何实现这一目标有任何见解! 如有任何帮助,我们将不胜感激!

您的命令将不起作用,因为您没有将 QEMU 来宾 BIOS 或来宾内核传递给 运行。 QEMU 臂板不像 x86 PC 机器,它总是自动 运行s 来宾 BIOS 映像。如果你想 运行 一个 BIOS(可能是 UEFI?),你需要找到一个合适的 BIOS blob 并使用 -bios 参数将它传递给 QEMU。然后 QEMU 将 运行 BIOS 代码,这将有望包括 SD 卡驱动程序以从 SD 卡加载内核等。

只用-kernel就简单多了...

在网上进行了一些阅读和搜索,以及其他贡献者(例如 Peter Maydell 的上述回答)的一些帮助之后,我想我已经回答了我自己的问题。除非我弄错了 qemu-system-arm 并没有完全模拟 Raspberry Pi 启动过程,而是通过将二进制文件加载到客户系统的内存中并跳转到 -kernel 参数来加载指定的内核入口点。不幸的是,似乎没有为 -M raspi2 模拟任何额外的硬件引导加载。

Can ARM qemu system emulator boot from card image without kernel param? 这个问题是相似的,包含关于这个问题的一些更有用的细节,与 qemu-system-arm 作为一个整体有关..