首页 文章

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

提问于
浏览
1

我最近一直在为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 回答

  • 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启动过程,而只是加载通过将二进制文件加载到客户机系统's memory and jumping to the entry point. It doesn' t,使用 -kernel 参数指定的内核看起来不幸的是 -M raspi2 的任何其他硬件引导加载 .

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

相关问题