我按照 https://github.com/s-matyukevich/raspberry-pi-os/blob/master/docs/lesson01/rpi-os.md 为树莓派运行我的第一个 aarch64 内核。我构建了它并将
kernel8.img
放入从 https://downloads.raspberrypi.com/raspios_full_arm64/images/raspios_full_arm64-2024-07-04/获取的图像中。
为了运行 QEMU,我使用了以下命令:
emu-system-aarch64 \
-machine raspi4b \
-cpu cortex-a72 \
-smp 4 -m 2G \
-dtb bcm2711-rpi-4-b.dtb \
-drive format=raw,file=2024-07-04-raspios-bookworm-arm64-full.img
在QEMU中我只看到黑屏,我用谷歌搜索并发现Qemu裸机仿真 - 如何查看UART输出?,实际上
-semihosting --semihosting-config enable=on,target=native
和-serial mon:stdio
都不适合我,屏幕仍然是黑色的。
我也尝试过命令:
qemu-system-aarch64 -M raspi4b \
-display none \
-serial null \
-serial stdio \
-kernel kernel8.img
来自如何在 Qemu (raspi3b) 中的 miniUART 中打印某些内容?,这也不起作用。我认为代码是有效的,因为我没有更改它,实际上是从 github 克隆的。
在
gdb
中,我可以看到 QEMU 执行指令,但是当我将 -kernel
选项与原始二进制文件一起使用时,QEMU 甚至没有开始执行 kernel_main
它在两者之间的某个地方丢失了自己。虽然当我使用 ELF 二进制文件时,它开始执行 kernel_main
但在 uart_send
中使用第一个字符 (H
) 循环,并且控制台中没有任何反应,当我使用 -sd
选项启动它时也会发生同样的情况。
UPD1:
我发现,如果我使用
-sd
选项启动它(内核被复制到映像中),它会在 UART 初始化 put32(AUX_MU_IER_REG,0);
上循环,其中 AUX_MU_IER_REG = PBASE+0x00215044
和 PBASE = 0x3F000000
,我不知道为什么会发生这种情况。
UPD2:
嗯,我发现辅助寄存器和 GPIO 寄存器的寄存器基址和偏移量对于
raspi4b
和 raspi3b
是不同的,因此上面链接的代码预计不会在 raspi4b
上运行。 raspi3b
,此代码仍然会输出相同的内容,所以我仍然不知道为什么这不起作用。raspi3b
,所以剩下的问题是采用代码 raspi4b
.
附注:
QEMU版本:
$ qemu-system-aarch64 --version
QEMU emulator version 9.0.2
Copyright (c) 2003-2024 Fabrice Bellard and the QEMU Project developers
上面的命令有什么问题?如何检查 QEMU 是否模拟 UART 以及如何检查其输出?
P.S2.:我不想要
-machine virt
,因为它是通用的,我想完全模仿-machine raspi4b
。
尝试添加
-append "earlycon=pl011,mmio32,0xfe201000 console=ttyAMA0,115200"
qemu-system-aarch64 --version
QEMU emulator version 9.0.50 (v9.0.0-265-gfd87be1dad)
Copyright (c) 2003-2024 Fabrice Bellard and the QEMU Project developers
qemu-system-aarch64 -M raspi4b -serial mon:stdio -nographic -kernel kernel8.img -dtb bcm2711-rpi-4-b.dtb -append "earlycon=pl011,mmio32,0xfe201000 console=ttyAMA0,115200"
[ 0.000000] Booting Linux on physical CPU 0x0000000000 [0x410fd083]
[ 0.000000] Linux version 6.6.44-v8+ (dom@buildbot) (aarch64-linux-gnu-gcc (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0, GNU ld (GNU Binutils for Ubuntu) 2.38) #1790 SMP PREEMPT Mon Aug 5 16:07:01 BST 2024
[ 0.000000] KASLR disabled due to lack of seed
[ 0.000000] Machine model: Raspberry Pi 4 Model B
[ 0.000000] earlycon: pl11 at MMIO32 0x00000000fe201000 (options '')
[ 0.000000] printk: bootconsole [pl11] enabled
[ 0.000000] efi: UEFI not found.
[ 0.000000] Reserved memory: created CMA memory pool at 0x000000002c000000, size 64 MiB
[ 0.000000] OF: reserved mem: initialized node linux,cma, compatible id shared-dma-pool
[ 0.000000] OF: reserved mem: 0x000000002c000000..0x000000002fffffff (65536 KiB) map reusable linux,cma
[ 0.000000] Zone ranges:
[ 0.000000] DMA [mem 0x0000000000000000-0x000000003bffffff]
[ 0.000000] DMA32 empty
[ 0.000000] Normal empty
...
[ 3.679878] Memory Limit: none
[ 3.680988] ---[ end Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0) ]---