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

ole*_*gst 5 embedded qemu embedded-linux bootloader

我已经看过很多如何运行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"
Run Code Online (Sandbox Code Playgroud)

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

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

dan*_*ter 5

你可以通过提供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).

此示例基于ARM versatilepb板

make CROSS_COMPILE=arm-none-eabi- versatilepb_config
make CROSS_COMPILE=arm-none-eabi- all
Run Code Online (Sandbox Code Playgroud)

创建Flash映像 *下载u-boot-xxx.x源代码树并将其解压缩到源树目录并构建它

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
Run Code Online (Sandbox Code Playgroud)

启动Linux

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

qemu-system-arm -M versatilepb -m 128M -kernel flash.bin -serial stdio
Run Code Online (Sandbox Code Playgroud)


Pet*_*ell 2

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

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