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

人生小满胜万全 2026-01-11 阅读:3123

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

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

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

审核编辑 黄宇

  • 随机文章
  • 热门文章
  • 热评文章
热门文章
  • 西南地区持续阴雨天气 华北黄淮等地大气扩散条件逐步转差

    西南地区持续阴雨天气 华北黄淮等地大气扩散条件逐步转差
      摘要:   国内方面,昨日,全国降水整体较弱;内蒙古、东北地区等地出现大风降温天气。未来三天,青藏高原及云南、四川、贵州等地多阴雨天气,关注局地强降雨或持续降雨可能引发的次生灾害。   全球方面,昨日,欧洲东部美国东南部等地出现强降雨。未来三天,飓风“米尔顿”继续影响美国东南部等地;强冷空气影响中亚等地;欧洲大部大范围降水降温。   一、国内天气情况   1.实况   全国降水整体较弱 内蒙古东北地区等地出现大风降温天气   昨日8时至今日6时,全国降水整体较...
  • 在中超联赛赛场北京成都球迷高呼:北京加油,成都雄起

    在中超联赛赛场北京成都球迷高呼:北京加油,成都雄起
      9月14日晚,中超联赛成都蓉城对北京国安的比赛在成都凤凰山体育场举行。首都文明办工作人员到现场力促两地球迷的友好互动,引导球迷文明观赛。   开赛前,两地球迷早早来到赛场,成都球迷在赛场通道为等待入场的北京球迷拉歌拍照。一边是北京球迷激昂的歌声,一边是身穿“雄起”“成都”等字样球衣的成都球迷,画面和谐温馨。首都文明办给两地球迷代表赠送了“向北京榜样学习”宣传品,呼吁两地球迷在场上是对手,在场下是朋友。合影留念时,成都球迷高喊“北京加油”,北京球迷高喊“成都雄起”。...
  • 防风防寒!北京今天晴朗伴大风寒意十足 周末将迎小幅升温

    防风防寒!北京今天晴朗伴大风寒意十足 周末将迎小幅升温
      中国天气网讯 今天(12月27日),北京天气晴间多云,最高气温2℃,白天北风劲吹,阵风可达六至七级,风寒效应明显。本周末,北京仍以晴为主,风力不大,气温将有小幅上升。   昨天,北京晴冷在线,气温继续下跌,南郊观象台最高气温仅有2.6℃,加上风力较大,体感十分寒冷。   北京市气象台预计,今天白天晴间多云,北风三四级(阵风六七级),最高气温2℃;夜间晴间多云,北风二三级间四级,最低气温零下7℃。   明后两天,北京仍以晴为主,风力不大,最高气温将略升至5℃,最低气温...
  • 新手如何开始跑步?

    新手如何开始跑步?
    大家好,我是小贝~ 有喜欢我的分享的可以给我点个关哟~多多互动吧~🫰 跑步是最简单的运动之一。人类进化30万年,跑步是基因自带的能力。可以说天生人人都会跑,人人都可以跑。 所以,很多平时不跑步的人,想入门跑步,建议从以下4个方面开始 一、跑步一定要穿跑鞋! 10年前我跑步穿平时的休闲鞋跑了2周,跟腱受伤!因为休闲鞋没有缓震效果;对膝盖和跟腱的损害较大。 专业跑鞋鞋底有缓震设计,能减少跑步时对膝盖和脚踝的冲击力。保护膝盖和脚踝不容易受伤。 二、注意跑步频率和强度。 1、频率...
  • 大雾黄色预警:京津冀等8省市部分地区有大雾 局地强浓雾

    大雾黄色预警:京津冀等8省市部分地区有大雾 局地强浓雾
      据报道10月14日电据中央气象台网站消息,预计10月14日早晨至上午,河北中南部、北京、天津西部、山东西部、山西中东部、陕西北部、河南东北部和南部部分地区、湖北中部等地有大雾天气,其中,河北中南部、北京西部、山西中部、陕西北部、湖北中部等地的部分地区有能见度低于500米的浓雾,局地有不足200米的强浓雾。中央气象台14日6时继续发布大雾黄色预警。   此外,14日,华北中南部、黄淮中西部、汾渭平原等地大气扩散条件较差,有轻至中度霾,其中,北京南部、河北西部沿山部分地区有...