Fastbootd实现原理分析
前言
fastboot是一种用于Android设备上的刷机协议,便于系统开发者快速烧录系统。随着AOSP的发展,谷歌在Android Q版本引入了super动态分区功能,实现system、vendor和product等分区大小的灵活配置,避免了系统升级带来频繁修改分区表的问题。同时引入了手机端侧fastboot模式实现super分区的擦写,之前版本的fastboot刷写功能通常实现在bootloader模式(一般由SOC厂家提供原始实现),新引入的fastboot模式实现在recovery系统中集成了fastbootd二进制程序,在recovery系统中可复用系统的usb、网络等驱动,降低了开发难度,具有更好的可移植性(目前各个厂家的bootloader方案各有不同),一定程度降低了厂家的工作量。
一、源码&编译
源码路径
手机端fastbootd源码路径:system/core/fastboot/device
Host端fastboot源码路径:system/core/fastboot
在system/core/fastboot目录下mm即可编译生成fastbootd和Host端使用的fastboot工具。
二、fastboot模式启动过程
启动流程图
adb/bootloader模式下reboot-fastboot。
相关代码
- 执行adbreboot-fastboot
adb新增对命令reboot-fastboot的支持。
system/core/adb/daemon/services.cpp
- 设置属性sys.powerctl=fastboot
调用reboot命令设置属性sys.powerctl=fastboot,触发init进程执行action::powerctl。
system/core/reboot/reboot.c
init.rc1
- 写入bootloader_message后重启
init进程将reboot-reason写入bootloader_message后重启系统。
system/core/init/reboot.cpp
- 重启后进入recovery系统
重启进入recovery系统后,recovery程序读取bootloader_message,属性sys.usb.config先后设置为none和fastboot。
recovery_main.cpp
- 启动fastbootd进程
init进程在属性sys.usb.config=none时清除usb的ffs配置,sys.usb.config=fastboot时配置usb的ffs为fastboot模式,生成fastboot对应的读写endpoint设备,用于和PC端的fastboot协议数据读写。
init.rc
-
fastboot模式下fastbootreboot recovery可切换到recovery模式(启动adb,关闭fastbootd)而不需要重启。
-
PC端fastboot从r28.0.1之后开始支持reboot-fastboot命令,adb从r28.0.2之后开始支持reboot-fastboot命令。
-
fastbootd与recovery进程的关系和update_binary与recovery进程的关系类似,前者负责flash擦写逻辑的实现,后者负责UI的实现。
三、fastboot通信过程
fastboot协议
cmd:arg1......
例如reboot、flash:boot、erase:boot、oem:unlock、getvar:product、download:size等。
如上图所示,fastboot协议不仅可以通过usb实现,也可以通过网络的方式实现。
flash命令执行过程
动态分区
在super分区头部存在metadata数据结构记录system、vendor、product等分区的位置和大小,结构如下图所示。
通常将boot、userdata、cache等称为物理分区,super分区中的system、vendor、product等称为逻辑分区。
fastbootd中支持create-logical-partition/delete-logical-partition/resize-logical-partition三个命令主动创建super分区上的逻辑分区。
fastboot delete-logical-partitionsystemfastboot create-logical-partitionsystem 1073741824
fastboot resize-logical-partition system 4294967296
fastboot flash system system.img
按照上述方式刷机成功后,重启进入Android系统,在init的first_stage阶段生成对应的dm设备并挂载:
main()->FirstStageMain() -->DoFirstStageMount()-->InitDevices()-->MountPartitions()-->CreateLogicalPartitions()-->CreateDevice()
init在first_stage阶段读取fstab配置
依据fstab配置创建super的逻辑分区
主要通过控制/dev/device-mapper,创建dm设备,加载super分区的metadata的table数据(分区的名字、偏移和大小等)传递给DeviceMapper驱动生产对应的/dev/dmX设备。具体的LinuxDeviceMapper实现机制,这里不详细介绍,请参见《DeviceMapper架构及在android上的应用》。
四、小结
目前用户空间的fastbootd作为fastboot协议中的服务端覆盖了所有fastboot原生命令,fastboot和recovery共享内核和库,基于usbgadget、block等linux驱动实现了协议通信和flash设备的读写等功能。对于OEM命令,Google也设计了对应OEMHAL(android.hardware.fastboot@1.0-service)兼容各自的私有命令,同时方便开发者在各个版本之间快速移植。基于用户空间下fastbootd的高可移植性、linux运行环境等特点,用户空间下的fastbootd可能会逐渐替代引导程序实现fastboot的方式,而引导程序只保留各自SOC的线刷功能。
原文地址:https://www.cnblogs.com/linhaostudy/p/15067914.html
- Java中isAssignableFrom()方法与instanceof()方法用法
- 与Ajax同样重要的jQuery(1)
- Java中Class类详解、用法及泛化
- python 函数编程的位置参数、默认参数、关键字参数以及函数的递归
- Java子类的父类和要实现的接口有相同的方法/函数会冲突吗
- Java关键字 Finally执行与break, continue, return等关键字的关系
- #if 和#ifdef的区别
- python高阶函数:map(f,[list]),reduce(f,[list],可选初始值),
- 深入探讨 Java 类加载器
- 斐波那契查找原理详解与实现
- 增量数据丢失的原因分析(二)(r8笔记第76天)
- pycharm 之模块与模块引用
- 判断栈的出栈顺序合法性
- Combination Sum II 组合数求和之2-Leetcode
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Django 构建模板form表单的两种方法
- 详解pandas.DataFrame.plot() 画图函数
- python中pandas库中DataFrame对行和列的操作使用方法示例
- PHP实现简易计算器功能
- DataFrame 数据合并实现(merge,join,concat)
- PHP ajax+jQuery 实现批量删除功能实例代码小结
- python对execl 处理操作代码
- Python手动或自动协程操作方法解析
- 什么是python的自省
- python Socket网络编程实现C/S模式和P2P
- keras 多任务多loss实例
- 什么是python的必选参数
- python进程与线程小结实例分析
- PHP集成环境XAMPP的安装与配置
- Python socket服务常用操作代码实例