安卓系统全流程启动

安卓系统全流程启动

组件层级关系全链路启动流程 两个维度来拆解,清晰展示 ATF、OP-TEE、LK (Little Kernel)、Linux Kernel 和安卓应用之间的协作。


一、组件层级关系与核心定位

整个系统分为 安全世界 (Secure World)非安全世界 (Normal World/REE),各组件层级如下:

世界 层级 组件 核心作用 运行特权级
安全世界 EL3 固件 ATF (TF-A) BL31 安全监控器、世界切换枢纽、PSCI 电源管理、SMC 调用处理 EL3 (最高)
TEE 操作系统 OP-TEE 可信执行环境,运行安全应用 (TA),提供密钥管理、加密运算等安全服务 Secure EL1
非安全世界 Bootloader LK (Little Kernel) 非安全世界引导程序,初始化外设、加载 Linux Kernel 与设备树 Non-secure EL2/EL1
操作系统内核 Linux Kernel 安卓系统的底层内核,负责进程调度、内存管理、硬件驱动 Non-secure EL1
安卓系统框架 Android Runtime (ART) / Zygote 安卓应用运行环境,孵化应用进程 Non-secure EL0
用户应用 安卓应用程序 最终用户交互的应用,可通过 TEE Client API 与 OP-TEE 通信 Non-secure EL0

二、完整全链路启动流程

系统上电安卓应用启动 的完整流程如下:


第一阶段:ATF 安全启动链 (BL1 → BL2 → BL31)

  • 触发:系统上电/复位,CPU 进入 EL3。
  • 步骤
    1. BL1 (ROM):固化在芯片 ROM 中,初始化片内 SRAM,从 Flash 加载并验签 BL2。
    2. BL2 (Secure EL1) :初始化 DRAM,从 Flash 加载 BL31 (ATF)BL32 (OP-TEE)BL33 (LK),并对三者进行链式验签。
    3. BL31 (EL3):初始化 EL3 环境、PSCI 服务、OP-TEE 的 SPD 分发器。

第二阶段:OP-TEE (BL32) 初始化

  • 触发:BL31 跳转到 BL32。
  • 步骤
    1. BL31 通过 opteed 分发器,配置 CPU 上下文,执行 ERETEL3 切换到 Secure EL1,跳转到 OP-TEE 入口。
    2. OP-TEE 执行自身初始化:初始化 TEE 内核、安全存储、加密引擎、预加载安全应用 (TA)。
    3. OP-TEE 初始化完成后,触发 SMC 调用 ,主动陷回 EL3,将 CPU 控制权交还给 BL31。

第三阶段:LK (Little Kernel - BL33) 启动

  • 触发:BL31 从安全世界切换到非安全世界。
  • 步骤
    1. BL31 配置非安全世界上下文(设置 SCR_EL3.NS=1,目标异常等级为 Non-secure EL2/EL1)。
    2. BL31 执行 ERET,从 EL3 退出到 Non-secure EL2/EL1 ,跳转到 LK 的入口地址。
    3. LK 初始化
      • 初始化非安全世界外设:UART、存储(eMMC)、网络、显示等。
      • 从 Flash 读取 Linux Kernel 镜像zImage/Image)和 设备树 (DTB) 到 DRAM 的预定义地址。
      • 设置内核启动参数(Command Line)。
    4. LK 跳转到 Linux Kernel 的入口地址。

第四阶段:Linux Kernel 启动

  • 触发:LK 跳转到 Kernel。
  • 步骤
    1. Kernel 自解压与初始化
      • 若为 zImage,先进行自解压。
      • 初始化 MMU、页表、内存管理、进程调度器。
      • 解析设备树 (DTB),加载并初始化硬件驱动(如存储、网络、显示驱动)。
    2. 挂载根文件系统 (RootFS)
      • 挂载 ramdisksystem 分区作为根文件系统。
    3. 启动 init 进程
      • 执行用户空间的第一个进程 /init(PID=1),负责初始化安卓用户空间。

第五阶段:安卓系统框架启动

  • 触发:Linux init 进程启动。
  • 步骤
    1. init 进程解析 rc 脚本
      • 执行 init.rcinit.<platform>.rc 脚本,启动核心守护进程(如 servicemanagervoldnetd)。
    2. 启动 Zygote 进程
      • init 启动 app_process,即 Zygote(安卓应用的孵化器)。
      • Zygote 初始化 Android Runtime (ART),预加载系统类库和资源。
    3. 启动 System Server
      • Zygote 孵化第一个应用进程 System Server,启动安卓核心服务(如 ActivityManagerService、PackageManagerService、WindowManagerService)。
    4. 启动桌面应用 (Launcher)
      • System Server 准备就绪后,发送 Intent 启动桌面应用(Launcher),显示主屏幕。

第六阶段:安卓应用程序启动与运行

  • 触发:用户点击桌面应用图标。
  • 步骤
    1. ActivityManagerService 处理 Intent
      • 桌面应用发送 Intent,System Server 中的 ActivityManagerService 接收请求。
    2. Zygote 孵化应用进程
      • ActivityManagerService 请求 Zygote 孵化一个新的应用进程。
      • Zygote fork 出子进程,初始化该应用的 ART 实例。
    3. 应用组件初始化
      • 新进程加载应用 APK,初始化 Application 类,启动主 Activity。
      • Activity 执行 onCreate()onStart()onResume(),应用界面显示在屏幕上。

运行时扩展:安卓应用与 OP-TEE 通信

当安卓应用需要安全服务(如支付、加密)时,通过以下流程与 OP-TEE 交互:

  1. 安卓应用调用 TEE Client API (如 TEEC_OpenSession())。
  2. Client API 通过 Linux 内核的 OP-TEE 驱动 触发 SMC 调用
  3. CPU 从 Non-secure EL0 陷入 EL3,BL31 的 opteed 分发器将请求路由到 OP-TEE。
  4. OP-TEE 执行对应的安全应用 (TA),完成安全运算后,结果通过 SMC 原路返回给安卓应用。

总结:关键流程节点

  1. 安全世界启动:ATF BL1 → BL2 → BL31 → OP-TEE → BL31。
  2. 非安全世界启动:BL31 → LK → Linux Kernel → init → Zygote → System Server → Launcher。
  3. 应用启动:用户点击 → Zygote 孵化 → 应用显示。
  4. 安全通信:安卓应用 → Linux 驱动 → SMC → BL31 → OP-TEE TA。

这套流程确保了从硬件信任根到用户应用的全链路安全,同时实现了安全世界与非安全世界的隔离与协作。

相关推荐
feng_you_ying_li18 分钟前
Linux之线程同步:条件变量和两种生产消费模型
linux·运维·服务器
消失的旧时光-194323 分钟前
Kotlin 协程设计思想(九):Flow 到底是什么?为什么 suspend 函数还需要 Flow?
android·kotlin·协程·协程异常
Dlrb121125 分钟前
Linux系统编程-线程与多线程模块的封装
linux·线程·互斥锁·线程同步·线程互斥
拾贰_C26 分钟前
【Ubuntu | VSCode | SSH | 远程连接 | Linux】VSCode 怎么实现ssh远程连接
linux·vscode·ubuntu
消失的旧时光-194327 分钟前
Kotlin 协程设计思想(八):suspend 到底是什么?为什么 suspend 不是开启协程?
android·kotlin·suspend·continuation
weiggle36 分钟前
第六篇:状态管理——从 mutableStateOf 到 StateFlow
android
一叶知秋dong43 分钟前
llama.cpp 启动脚本
linux·服务器·llama
plainGeekDev1 小时前
SharedPreferences → DataStore
android·java·kotlin
plainGeekDev1 小时前
Cursor 操作 → Room DAO
android·java·kotlin
桌面运维家1 小时前
校园机房vDisk IDV云桌面建设方案价格参考
linux·服务器·数据库