我已经看过很多关于如何运行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 参数传递吗?
答案 0 :(得分:5)
您可以通过提供uboot图像来实现。我从来没用过ROM转储。
在实际的物理板上,引导过程通常涉及包含引导加载程序和操作系统的非易失性存储器(例如,闪存)。上电时,核心加载并运行引导加载程序,然后加载并运行操作系统。
QEMU可以在许多平台上模拟Flash内存,但不能在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
制作Flash图片 *下载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
启动Linux
要启动Linux,我们最终可以调用:
qemu-system-arm -M versatilepb -m 128M -kernel flash.bin -serial stdio
答案 1 :(得分:0)
您需要通过-bios(或pflash选项)传递某种引导加载程序映像,是的。我怀疑ROM转储是否会起作用 - 通常ROM会比QEMU提供更接近真实硬件的保真度。您需要编写并测试的引导加载程序才能与QEMU一起使用。例如,如果您使用'virt'板和为QEMU构建的UEFI映像。
否则QEMU将使用其“内置引导加载程序”,这是一些能够引导你通过-kernel传递内核的指令。