【问题标题】:Bare metal Raspberry Pi 2: Generating an SD card image for QEMU emulationBare metal Raspberry Pi 2:为 QEMU 仿真生成 SD 卡映像
【发布时间】:2018-08-08 02:07:09
【问题描述】:

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

我现在的问题是我正在尝试学习如何将内核放到 SD 卡映像中并从该 SD 卡映像启动 qemu-system-arm,这样我就可以正确模拟从树莓派加载的内核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

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

我可以从挂钩 GDB 中看到内核根本没有从这个卡映像启动。使用 -kernel 参数将内核直接加载到 qemu 中效果很好。

我想知道这里是否有人对如何实现这一点有任何见解! 在这里的任何帮助将不胜感激!

【问题讨论】:

    标签: raspberry-pi kernel raspberry-pi2 qemu bare-metal


    【解决方案1】:

    在网上进行了一些阅读和搜索,以及其他贡献者(例如 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 作为一个整体..

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 感谢您的回复! Raspberry Pi 本身并没有真正的 BIOS,而是在 GPU ROM 中有一个专有的引导加载程序,它读取 SD 卡并引导内核(除其他外)。我错误地假设 Qemu 模拟了这个引导过程。我的主要问题是希望引导加载程序正确填充设备树......即使手动指定它似乎也不适合我。当我找到解决问题的方法时,我会用更好的解释更新我的帖子!
      猜你喜欢
      • 1970-01-01
      • 2020-05-24
      • 2013-11-10
      • 1970-01-01
      • 1970-01-01
      • 2015-05-06
      • 1970-01-01
      • 2021-07-09
      • 1970-01-01
      相关资源
      最近更新 更多