深入解析rk平台Android Bootloader核心代码:从启动流程到AVB验证

电子说

1.4w人已加入

描述

作为Android设备启动的第一道“闸门”,Bootloader(以U-Boot为主)承担着初始化硬件、加载内核、验证镜像完整性的核心职责。今天我们拆解Rockchip平台下android_bootloader.c的核心代码,带你读懂Android设备从Bootloader到内核的完整启动逻辑,以及开发者关注这些代码的核心价值。

一、代码整体定位

这份代码是Rockchip(瑞芯微)平台U-Boot中Android Bootloader的核心实现,核心作用是衔接硬件初始化与内核启动,主要负责:

•读写Bootloader控制块(BCB),判断设备启动模式(正常/Recovery/Bootloader);

•执行Android Verified Boot(AVB)验证,保障镜像完整性;

•加载内核/设备树镜像,组装内核命令行,最终启动内核;

•适配A/B分区、DTBO叠加层等Android特性。

二、核心函数解析:从启动模式判断到内核启动

我们按“启动流程链路”拆解关键函数,理解每个环节的核心作用:

1. BCB读写:启动指令的“中转站”

BCB(Bootloader Control Block)是存储在misc分区的启动控制信息,决定设备下次启动的模式,核心操作由两个函数完成:

android_bootloader_message_load

作用:从misc分区读取BCB数据到内存;

关键逻辑:检查misc分区大小是否足够容纳BCB结构体 → 调用blk_dread读取指定扇区→ 失败则输出日志并返回错误。

android_bootloader_message_write

作用:将内存中的BCB数据写入misc分区;

关键逻辑:与读操作逻辑对称,调用blk_dwrite写入→ 支持“一次性指令”(如bootonce-bootloader)的清空。

android_bcb_write

作用:向BCB写入自定义启动命令(如boot-recovery);

关键逻辑:初始化空BCB结构体 → 查找misc分区→ 写入指定命令(如强制进入Recovery)。

2. 启动模式判断:决定设备“走哪条路”

android_bootloader_load_and_clear_mode

作用:核心启动模式决策函数;

关键逻辑

a.先检查Fastboot缓冲区(CONFIG_FASTBOOT_BUF_ADDR),若有reboot-bootloader指令,直接判定为Bootloader模式;

b.读取BCB,匹配指令:

bootonce-bootloader:一次性进入Bootloader,读取后清空BCB;

boot-recovery/boot-fastboot:进入Recovery模式;

无匹配指令:正常启动模式。

android_boot_mode_str

作用:将枚举类型的启动模式(如ANDROID_BOOT_MODE_RECOVERY)转换为字符串(如recovery),便于日志输出和调试。

3. Bootloader模式:进入Fastboot

android_bootloader_boot_bootloader

作用:触发Fastboot模式;

关键逻辑:读取环境变量fastbootcmd(无则用默认值fastboot usb 0)→ 执行该命令,让设备进入Fastboot刷机模式。

4. 内核加载与启动:核心执行环节

sysmem_alloc_uncomp_kernel

作用:为解压后的内核分配内存;

关键逻辑

a.根据内核压缩类型(LZ4/GZIP/LZO等),按压缩比反向计算解压后大小(如GZIP按40%压缩比,分配2.5倍原大小);

b.释放压缩内核占用的内存→ 分配解压内核所需内存,避免内存溢出。

android_bootloader_boot_kernel

作用:最终启动内核的“临门一脚”;

关键逻辑

a.解析内核地址、压缩类型(如LZ4),输出启动日志;

b.调用sysmem_alloc_uncomp_kernel分配解压内存;

c.调用do_bootm_states执行内核启动流程(加载OS、初始化RAMDisk、执行内核)。

5. 内核命令行:给内核的“启动参数”

strjoin

作用:基础工具函数,将字符串数组用指定分隔符(如空格)拼接成完整字符串。

android_assemble_cmdline

作用:组装内核启动命令行(bootargs);

关键逻辑:拼接以下参数,生成最终bootargs:

○环境变量默认bootargs;

○A/B分区后缀(如androidboot.slot_suffix=_a);

○设备序列号(androidboot.serialno=xxx);

○Root设备路径(root=/dev/xxx);

○额外参数(如Normal模式的skip_initramfs)。

6. AVB验证:启动安全性的“守门人”

AVB(Android Verified Boot)是Android的镜像验证机制,防止恶意镜像刷入,核心函数如下:

android_slot_verify

作用:核心AVB验证函数;

关键逻辑

a.检查设备解锁状态(解锁则跳过严格验证);

b.获取A/B分区元数据,确定当前启动slot(_a/_b);

c.调用avb_slot_verify验证boot/recovery/vendor_boot等分区镜像;

d.验证失败则标记该slot为不可启动 → 验证成功则分发镜像到指定内存地址。

slot_set_unbootable

作用:将指定A/B分区标记为“不可启动”;

关键逻辑:清空分区优先级、剩余尝试次数、启动成功标记,防止设备启动损坏的镜像。

7. 设备树适配:硬件适配的“灵活层”

android_get_dtbo & android_fdt_overlay_apply

作用:加载并应用DTBO(设备树叠加层);

关键逻辑

a.从dtbo/recovery分区读取DTBO镜像;

b.选择指定索引的设备树条目;

c.将DTBO叠加到主设备树(适配不同硬件配置)→ 失败则恢复原设备树。

8. 核心启动流程:android_bootloader_boot_flow

这是整个Bootloader启动的“总控函数”,串联所有环节:

1.读取misc分区,判断启动模式(Normal/Recovery/Bootloader);

2.处理A/B分区slot后缀;

3.执行AVB验证(若开启);

4.加载boot/recovery镜像到指定内存;

5.组装内核命令行;

6.加载DTBO并应用叠加层;

7.调用android_bootloader_boot_kernel启动内核。

三、核心启动流程图

Android

四、开发者关注这部分代码的核心意义

1. 定制启动逻辑,适配产品需求

•可修改BCB指令逻辑,实现定制化启动(如强制进入Recovery、修改Fastboot默认命令);

•适配不同Android版本特性(如动态分区下skip_initramfs替换为androidboot.force_normal_boot=1)。

2. 保障启动安全性,合规Android规范

•AVB验证是Google Play认证的核心要求,理解android_slot_verify等函数,可确保镜像验证逻辑符合Android安全规范;

•处理A/B分区元数据,避免设备因镜像损坏无法启动(标记不可启动slot)。

3. 快速定位启动故障

•启动失败(如无法进入Recovery、内核崩溃)时,可通过函数日志定位问题:

○misc分区读写失败→ 检查分区大小/扇区地址;

○AVB验证失败 → 排查镜像签名/rollback索引;

○内存分配失败→ 调整内核解压内存计算逻辑。

4. 适配硬件与内核,提升兼容性

•DTBO叠加层逻辑可适配同芯片不同硬件配置(如不同屏幕/传感器);

•内核压缩格式适配(LZ4/GZIP等),优化启动速度(代码中已标注RK3308不同压缩格式的启动耗时,LZ4最优)。

5. 定制内存布局,优化启动性能

•sysmem_alloc_uncomp_kernel函数决定内核解压内存的分配策略,合理调整压缩比计算逻辑,可避免内存溢出,同时优化启动速度。

五、总结

android_bootloader.c是Rockchip平台Android Bootloader的“心脏”,串联了启动模式判断、安全验证、镜像加载、内核启动全链路。对于开发者而言:

•理解它,能定制符合产品需求的启动逻辑;

•掌握它,能快速定位启动故障,保障设备稳定性;

•吃透它,能适配Android安全规范,兼顾功能性与安全性。

无论是做Android底层定制、设备刷机工具开发,还是解决Bootloader启动问题,这份代码都是绕不开的核心——它不仅是代码,更是Android设备从“硬件初始化”到“系统启动”的完整逻辑闭环。

审核编辑 黄宇

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分