代码之家  ›  专栏  ›  技术社区  ›  ajxs

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

  •  1
  • ajxs  · 技术社区  · 7 年前

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

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

    我已经从 https://github.com/raspberrypi/firmware ... 并使用以下脚本创建映像并将我的内核加载到其中。我看到人们已经知道如何从模拟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 回复  |  直到 7 年前
        1
  •  2
  •   Peter Maydell    7 年前

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

    只使用-内核要简单得多。。。

        2
  •  1
  •   ajxs    7 年前

    在网上进行了一些阅读和搜索,以及彼得·梅德尔(PeterMaydell)等其他撰稿人对上述答案的帮助后,我想我已经回答了自己的问题。除非我弄错了 qemu-system-arm 不完全模拟Raspberry Pi引导过程,而只是加载使用 -kernel 参数,将二进制文件加载到来宾系统内存并跳到入口点。看起来没有任何额外的硬件引导 -M raspi2 不幸地

    Can ARM qemu system emulator boot from card image without kernel param? 此问题与此类似,并包含有关此问题的一些更有用的详细信息,涉及 qemu系统臂 作为一个整体。。