Raspberry pi 裸机Raspberry Pi 2:为QEMU仿真生成SD卡映像

Raspberry pi 裸机Raspberry Pi 2:为QEMU仿真生成SD卡映像,raspberry-pi,kernel,raspberry-pi2,qemu,bare-metal,Raspberry Pi,Kernel,Raspberry Pi2,Qemu,Bare Metal,我最近开始为Raspberry Pi 2进行裸机开发,并取得了一些成功。诚然,在我觉得自己可以用它做一些有用的事情之前,我一直在犹豫是否要买一台真正的物理设备,目前我一直在使用qemu 2.11.0模拟该设备。 到目前为止,我已经为我的内核开发了多核功能,以及简单的串行I/O,但我觉得在使用物理设备之前,我想做得更进一步 我现在的问题是,我正在尝试学习如何将内核放在SD卡映像上,并从SD卡映像引导qemu系统arm,这样我就可以正确地模拟从raspberry pi 2引导加载程序加载的内核 我已

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

我现在的问题是,我正在尝试学习如何将内核放在SD卡映像上,并从SD卡映像引导qemu系统arm,这样我就可以正确地模拟从raspberry pi 2引导加载程序加载的内核

我已经抓到了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中,否则效果会非常好

我想知道这里是否有人对如何做到这一点有任何见解!
任何帮助都将不胜感激

您的命令将无法工作,因为您尚未传递QEMU来宾BIOS或来宾内核来运行。QEMU arm板不像x86 PC机,它总是自动运行来宾BIOS映像。如果您想要运行BIOS(可能是UEFI?),您需要找到一个合适的BIOS blob,并使用-BIOS参数将其传递给QEMU。然后QEMU将运行BIOS代码,希望其中包括SD卡驱动程序,以便从SD卡加载内核等等


只使用-kernel要简单得多…

在网上阅读和搜索了一些内容,以及其他贡献者(如Peter Maydell)对上述答案的帮助后,我想我已经回答了自己的问题。除非我弄错了,否则qemu系统arm没有完全模拟Raspberry Pi引导过程,而是通过将二进制文件加载到来宾系统内存并跳到入口点来加载用
-kernel
参数指定的内核。不幸的是,对于
-M raspi2
,似乎没有添加任何额外的硬件引导


此问题与此类似,并包含有关此问题的一些更有用的详细信息,涉及整个
qemu系统arm

感谢您的回答!Raspberry Pi本身并没有BIOS,而是在GPU ROM中有一个专有的引导加载程序,用于读取SD卡并引导内核(除其他外)。我错误地认为Qemu模拟了这个引导过程。我的主要问题是希望引导加载程序正确地填充设备树。。。即使手动指定它似乎对我也不起作用。当我找到问题的解决方案时,我会用更好的解释更新我的帖子!