Skip to content

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,每一环都有实锤:

  1. init 秒退 exit_group → panic。第一嫌疑 fakeroot——mknod 只在 fakeroot 会话里「存在」,cpio 在会话外跑,console 被归档成 0 字节普通文件。实锤: cpio -itv 显示 -rw------- dev/console 而非 crw 5,1。修复:mknod 和 cpio 挪进同一个 fakeroot sh -c。
  2. 节点真了还是秒退。日志翻出真凶:/bin/sh: error while loading shared libraries: libresolv.so.2——busybox 动态链 glibc。
  3. 包里明明有 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 基址 = 0x0U-Boot rk3568_common.h CFG_SYS_SDRAM_BASE=0(纠正了想当然的 0x40000000)
GICD@0xfd400000 / GICR@0xfd460000rk356x-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

由 rk-forge pdf/2026-06-23-1120-192-gd5045ae 构建