正常
59 — RK3568 QEMU 模拟研究线立项 + M0 Day 0 绿灯(2026-08-24)
Discussion #7 把「可验证」定为 AELS 第一要务,rk-forge 的回答是把空白填上: 全世界 QEMU/Renode 都没有 Rockchip 机器模型,咱们自己写一个最小的。 当天完成 M0 Day 0:forge 的 v7.1 内核 + forge stage 的 busybox 用户态在 QEMU virt 上完整跑到 shell,三断言 PASS,排掉三个真 bug。
0. 结论
| 项 | 结果 |
|---|---|
| 研究线 | rk3568-lite 最小 QEMU 机器模型(4×A55 + GICv3 + UART + 24MHz fixed-clock) |
| M0 Day 0 | ✅ virt 参考启动三断言 PASS(2026-08-24,QEMU 8.2.2) |
| 验收断言 | Linux version 7\.1\. / Run /init as init process / RK3568-M0-SHELL-OK |
| 资产 | boards/rk3568-atk/sim/:build-initramfs.sh / boot-smoke.sh / rk3568-lite.dts(+dtb) / initramfs(9.0M) |
| 排掉的 bug | ① fakeroot 作用域 ② console 设备节点 ③ lib64→lib 软链(§2) |
| 下一步 | Day 1-2 QEMU 骨架 hw/arm/rk3568-lite.c(模板 imx8mp-evk.c)→ Day 4-5 目标机验收 |
| 口径纪律 | M4(目标机 shell + 断言绿)前对外只称研究线 planned |
1. 立项依据(调研钉死的事实)
- QEMU 主线 hw/arm 50+ 机器零 Rockchip,qemu-devel 无在途系列;Renode 363 个 平台文件零 Rockchip(issue #508 开着没人做)。唯一的尝试 tobyc11/qemu-rk3399 = 465 行、4 个提交挤在 2024-10-09 一天、没跑到 U-Boot、22 个月没动—— 坑位清单可参考(fake PLL lock 等),代码不可用。
- 工作量先例:imx8mp-evk 首提交 "bare minimum" 689 行(CPU/RAM/GIC/串口,其余 UNIMPLEMENTED_DEVICE 铺图),个人贡献者 2 个月合入主线。rk3568-lite 同姿势估 1000-2500 行 QEMU 侧。
- 工作方式(已裁定):需要什么,添加什么。需求探测器 = QEMU unimplemented MMIO 访问日志;每设备三件套 = 模型 + gotcha 卡 + smoke 断言,缺一不合入。
2. Day 0 排 bug 全记录(静态检查查不出的类别)
三连 FAIL → PASS,每一环都有实锤:
- init 秒退
exit_group→ panic。第一嫌疑 fakeroot——mknod只在 fakeroot 会话里「存在」,cpio 在会话外跑,console 被归档成 0 字节普通文件。实锤:cpio -itv显示-rw------- dev/console而非crw 5,1。修复:mknod 和 cpio 挪进同一个fakeroot sh -c。 - 节点真了还是秒退。日志翻出真凶:
/bin/sh: error while loading shared libraries: libresolv.so.2——busybox 动态链 glibc。 - 包里明明有
lib/libresolv.so.2还报缺。问 loader 本体:strings 显示默认 搜索路径是 /lib64:/usr/lib64(buildroot glibc slibdir=/lib64),libc 是 loader 特判加载所以只有 libresolv 报错。真机 rootfs 顶层本来就有lib64 -> lib软链,initramfs 没带。修复一行:stage 里建同款软链。
附带说明:第 3 环差点误判成「forge rootfs 本身带病」——查完是 initramfs 打包 缺链,真机 rootfs 无恙。但排查过程恰好演示了「可验证」的价值:这类问题 pack 自检、lint、文档全查不出来,只有真跑一次才现形。
3. 关键事实(Day 1-5 都要用)
| 事实 | 出处 |
|---|---|
| RK3568 DRAM 基址 = 0x0 | U-Boot rk3568_common.h CFG_SYS_SDRAM_BASE=0(纠正了想当然的 0x40000000) |
| GICD@0xfd400000 / GICR@0xfd460000 | rk356x-base.dtsi(v7.1 在树文件,非 rk356x.dtsi) |
| UART2@0xfe660000,SPI 118,reg-shift=2 | 同上;clocks 换 24MHz fixed-clock(真板基准同频,分频一致) |
| 内核 .config 自带 PL011_CONSOLE=y | 同一颗 Image 通吃 virt 和 rk3568-lite,零重编 |
| 七节点 DTS 已编译通过 | cpus/psci/gic/timer/uart2/memory/chosen+aliases,dtb 2.1K |
4. 复现
终端
cd boards/rk3568-atk/sim
./build-initramfs.sh # 需先 forge stage 出 out/rk3568-atk/rootfs
./boot-smoke.sh virt # Day 0 参考启动;Day 4 起换 rk3568-lite