我最近进入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中也可以完美地运行。
我想知道这里是否有人对如何实现这一点有任何见解! 非常感谢任何帮助!
答案 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
整体相关..