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 寻址,您可能 运行 会遇到问题。
对所有这些持怀疑态度,因为我只是在利用我通过与您类似的事情获得的知识来工作。可能有更好的方法。
有没有办法说服 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 寻址,您可能 运行 会遇到问题。
对所有这些持怀疑态度,因为我只是在利用我通过与您类似的事情获得的知识来工作。可能有更好的方法。