首页 文章

ARM qemu系统仿真器可以在没有内核参数的情况下从卡映像启动吗?

提问于
浏览
5

我已经看过很多如何运行QEMU ARM板仿真器的例子 . 在每种情况下,除了SD卡图像参数外,QEMU也总是提供内核参数,即:

qemu-system-arm -M versatilepb \
                -kernel vmlinuz-2.6.18-6-versatile \ #KERNEL PARAM HERE
                -initrd initrd.gz \
                -hda hda.img -append "root=/dev/ram"

我正在使用引导加载程序,并且想要创建我自己的可引导SD卡,但是还没有真正的主板,并希望学习模拟的 . 但是,如果按上述方式运行,QEMU将跳过引导加载程序阶段并运行内核 .

那么我该怎样做才能在QEMU上模拟完整的启动序列,以便它执行bootloader?我应该获得ROM转储并将其作为 -bios param传递吗?

2 回答

  • 0

    你可以通过提供uboot图像来做到这一点 . 我从来没用过ROM转储 .

    QEMU BOOT SEQUENCE:

    • 在实际的物理板上,引导过程通常涉及包含引导加载程序和操作系统的非易失性存储器(例如,闪存) . 上电时,核心加载并运行引导加载程序,然后加载并运行操作系统 .

    • QEMU可以在许多平台上模拟闪存,但不能在VersatilePB上模拟闪存 . 有补丁广告程序可以添加闪存支持,但是现在我想要保留QEMU .

    • QEMU可以使用-kernel和-initrd选项加载Linux内核;在较低级别,这些选项具有将两个二进制文件加载到模拟内存中的效果:地址0x10000(64KiB)的内核二进制文件和地址0x800000(8MiB)的ramdisk二进制文件 .

    • 然后QEMU准备内核参数并跳转到0x10000(64KiB)来执行Linux . 我想使用U-Boot重新创建相同的情况,并且为了保持情况类似于真实的情况,我想创建一个包含整个系统的单个二进制映像,就像拥有一个Flash一样 . QEMU中的-kernel选项将用于将Flash二进制文件加载到模拟内存中,这意味着二进制映像的起始地址将为0x10000(64KiB) .

    This example is based of ARM versatilepb board

    make CROSS_COMPILE=arm-none-eabi- versatilepb_config
    make CROSS_COMPILE=arm-none-eabi- all
    

    Creating the Flash image 下载u-boot-xxx.x源代码树并将其 cd解压缩到源树目录并构建它

    mkimage -A arm -C none -O linux -T kernel -d zImage -a 0x00010000 -e 0x00010000 zImage.uimg
    mkimage -A arm -C none -O linux -T ramdisk -d rootfs.img.gz -a 0x00800000 -e 0x00800000 rootfs.uimg
    dd if=/dev/zero of=flash.bin bs=1 count=6M
    dd if=u-boot.bin of=flash.bin conv=notrunc bs=1
    dd if=zImage.uimg of=flash.bin conv=notrunc bs=1 seek=2M
    dd if=rootfs.uimg of=flash.bin conv=notrunc bs=1 seek=4M
    

    Booting Linux

    要启动Linux,我们最终可以调用:

    qemu-system-arm -M versatilepb -m 128M -kernel flash.bin -serial stdio
    
  • 5

    您需要通过-bios(或pflash选项)传递某种引导加载程序映像,是的 . 我怀疑ROM转储是否会起作用 - 通常ROM会比QEMU提供更接近真实硬件的保真度 . 您需要编写并测试的引导加载程序才能与QEMU一起使用 . 例如,如果您使用'virt'板和为QEMU构建的UEFI映像 .

    否则QEMU将使用其“内置引导加载程序”,这是一些能够引导您使用-kernel传递内核的指令 .

相关问题