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

问题描述 投票:1回答:2

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

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

我已经从https://github.com/raspberrypi/firmware中获取SD卡内容... aster / boot,并使用以下脚本创建映像并将内核加载到其中。我已经看到人们已经想出如何从模拟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
2个回答
2
投票

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

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


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整体有关..

© www.soinside.com 2019 - 2024. All rights reserved.