在 qemu arm64 虚拟机上测试 u-boot

在 qemu arm64 虚拟机上测试 u-boot

我正在尝试在 qemu arm64 虚拟机上运行 u-boot 。 (qemu 6.2.0,u-boot v2022.07)所以我使用 qemu_arm64_defconfig 编译了 u-boot,它确实构建了 u-boot (而不是 u-boot-spl)。我做了 initrd 以下 BeagleBone black 上带有 initramfs 的 U-Boot“错误的 Ramdisk 映像格式”。这是我创建 initrd.img 所用的命令。

mkimage -A arm64 -T ramdisk -d ../../../busybox-1.32.1/initramfs.cpio.gz initrd.img

我在include/configs/qemu-arm.h中看到,

#define CONFIG_EXTRA_ENV_SETTINGS \
    "fdt_high=0xffffffff\0" \
    "initrd_high=0xffffffff\0" \
    "fdt_addr=0x40000000\0" \
    "scriptaddr=0x40200000\0" \
    "pxefile_addr_r=0x40300000\0" \
    "kernel_addr_r=0x40400000\0" \
    "ramdisk_addr_r=0x44000000\0" \
    BOOTENV

因此,引用上述环境变量,这是我运行 qemu 的命令。(qemu 在第一个 DRAM 位置 0x40000000 生成 dtb)。

   qemu-system-aarch64 -machine virt,gic-version=max,secure=on,virtualization=true -cpu max u-boot -m 2G -nographic -bios u-boot.bin -device loader,file=linux-5.15.68/arch/arm64/boot/Image,addr=0x40400000 -device loader,file=initrd.img,addr=0x44000000

u-boot 运行并出现命令提示符。所以我跑了

=> booti 0x40400000 0x44000000 0x40000000  
## Loading init Ramdisk from Legacy Image at 44000000 ...
   Image Name:   
   Created:      2023-05-30   2:50:14 UTC
   Image Type:   AArch64 Linux RAMDisk Image (gzip compressed)
   Data Size:    6671800 Bytes = 6.4 MiB
   Load Address: 00000000
   Entry Point:  00000000
   Verifying Checksum ... OK  
## Flattened Device Tree blob at 40000000
   Booting using the fdt blob at 0x40000000
   Loading Ramdisk to be771000, end bedcddb8 ... OK
   Loading Device Tree to 00000000be66e000, end 00000000be770fff ... OK

Starting kernel ...

它显示那里没有进程。我究竟做错了什么?

当 u-boot 运行时(在我给出 booti 命令之前),之前在提示符下给出上面的 booti 命令之前,我看到了这个输出。

U-Boot 2022.07 (May 29 2023 - 16:05:33 +0900)

DRAM:  2 GiB
Core:  45 devices, 12 uclasses, devicetree: board
Flash: 32 MiB
Loading Environment from Flash... *** Warning - bad CRC, using default environment

In:    pl011@9000000
Out:   pl011@9000000
Err:   pl011@9000000
Net:   eth0: virtio-net#32
Hit any key to stop autoboot:  0 
starting USB...
No working controllers found
USB is stopped. Please issue 'usb start' first.
scanning bus for devices...

Device 0: unknown device

Device 0: 1af4 VirtIO Block Device
            Type: Hard Disk
            Capacity: 6.8 MB = 0.0 GB (14024 x 512)
... is now current device
** No partition table - virtio 0 **
Couldn't find partition virtio 0:1

Device 0: unknown device
starting USB...
No working controllers found
BOOTP broadcast 1
DHCP client bound to address 10.0.2.15 (2 ms)
Using virtio-net#32 device
TFTP from server 10.0.2.2; our IP address is 10.0.2.15
Filename 'boot.scr.uimg'.
Load address: 0x40200000
Loading: *
TFTP error: 'Access violation' (2)
Not retrying...
BOOTP broadcast 1
DHCP client bound to address 10.0.2.15 (0 ms)
Using virtio-net#32 device
TFTP from server 10.0.2.2; our IP address is 10.0.2.15
Filename 'boot.scr.uimg'.
Load address: 0x40400000
Loading: *
TFTP error: 'Access violation' (2)
Not retrying...

看起来 u-boot 正在尝试加载 0x40200000 处的 uboot.scr.uimg 文件。什么是 uboot.scr.uimg 以及如何制作它?

答案1

这是一个延迟很长时间的答案,我在这里写下我后来如何解决它(来自我的工作笔记)。
后来我发现它在 Linux 代码中初始化 SVE 时停止了。 qemu 虚拟机似乎不提供 SVE 支持,因此我关闭了 CONFIG_ARM64_SVE 并且它通过了这一点。然后我将 RAM 大小增加到 4G,然后继续“释放未使用的内核内存:1088K”。然后我将 OPTIONAL_KERNEL_RWX 的默认值更改为 y (来自 arch/Kconfig)并将 STRICT_KERNEL_RWX 设置为 n。 (我不知道为什么我必须这样做,但否则它就会停止)。它继续执行 shell 的提示,但 shell 没有响应我的键盘输入。最后我在u-boot配置中添加了CONFIG_GICV3,(因为中断不起作用,定时器和键盘中断之前不起作用),shell终于工作正常了。希望这对以后的人有帮助。

相关内容