如何使用 QEMU 启动 ARM 内核?

如何使用 QEMU 启动 ARM 内核?

我很难使用 QEMU 启动带有 rootfs 的 ARM Linux 内核。首先我尝试自己编译它,然后求助于 debian linux-image-rt-armmp 内核,但没有任何效果。

这是我得到的:

  • 我使用 debootstrap 在 ext4 磁盘映像上创建了 rootfs
  • 我已经在vmlinuz(对于debian编译的)/ bzImage(自行编译的)中准备好了linux内核
  • 我复制了 debootstrap 创建的 initrd

我尝试了几次 QEMU 调用:

  • qemu-system-arm -machine virt -kernel linux-kernel/vmlinuz -append "root=/dev/sda rootwait console=ttyAMA0" -drive file=./armhf.img,format=raw,index=0,media=disk -cpu cortex-a15 -smp 2 -s -m 1024< 这会等待,因为磁盘永远不可用
  • qemu-system-arm -machine virt -kernel linux-kernel/vmlinuz -append "root=/dev/ram rootwait console=ttyAMA0" -initrd linux-kernel/initrd.img -cpu cortex-a15 -smp 2 -s -m 1024 -nographic< 这会启动到 initramfs,但是找不到 /dev/ram 或任何其他磁盘
  • 如果我指定另一个-machine,那么virt一切都会变得安静,我看不到任何东西
  • -drive file=...使用-sd/指定的各种变体-hda。如果我让内核处于恐慌状态(即省略rootwait),则无论我指定什么,我都看不到任何可用的开发。

因为我没有看到磁盘,所以我假设缺少驱动程序。为什么它们没有被纳入 Debian 构建的内核中?我尝试将我在几篇文章中读到的一些内容编译到自定义内核中,但似乎没有任何效果。有谁知道我需要在这里启用的具体配置?

我还发现这个 syzkaller 指南它使用 buildroot 创建 rootfs。虽然我不明白为什么如果内核甚至看不到磁盘,他们的指南会起作用。另外我宁愿使用debootstrap。我是否缺少这一切的根源设备树-dtb /linux/arch/arm/boot/dts/vexpress-v2p-ca15-tc1.dtb

还有其他想法吗?

答案1

丢失的设备树确实是一个问题。我无法让它与 debian 构建的内核一起工作,但是自定义构建的内核可以开箱即用(make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- vexpress_defconfig)。

最终操作系统将使用此启动(按照 syzkaller 指南获取 DTB):

    qemu-system-arm \
        -machine vexpress-a15 \
        -kernel linux-6.4.5/arch/arm/boot/zImage \
        -append "root=/dev/mmcblk0 console=ttyAMA0" \
        -sd ./armhf.img \
        -smp 2 \
        -m 1024 \
        -dtb vexpress-v2p-ca15-tc1.dtb \
        -nographic

相关内容