zoukankan      html  css  js  c++  java
  • 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。

    image

    相关代码

    1. 执行adbreboot-fastboot

    adb新增对命令reboot-fastboot的支持。

    system/core/adb/daemon/services.cpp

    image

    1. 设置属性sys.powerctl=fastboot

    调用reboot命令设置属性sys.powerctl=fastboot,触发init进程执行action::powerctl。

    system/core/reboot/reboot.c

    image

    init.rc1

    image

    1. 写入bootloader_message后重启

    init进程将reboot-reason写入bootloader_message后重启系统。

    system/core/init/reboot.cpp

    image

    1. 重启后进入recovery系统

    重启进入recovery系统后,recovery程序读取bootloader_message,属性sys.usb.config先后设置为none和fastboot。

    recovery_main.cpp

    image

    1. 启动fastbootd进程

    init进程在属性sys.usb.config=none时清除usb的ffs配置,sys.usb.config=fastboot时配置usb的ffs为fastboot模式,生成fastboot对应的读写endpoint设备,用于和PC端的fastboot协议数据读写。

    init.rc

    image

    image

    • 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等。

    image

    如上图所示,fastboot协议不仅可以通过usb实现,也可以通过网络的方式实现。

    flash命令执行过程

    image

    动态分区

    在super分区头部存在metadata数据结构记录system、vendor、product等分区的位置和大小,结构如下图所示。

    image

    通常将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配置

    image

    依据fstab配置创建super的逻辑分区

    image

    主要通过控制/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的线刷功能。

  • 相关阅读:
    HDU 1075 What Are You Talking About(字典树)
    HDU 1075 What Are You Talking About (stl之map映射)
    HDU 1247 Hat’s Words(字典树活用)
    字典树HihoCoder
    HDU 1277全文检索(字典树)
    HDU 3294 Girls' research(manachar模板题)
    HDU 3294 Girls' research(manachar模板题)
    HDU 4763 Theme Section(KMP灵活应用)
    Ordering Tasks UVA
    Abbott's Revenge UVA
  • 原文地址:https://www.cnblogs.com/linhaostudy/p/15067914.html
Copyright © 2011-2022 走看看