作为一名长期从事嵌入式开发的工程师,我最近在RK3588平台上实现了AB双系统支持。这种架构的最大优势在于能够实现无缝系统升级,当A系统正在运行时,可以安全地将新版本部署到B系统,反之亦然。如果升级失败或新版本存在问题,设备可以自动回退到之前的稳定版本,极大提高了系统可靠性。
瑞芯微的AB系统实现基于Android Verified Boot 2.0(AVB2.0)技术规范。AVB2.0通过在启动过程中验证每个阶段的数字签名,确保系统完整性。在RK3588平台上,这一机制通过以下几个关键组件协同工作:
实际开发中发现,瑞芯微官方文档对AB系统的描述较为简略,很多关键配置需要开发者自行摸索。这也是我撰写本文的主要原因——分享那些官方文档没有详细说明的实战细节。
要让U-Boot支持AB系统,需要在配置文件(通常是rk3588_defconfig)中启用以下关键选项:
makefile复制CONFIG_AVB_LIBAVB=y # 启用AVB基础库
CONFIG_AVB_LIBAVB_AB=y # 启用AB系统支持
CONFIG_AVB_LIBAVB_ATX=y # 启用ATX扩展功能
CONFIG_AVB_LIBAVB_USER=y # 启用用户空间支持
CONFIG_RK_AVB_LIBAVB_USER=y # 瑞芯微特定配置
CONFIG_ANDROID_AB=y # Android AB系统支持
这些配置项主要实现以下功能:
在实际项目中,我们还需要根据具体硬件进行板级支持包(BSP)的定制。以我手头的开发板为例,需要额外配置:
c复制// 网络交换芯片初始化
#define CONFIG_RESET_SF2507 1
// 其他外设电源管理
#define CONFIG_POWER_WIFI 1
#define CONFIG_POWER_5G 1
这些定制配置通常放在include/configs/rk3588_evb.h文件中。建议在修改前先备份原始配置,并做好版本控制。
RK3588平台提供两种编译方式:
方法一:直接编译
bash复制export CROSS_COMPILE=/opt/aarch64-linux-gnu-10.3/bin/aarch64-none-linux-gnu-
make rk3588_defconfig
make ARCH=arm
./make.sh
方法二:使用SDK脚本编译
bash复制./build.sh uboot
我推荐使用第二种方法,因为它会自动处理工具链路径和依赖关系。编译过程中几个关键阶段:
编译完成后,可以在U-Boot目录下找到以下关键文件:
u-boot.bin:原始二进制文件u-boot.img:带RK头部信息的镜像文件rk3588_spl_loader_v1.18.113.bin:SPL加载器RK3588的AB系统需要精心设计分区表。通过parameter.txt文件定义,典型配置如下:
code复制FIRMWARE_VER: 1.0
MACHINE_MODEL: RK3588
MACHINE_ID: 007
MANUFACTURER: RK3588
MAGIC: 0x5041524B
ATAG: 0x00200800
MACHINE: 0xffffffff
CHECK_MASK: 0x80
PWR_HLD: 0,0,A,0,1
TYPE: GPT
CMDLINE: mtdparts=:0x00004000@0x00004000(uboot),0x00002000@0x00008000(misc),0x00040000@0x0000a000(boot_a),0x00040000@0x0004a000(boot_b),0x00600000@0x0008a000(system_a),0x00600000@0x0068a000(system_b),0x00040000@0x00c8a000(oem),-@0x00cca000(userdata:grow)
关键分区说明:
uboot:8MB,存放bootloadermisc:4MB,存放AB系统状态信息boot_a/boot_b:各128MB,存放内核镜像system_a/system_b:各3GB,存放根文件系统oem:128MB,厂商定制分区userdata:动态扩展,存放用户数据瑞芯微提供了便捷的分区调整命令:
bash复制# 查看当前分区表
./build.sh list-parts
# 调整system_a分区大小为3GB
./build.sh resize-part:system_a:3G
# 调整boot_b分区大小为128MB
./build.sh resize-part:boot_b:128M
注意:调整分区大小后,必须重新生成系统镜像,否则可能导致启动失败。建议在开发初期就规划好分区方案,避免频繁调整。
通过menuconfig配置AB系统支持:
bash复制./build.sh menuconfig
在菜单中勾选以下选项:
Update → A/B update supportPackage file list → Manual configuration然后将预先编译好的内核镜像(boot.img)和根文件系统(rootfs.img)放入output/firmware/目录,执行打包命令:
bash复制./build.sh updateimg
打包过程会生成update-ab.img文件,其中包含:
成功编译并烧写后,U-Boot启动时会显示AB系统相关信息:
code复制U-Boot 2017.09 (Jan 23 2026 - 16:09:30 +0800)
Model: Rockchip RK3588 Evaluation Board
DRAM: 8 GiB
A/B-slot: _a, successful: 0, tries-remain: 5
Device is: UNLOCKED
关键信息解读:
A/B-slot: _a:当前从A系统启动successful: 0:A系统尚未成功启动过tries-remain: 5:剩余尝试次数5次使用RKDevTool将update-ab.img烧写到设备后,可以通过以下命令验证分区:
bash复制# 在Android/Linux系统中查看分区
ls -l /dev/block/by-name/
# 查看分区大小
cat /proc/partitions
确保看到以下关键分区:
问题1:系统无法启动
问题2:启动循环
问题3:分区大小不符
原始SDK目录较大(约7GB),通过以下方法精简到119MB:
kernel/drivers/misc)精简后的目录结构:
code复制sdk/
├── build.sh -> device/rockchip/common/scripts/build.sh
├── device/
├── kernel/drivers/misc/
├── output/
├── rkbin/
├── tools/
└── u-boot/
build.sh中添加export CCACHE=1./build.sh -j$(nproc) uboot./make.shavb=1查看详细验证过程rockusb工具测试DDR初始化在项目开发中,我遇到最棘手的问题是系统偶尔会错误切换AB分区。经过分析发现是misc分区写入时序问题,通过在U-Boot中添加延时和重试机制最终解决。这个案例告诉我,AB系统的稳定性不仅依赖软件配置,硬件特性也需要充分考虑。