裸金属树莓派2:为QEMU仿真生成SD卡图像

时间:2018-02-28 08:52:34

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

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

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

我已经从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中也可以完美地运行。

我想知道这里是否有人对如何实现这一点有任何见解! 非常感谢任何帮助!

2 个答案:

答案 0 :(得分:2)

您的命令无法正常工作,因为您尚未通过QEMU运行客户BIOS或来宾内核。 QEMU臂板与x86 PC机器不同,后者始终自动运行客户机BIOS映像。如果您想运行BIOS(可能是UEFI?),您需要找到合适的BIOS blob并使用-bios参数将其传递给QEMU。然后QEMU将运行BIOS代码,希望包含SD卡驱动程序以加载内核,以此类推SD卡。

使用-kernel要简单得多......

答案 1 :(得分: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整体相关..