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 VM은 SVE 지원을 제공하지 않는 것 같아서 CONFIG_ARM64_SVE를 끄고 통과했습니다. 그런 다음 RAM 크기를 4G로 늘리고 "사용하지 않는 커널 메모리 해제: 1088K"를 계속했습니다. 그런 다음 OPTIONAL_KERNEL_RWX의 기본값을 y(arch/Kconfig에서)로 변경하고 STRICT_KERNEL_RWX를 n으로 설정했습니다. (왜 이렇게 해야 하는지는 모르겠지만, 그렇지 않으면 멈출 것입니다). 쉘 프롬프트를 계속 실행하지만 쉘이 키보드 입력에 응답하지 않습니다. 마지막으로 u-boot 구성에 CONFIG_GICV3을 추가했는데(인터럽트가 작동하지 않았기 때문에 이전에는 타이머와 키보드 인터럽트가 작동하지 않았습니다) 마침내 쉘이 제대로 작동했습니다. 이것이 미래에 누군가에게 도움이 되기를 바랍니다.

관련 정보