安卓系统全流程启动
从 组件层级关系 和 全链路启动流程 两个维度来拆解,清晰展示 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。
- 步骤 :
- BL1 (ROM):固化在芯片 ROM 中,初始化片内 SRAM,从 Flash 加载并验签 BL2。
- BL2 (Secure EL1) :初始化 DRAM,从 Flash 加载 BL31 (ATF) 、BL32 (OP-TEE) 、BL33 (LK),并对三者进行链式验签。
- BL31 (EL3):初始化 EL3 环境、PSCI 服务、OP-TEE 的 SPD 分发器。
第二阶段:OP-TEE (BL32) 初始化
- 触发:BL31 跳转到 BL32。
- 步骤 :
- BL31 通过
opteed分发器,配置 CPU 上下文,执行ERET从 EL3 切换到 Secure EL1,跳转到 OP-TEE 入口。 - OP-TEE 执行自身初始化:初始化 TEE 内核、安全存储、加密引擎、预加载安全应用 (TA)。
- OP-TEE 初始化完成后,触发 SMC 调用 ,主动陷回 EL3,将 CPU 控制权交还给 BL31。
- BL31 通过
第三阶段:LK (Little Kernel - BL33) 启动
- 触发:BL31 从安全世界切换到非安全世界。
- 步骤 :
- BL31 配置非安全世界上下文(设置
SCR_EL3.NS=1,目标异常等级为 Non-secure EL2/EL1)。 - BL31 执行
ERET,从 EL3 退出到 Non-secure EL2/EL1 ,跳转到 LK 的入口地址。 - LK 初始化 :
- 初始化非安全世界外设:UART、存储(eMMC)、网络、显示等。
- 从 Flash 读取 Linux Kernel 镜像 (
zImage/Image)和 设备树 (DTB) 到 DRAM 的预定义地址。 - 设置内核启动参数(Command Line)。
- LK 跳转到 Linux Kernel 的入口地址。
- BL31 配置非安全世界上下文(设置
第四阶段:Linux Kernel 启动
- 触发:LK 跳转到 Kernel。
- 步骤 :
- Kernel 自解压与初始化 :
- 若为
zImage,先进行自解压。 - 初始化 MMU、页表、内存管理、进程调度器。
- 解析设备树 (DTB),加载并初始化硬件驱动(如存储、网络、显示驱动)。
- 若为
- 挂载根文件系统 (RootFS) :
- 挂载
ramdisk或system分区作为根文件系统。
- 挂载
- 启动 init 进程 :
- 执行用户空间的第一个进程
/init(PID=1),负责初始化安卓用户空间。
- 执行用户空间的第一个进程
- Kernel 自解压与初始化 :
第五阶段:安卓系统框架启动
- 触发:Linux init 进程启动。
- 步骤 :
- init 进程解析 rc 脚本 :
- 执行
init.rc和init.<platform>.rc脚本,启动核心守护进程(如servicemanager、vold、netd)。
- 执行
- 启动 Zygote 进程 :
- init 启动
app_process,即 Zygote(安卓应用的孵化器)。 - Zygote 初始化 Android Runtime (ART),预加载系统类库和资源。
- init 启动
- 启动 System Server :
- Zygote 孵化第一个应用进程 System Server,启动安卓核心服务(如 ActivityManagerService、PackageManagerService、WindowManagerService)。
- 启动桌面应用 (Launcher) :
- System Server 准备就绪后,发送 Intent 启动桌面应用(Launcher),显示主屏幕。
- init 进程解析 rc 脚本 :
第六阶段:安卓应用程序启动与运行
- 触发:用户点击桌面应用图标。
- 步骤 :
- ActivityManagerService 处理 Intent :
- 桌面应用发送 Intent,System Server 中的 ActivityManagerService 接收请求。
- Zygote 孵化应用进程 :
- ActivityManagerService 请求 Zygote 孵化一个新的应用进程。
- Zygote fork 出子进程,初始化该应用的 ART 实例。
- 应用组件初始化 :
- 新进程加载应用 APK,初始化 Application 类,启动主 Activity。
- Activity 执行
onCreate()、onStart()、onResume(),应用界面显示在屏幕上。
- ActivityManagerService 处理 Intent :
运行时扩展:安卓应用与 OP-TEE 通信
当安卓应用需要安全服务(如支付、加密)时,通过以下流程与 OP-TEE 交互:
- 安卓应用调用 TEE Client API (如
TEEC_OpenSession())。 - Client API 通过 Linux 内核的 OP-TEE 驱动 触发 SMC 调用。
- CPU 从 Non-secure EL0 陷入 EL3,BL31 的
opteed分发器将请求路由到 OP-TEE。 - OP-TEE 执行对应的安全应用 (TA),完成安全运算后,结果通过 SMC 原路返回给安卓应用。
总结:关键流程节点
- 安全世界启动:ATF BL1 → BL2 → BL31 → OP-TEE → BL31。
- 非安全世界启动:BL31 → LK → Linux Kernel → init → Zygote → System Server → Launcher。
- 应用启动:用户点击 → Zygote 孵化 → 应用显示。
- 安全通信:安卓应用 → Linux 驱动 → SMC → BL31 → OP-TEE TA。
这套流程确保了从硬件信任根到用户应用的全链路安全,同时实现了安全世界与非安全世界的隔离与协作。