RK3576执行boot命令后到底跑了哪些步骤?——RKIMG_BOOTCOMMAND拆解 电子说
| 在 U‑Boot 命令行输入 boot,设备就开始启动内核了。但在这之前到底发生了什么?如果启动失败,是卡在了设备检测阶段,还是引导尝试阶段?为什么 RK3576 从 eMMC 启动时有时会尝试检测 SD 卡?本文逐行拆解 RKIMG_BOOTCOMMAND 和RKIMG_DET_BOOTDEV 的完整执行过程。 |
| 导读:RK 平台 U‑Boot 的 bootcmd 环境变量默认由RKIMG_BOOTCOMMAND 宏定义。这不是一个简单的命令,而是一个复杂的多级启动策略—— 它自动检测启动设备(SD 卡→eMMC→MTD→USB→PXE),然后对每个设备尝试多种引导方式。理解这个检测链和引导尝试顺序,是排查启动问题的关键。 |
一、RKIMG_BOOTCOMMAND 的结构
CONFIG_BOOTCOMMAND 在include/configs/evb_rk3576.h 中赋值为RKIMG_BOOTCOMMAND,该宏定义在include/configs/rockchip‑common.h 中,根据安全配置有三个变体:
// include/configs/evb_rk3576.h#ifndef CONFIG_SPL_BUILD#undef CONFIG_BOOTCOMMAND#define CONFIG_BOOTCOMMAND RKIMG_BOOTCOMMAND#endif
// include/configs/rockchip-common.h (在 #ifndef CONFIG_SPL_BUILD 块内)// 变体1:AVB签名验证启用#if defined(CONFIG_AVB_VBMETA_PUBLIC_KEY_VALIDATE)#define RKIMG_BOOTCOMMAND "boot_android ${devtype} ${devnum};"// 变体2:FIT签名启用#elif defined(CONFIG_FIT_SIGNATURE)#define RKIMG_BOOTCOMMAND "boot_fit;"// 变体3:默认(RK3576通常使用)#else#define RKIMG_BOOTCOMMAND "boot_android ${devtype} ${devnum};" "boot_fit;" "bootrkp;" "run distro_bootcmd;"#endif
RK3576 默认走变体 3,依次尝试四种引导方式。
二、设备检测链 (RKIMG_DET_BOOTDEV)
在执行RKIMG_BOOTCOMMAND 之前,必须先确定启动设备。这一工作由RKIMG_DET_BOOTDEV 完成,它也是一个环境变量宏:

三、四种引导方式的优先级
设备确定后,RKIMG_BOOTCOMMAND 按顺序尝试引导:

① boot_android — Android 引导
用于启动 Android 或带有 Android boot header 的 Linux 镜像。扫描 boot 和 vendor_boot 分区:
# boot_android 内部流程# 1. 读取boot分区头部(boot.img header)# 2. 解析kernel/ramdisk/dtb偏移# 3. 如果启用AVB → 验证vbmeta签名# 4. 加载kernel到kernel_addr_r# 5. 加载DTB到fdt_addr_r# 6. booti 引导
② boot_fit — FIT 镜像引导
尝试从boot分区加载 FIT 格式的镜像文件:
# boot_fit 内部流程# 1. 在boot分区中查找FIT镜像# 2. 解析FIT的configurations段# 3. 提取kernel/fdt/ramdisk# 4. 校验签名(如果CONFIG_FIT_SIGNATURE启用)# 5. bootm 引导
③ bootrkp — Rockchip 签名包
Rockchip 专有的签名引导方式,使用 bootrkp 命令:
# bootrkp 内部流程# 1. 加载签名后的boot资源# 2. 验证RSA签名# 3. 提取并引导内核
④ distro_bootcmd — 发行版引导
标准 U‑Boot 发行版引导命令,扫描所有可用设备尝试加载 extlinux/extlinux.conf 或boot.scr:
# distro_bootcmd 的 BOOT_TARGET_DEVICES# 1. MMC (mmc 1, mmc 0) ← SD卡优先# 2. MTD (mtd 2, mtd 1, mtd 0)# 3. RKNAND (rknand 0)# 4. USB (usb 0)# 5. PXE (网络)# 6. DHCP (网络)
四、debug 启动问题
当启动遇到问题时,可以通过以下方式调试:
# 查看当前bootcmd=> printenv bootcmd=> printenv devtype devnum # 查看设备检测结果# 手动模拟设备检测=> run rkimg_bootdev # 执行设备检测脚本# 输出: Boot from SDcard (或eMMC等)# 单步执行各引导方式=> boot_android ${devtype} ${devnum}=> boot_fit=> run distro_bootcmd# 查看设备检测的具体命令=> printenv rkimg_bootdev
五、定制 RKIMG_BOOTCOMMAND
如果需要修改默认启动行为,可以在板级头文件中覆盖:
// include/configs/evb_rk3576.h(或其他板级头文件)#define CONFIG_BOOTCOMMAND "if mmc dev 1; then " "fatload mmc 1:1 ${kernel_addr_r} Image; " "fatload mmc 1:1 ${fdt_addr_r} rk3576.dtb; " "booti ${kernel_addr_r} - ${fdt_addr_r}; " "elif mmc dev 0; then " "ext4load mmc 0:1 ${kernel_addr_r} boot/Image; " "ext4load mmc 0:1 ${fdt_addr_r} boot/dtbs/rk3576.dtb; " "booti ${kernel_addr_r} - ${fdt_addr_r}; " "fi"
审核编辑 黄宇
全部0条评论
快来发表一下你的评论吧 !