深入解析RK平台Android/Linux Bootloader核心文件:android_bootloader.c

电子说

1.4w人已加入

描述

Bootloader是Android设备启动的第一道“关卡”,负责初始化硬件、加载系统镜像并完成内核启动的前置准备。在基于U-Boot的Android设备中,android_bootloader.c是对接Android启动逻辑的核心文件——它决定了设备是进入正常系统、Recovery模式还是Fastboot模式,同时承担了AVB(Android Verified Boot)验证、内核加载、命令行参数组装等关键工作。(这个启动流程android和linux共用)

本文将从文件定位、核心函数、执行流程三个维度,拆解这个文件的底层逻辑。

一、文件核心定位

android_bootloader.c是U-Boot中实现Android启动流程的核心模块,核心职责包括:

1.解析BCB(Bootloader Control Block)信息,决策设备启动模式(正常/Recovery/Fastboot);

2.处理AVB验证逻辑,保障系统镜像的完整性;

3.加载Android内核/Recovery镜像到指定内存地址;

4.组装内核启动参数(cmdline),传递系统启动所需的关键信息;

5.处理DTBO(Device Tree Overlay)叠加,适配不同硬件配置;

6.对接Android A/B分区机制,支持槽位切换与验证。

该文件依赖android_bootloader_message.h(BCB结构体定义)、android_avb(AVB验证)、bootm.h(内核启动)等核心头文件,是Bootloader与Android系统之间的“桥梁”。

二、核心函数拆解

按功能模块划分,文件中的核心函数可分为6大类,以下是关键函数的细节解析:

1. BCB(启动控制块)操作模块

BCB存储在misc分区,是Bootloader与Android系统交互启动指令的核心载体,相关函数负责BCB的读写与解析。

(1)android_bootloader_message_load/write

作用:从misc分区读取/写入BCB结构体(android_bootloader_message);

关键逻辑

○计算BCB所需的扇区数,检查misc分区大小是否足够;

○调用blk_dread/blk_dwrite完成分区读写;

○读写失败时打印错误日志,返回负值。

(2)android_bootloader_load_and_clear_mode

作用:解析启动模式,是整个文件的“决策中枢”;

关键逻辑

a.先检查RAM中是否有Fastboot指令(如reboot-bootloader),有则直接返回BOOTLOADER模式;

b.加载misc分区的BCB,解析command字段:

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

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

无匹配指令:默认NORMAL模式。

(3)android_bcb_write

作用:向misc分区写入启动指令(如Recovery启动命令);

关键限制:指令长度不能超过32字节,否则返回内存错误。

2. AVB验证模块

AVB是Android的镜像验证机制,保障系统镜像未被篡改,相关函数处理验证流程与镜像分发。

(1)android_slot_verify

作用:核心AVB验证函数,完成分区验证与状态更新;

关键逻辑

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

b.分配内存缓冲区,加载boot/vendor_boot/init_boot等分区;

c.调用avb_slot_verify执行哈希树验证;

d.根据验证结果更新androidboot.verifiedbootstate(green/orange/yellow/red);

e.验证失败时标记当前槽位为不可启动。

(2)avb_image_distribute_prepare/finish

作用:AVB验证前后的镜像内存管理;

○prepare:分配连续内存缓冲区,规划boot/vendor_boot/init_boot的内存布局;

○finish:将验证后的镜像分发到指定内存地址,修复v3+版本的boot.img头部。

3. 镜像加载模块

负责从指定分区加载Android镜像到内存,是内核启动的前置步骤。

(1)android_image_load_by_partname

作用:根据分区名(如boot/recovery)加载镜像到指定内存;

关键逻辑

a.通过分区名获取分区信息(起始扇区、大小);

b.调用android_image_load将镜像加载到内存,并返回加载后的地址。

(2)android_bootloader_boot_flow

作用:整合所有启动流程的“主函数”;

核心流程:启动模式检测→ AVB验证 → 镜像加载 → 命令行组装 → 内核启动。

4. 内核启动模块

负责内核启动的最终执行,包括内存分配、参数传递。

android_bootloader_boot_kernel

作用:启动Android内核;

关键逻辑

a.解析内核压缩类型(GZIP/LZ4/LZO等),计算解压所需内存;

b.分配解压内存,释放压缩镜像占用的内存;

c.组装bootm参数(内核地址、设备树地址);

d.调用do_bootm_states执行内核启动流程。

5. 命令行组装模块

内核启动参数(cmdline)的核心组装逻辑,决定系统启动的行为。

android_assemble_cmdline

作用:整合多源参数,生成最终的内核cmdline;

整合内容

a.环境变量中的bootargs基础参数;

b.A/B分区的槽位后缀(如androidboot.slot_suffix=_a);

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

d.根设备信息(root=/dev/xxx);

e.启动模式参数(如skip_initramfs/androidboot.force_normal_boot=1)。

6. DTBO叠加模块

适配不同硬件配置的设备树叠加逻辑。

android_fdt_overlay_apply

作用:加载DTBO分区,将设备树叠加层应用到主设备树;

关键逻辑

a.根据启动模式(正常/Recovery)选择DTBO分区;

b.读取DTBO头部,选择匹配的设备树条目;

c.扩容主设备树内存,应用叠加层;

d.失败时回滚主设备树备份。

三、核心执行流程(附流程图)

android_bootloader.c的整体执行流程可分为5个阶段,以下是流程拆解与可视化流程图:

1. 流程总览

Android

2. 流程分步解析

阶段1:启动模式检测(核心是BCB解析)

Bootloader启动后,首先读取misc分区的BCB结构体,同时检查RAM中是否有Fastboot遗留指令(如reboot-bootloader)。根据BCB的command字段,决策设备进入NORMAL(正常)、RECOVERY(恢复)或BOOTLOADER(Fastboot)模式。

阶段2:AVB验证(可选)

•若设备锁定且启用AVB,执行分区验证:分配连续内存缓冲区,加载boot/vendor_boot/init_boot等分区,通过AVB哈希树验证镜像完整性;

•若设备解锁,跳过严格验证,仅标记验证状态为orange(未验证);

•验证完成后,将镜像分发到内核启动所需的内存地址。

阶段3:镜像加载

根据启动模式选择对应的分区(正常模式选boot,Recovery模式选recovery/boot),调用android_image_load将镜像加载到指定内存地址。

阶段4:命令行组装

整合环境变量、A/B槽位、序列号、启动模式参数等,生成最终的内核cmdline,并更新bootargs环境变量(如添加androidboot.slot_suffix=_a、skip_initramfs等)。

阶段5:内核启动

•适配DTBO叠加层(若有),扩容主设备树并应用叠加;

•根据内核压缩类型分配解压内存,释放压缩镜像内存;

•调用do_bootm_states执行内核启动流程,完成Bootloader到Android内核的交接。

四、核心亮点与设计思路

1.灵活性适配:支持A/B分区、AVB验证、DTBO叠加等Android核心特性,兼容不同版本的Android启动逻辑;

2.容错机制:BCB读取失败时默认进入正常模式,AVB验证失败时标记槽位为不可启动,保障设备基础可用性;

3.内存高效管理:AVB验证时分配连续内存缓冲区,统一管理boot/vendor_boot/init_boot的内存布局,避免内存碎片;

4.启动模式兼容:兼顾传统Recovery分区与A/B分区的Recovery逻辑(无Recovery分区时复用boot分区)。

五、总结

android_bootloader.c是U-Boot对接Android启动逻辑的“核心枢纽”——它上承Bootloader的硬件初始化,下启Android内核的启动流程,同时兼顾了安全性(AVB)、灵活性(A/B分区)和兼容性(DTBO)。

理解这个文件的逻辑,不仅能掌握Android/linux设备的启动流程,更能为定制化Bootloader、排查启动故障(如Recovery无法进入、AVB验证失败)提供核心思路。对于Android底层开发、设备调试人员来说,这个文件是必须深入理解的核心模块。

审核编辑 黄宇

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

全部0条评论

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

×
20
完善资料,
赚取积分