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) 내가 지정하는 것과 관계없이 사용 가능한 개발이 표시되지 않습니다.

디스크가 보이지 않으므로 드라이버가 누락된 것으로 가정합니다. 왜 데비안 빌드 커널에 포함되지 않습니까? 나는 몇 가지 기사에서 읽은 내용 중 일부를 사용자 정의 커널로 컴파일하려고 시도했지만 아무것도 작동하지 않는 것 같았습니다. 여기에서 활성화해야 하는 특정 구성을 아는 사람이 있나요?

나도 찾았어이 시즈칼러 가이드buildroot를 사용하여 rootfs를 생성합니다. 커널이 디스크를 볼 수도 없다면 그들의 가이드가 왜 작동하는지 이해하지 못합니다. 또한 나는 debootstrap을 사용하고 싶습니다. 이 모든 것의 근원인 장치 트리가 누락된 것인가요 -dtb /linux/arch/arm/boot/dts/vexpress-v2p-ca15-tc1.dtb?

다른 아이디어가 있나요?

답변1

누락된 장치 트리는 실제로 문제입니다. 데비안 빌드 커널에서는 작동하도록 할 수 없지만 사용자 정의 빌드 커널은 즉시 작동합니다( make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- vexpress_defconfig).

최종 운영 체제는 다음과 같이 부팅됩니다(DTB를 얻으려면 syzkaller의 가이드를 따르세요).

    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

관련 정보