0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

jf_44130326 来源:Linux1024 作者:Linux1024 2026-01-09 10:58 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

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.流程总览

wKgZPGlgbzKAOmv4AAJ4BrBWUqk590.png

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底层开发、设备调试人员来说,这个文件是必须深入理解的核心模块。

审核编辑 黄宇

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

    关注

    12

    文章

    4035

    浏览量

    134526
  • u-boot
    +关注

    关注

    0

    文章

    140

    浏览量

    39963
  • bootloader
    +关注

    关注

    2

    文章

    245

    浏览量

    48304
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    瑞芯微RK平台Android音频 EQ/DRC调试全攻略

    ,支持全局流绑定和动态应用两种模式,配合官方调试工具可快速实现个性化音效调校。 本文基于瑞芯微官方《 Android EQ/DRC 开发指南 V1.1.0 》,结合实际开发经验,从 编译集成、音效启用、状态验证、参数调试 四个维度,手把手教你完成 RK
    的头像 发表于 04-12 10:23 1w次阅读
    瑞芯微<b class='flag-5'>RK</b><b class='flag-5'>平台</b><b class='flag-5'>Android</b>音频 EQ/DRC调试全攻略

    深度解析 | DMA-BUF适配AndroidRK特性核心Patch:高性能内存管理升级方案

    support ANDROID and RK feature,通过12个文件的深度改造与重构,为DMA-BUF机制注入了Android生态适配与R
    的头像 发表于 03-16 08:16 3026次阅读
    深度<b class='flag-5'>解析</b> | DMA-BUF适配<b class='flag-5'>Android</b>与<b class='flag-5'>RK</b>特性<b class='flag-5'>核心</b>Patch:高性能内存管理升级方案

    Binder 驱动深度解析Android IPC 的核心底层实现

    。 本文将基于 Android 15 + Linux 6.1 内核源码(kernel/drivers/android/binder.c),从核心
    的头像 发表于 03-12 08:11 521次阅读
    Binder 驱动深度<b class='flag-5'>解析</b>:<b class='flag-5'>Android</b> IPC 的<b class='flag-5'>核心</b>底层实现

    rk3576 android15平台camera编译配置都做了什么?

    文件是瑞芯微(Rockchip)Android平台下相机子系统的核心编译配置Makefile,属于Android Build System
    的头像 发表于 03-06 17:15 3173次阅读
    <b class='flag-5'>rk</b>3576 <b class='flag-5'>android</b>15<b class='flag-5'>平台</b>camera编译配置都做了什么?

    RK3576 Android15音频开发必看:alsa_route核心文件解析与修改场景

    RK Android平台开发的同学,大概率都遇到过这些音频问题:插耳机没声音、通话音量忽大忽小、新增的HDMI声卡没适配、录音增益异常… 这些问题看似五花八门,根源却大概率指向同一个核心
    的头像 发表于 02-26 08:08 396次阅读
    <b class='flag-5'>RK</b>3576 <b class='flag-5'>Android</b>15音频开发必看:alsa_route<b class='flag-5'>核心</b><b class='flag-5'>文件</b><b class='flag-5'>解析</b>与修改场景

    深入解析U-Boot image.cRK平台镜像处理核心逻辑

    在瑞芯微(RK平台的嵌入式开发中,U-Boot作为核心的启动加载程序,负责完成镜像解析、校验、加载等关键流程。而image.c正是U-Bo
    的头像 发表于 02-24 16:46 1836次阅读
    <b class='flag-5'>深入</b><b class='flag-5'>解析</b>U-Boot image.<b class='flag-5'>c</b>:<b class='flag-5'>RK</b><b class='flag-5'>平台</b>镜像处理<b class='flag-5'>核心</b>逻辑

    RK平台Android设备OTA升级教程:从原理到U盘实操

    OTA(Over-The-Air)升级是 Android 系统标准的软件更新方式,在 RK(瑞芯微)平台上,OTA 升级不仅支持本地升级(如 U 盘、SD 卡),还支持网络升级,同时提供“完整包
    的头像 发表于 02-09 16:23 2363次阅读
    <b class='flag-5'>RK</b><b class='flag-5'>平台</b><b class='flag-5'>Android</b>设备OTA升级教程:从原理到U盘实操

    RK3576平台Android HAL层故障排查:从lshal命令看透问题本质

    RK3576 作为瑞芯微主流的中高端芯片,其 HAL 层基于 HIDL ( Android 硬件接口定义语言)实现,排查这类问题的核心工具就是 lshal —— 一个能直接暴露 HIDL 服务运行状态的命令
    的头像 发表于 02-06 07:12 623次阅读
    <b class='flag-5'>RK</b>3576<b class='flag-5'>平台</b><b class='flag-5'>Android</b> HAL层故障排查:从lshal命令看透问题本质

    技术分享 | RK3568 Android11 如何实现自启动应用

    随着Android版本的不断升级,对于应用权限的管理会更加苛刻。我司IAC-RK3568-Kit开发板默认搭载Android11,相比较之前RK3288的产品安卓版本变更较大,有些客户
    的头像 发表于 02-05 17:26 696次阅读
    技术分享 | <b class='flag-5'>RK</b>3568 <b class='flag-5'>Android</b>11 如何实现自启动应用

    深入解析RK平台编译核心:build.sh的知识点、调试技巧与开发价值

    在瑞芯微(RKLinux SDK 开发中,build.sh是整个编译构建系统的“入口中枢”—— 它统一管理环境配置、命令解析、模块构建与日志输出,几乎所有芯片(如 RK3588、RV
    的头像 发表于 02-03 16:02 3477次阅读
    <b class='flag-5'>深入</b><b class='flag-5'>解析</b><b class='flag-5'>RK</b><b class='flag-5'>平台</b>编译<b class='flag-5'>核心</b>:build.sh的知识点、调试技巧与开发价值

    MTK平台LK阶段mt_boot.c配置:SELINUX_STATUS 2的作用与影响

    在 MTK(联发科)平台Bootloader(以 LK/Little Kernel 为例)中,mt_boot.c是负责 Linux 内核启动逻辑的
    的头像 发表于 02-03 15:46 979次阅读
    MTK<b class='flag-5'>平台</b>LK阶段mt_boot.<b class='flag-5'>c</b>配置:SELINUX_STATUS 2的作用与影响

    硬核进阶:RK3576 Android15 驱动与系统开发实战指南

    RK3576 探索之旅】系列文章导航及功能全景介绍(基于android14) 之前有出过系列的文章,但这是自己公司定制项目,暂时没有相关硬件,有需求可以私信我,这个系列主要还是驱动的开发,接下来
    的头像 发表于 01-26 22:29 834次阅读
    硬核进阶:<b class='flag-5'>RK</b>3576 <b class='flag-5'>Android</b>15 驱动与系统开发实战指南

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

    android_bootloader.c核心代码,带你读懂Android设备从Bootloader到内核的完整启动逻辑,以及开发者关注这些代码的
    的头像 发表于 01-22 07:06 505次阅读
    <b class='flag-5'>深入</b><b class='flag-5'>解析</b><b class='flag-5'>rk</b><b class='flag-5'>平台</b><b class='flag-5'>Android</b> <b class='flag-5'>Bootloader</b><b class='flag-5'>核心</b>代码:从启动流程到AVB验证

    如何基于开发板RK3568 Android 11强制所有应用横屏展示

    RK3568 Android 11强制所有应用横屏展示,1、打开frameworks/base/core/java/android/content/pm/parsing/component
    的头像 发表于 11-07 16:07 897次阅读
    如何基于开发板<b class='flag-5'>RK</b>3568 <b class='flag-5'>Android</b> 11强制所有应用横屏展示

    RK3576 Android 14.0 SDK开发指南(第一集)

    RK3576 Android 14.0 SDK代码编译 SDK下载到本地后大概70多个G 下载后要做个校验 解压后内核源码 kernel代码路径说明 Android14支持6.1 版本
    发表于 05-20 08:43