Qemu 引导原始内核映像(不是 ELF)

Qemu booting raw kernel image (not ELF)

有没有办法说服 qemu(qemu-system-mipsel v4.1.0,如果重要的话)加载为(古老的)u-boot 构建的二进制(非 elf)映像?

我尝试了我的 uImage 和 vmlinux.bin,但我总是得到 "The image is not ELF"

完整的命令行是:

qemu-system-mipsel -M malta -kernel output/images/vmlinux.bin -serial stdio -drive file=output/images/rootfs.ext2,format=raw -append "rootwait root=/dev/hda" -net nic,model=pcnet -net user

错误是:

qemu-system-mipsel: could not load kernel 'output/images/vmlinux.bin': The image is not ELF

...这绝对是真的!该图像(它的 uImage 对应部分,实际上)在真实目标上运行良好(与 Malta 非常相似,但这超出了重点;失败的内核将是一个完全不同的问题)使用(在 u-boot 中)一些东西喜欢:

usb reset; fatload usb 0 85000000 uImage; fatload usb 0 86000000 initram.cpio.xz; setenv bootargs rd_start=0x86000000 rd_size=15000000 USE=usb; bootm 85000000

如前所述:我的问题是 qemu 甚至 尝试 加载图像,而不是它在 运行 时失败。

正确的咒语是什么?

您必须为 QEMU MIPS 构建 U-Boot 并将其作为内核传递给 qemu-system-mips。 您可以使用 QEMU tftp 参数使保存 uImage 的目录可用于 U-Boot。

使用U-Boot的tftp命令加载内核镜像,bootm命令启动内核

您可能必须使用 -bios 标志来提供 U-boot 图像,然后自己设置环境以对内核执行 hand-off。以我的理解,QEMU要求ELF-formatted images被提供给-kernel flag,大概是因为ELF中包含的数据headers是配置环境所必需的(重点强调这个词)代替真正的引导加载程序(因为您有效地绕过了该引导阶段并直接跳转到内核执行)。 -bios 没有这些要求,因为您可能不会看到使用 ELF headers 的 first-stage 二进制文件。

如果您知道内核映像的入口点,这似乎是您基于该 uboot 命令所做的,您可以将 -bios 标志与 -device loader,addr=[entry point],cpu-num=0 结合使用。但是,如果您的硬件中有任何 MMU、TLB 或其他 arch-specific 寻址,您可能 运行 会遇到问题。

对所有这些持怀疑态度,因为我只是在利用我通过与您类似的事情获得的知识来工作。可能有更好的方法。