ATF + ARMv8 多核启动流程图
多核同步与SMP初始化
从核启动流程 (CPU1-N)
主核启动流程 (CPU0)
硬件上电复位
CPU0
CPU1-N
有BL32
无BL32
Spin-table
PSCI
否
是
所有CPU核心上电复位
判断主从核
主核 Primary Core
从核 Secondary Cores
保持复位/WFI状态
BL1: Boot ROM
安全初始化
BL2: Trusted Boot
加载验证后续镜像
BL31: EL3 Runtime
初始化PSCI框架
配置从核启动参数
设置Spin-table/PSCI唤醒
检查安全世界
BL32: OPTEE安全OS
BL33: Non-Secure World
U-Boot/Linux Bootloader
Linux内核
等待唤醒事件
唤醒机制
轮询状态寄存器
接收CPU_ON SMC调用
状态=READY?
验证启动参数
跳转到入口点
BL31入口点
secondary_cold_boot
初始化CPU私有资源
配置GIC/MMU
同步点等待
进入BL33/Linux
Linux SMP初始化
CPU拓扑发现
调度器初始化
中断亲和性设置
所有核心在线
系统完全运行
详细阶段说明
阶段1: 硬件复位 (所有核心)
所有CPU核心同时上电复位
↓
硬件自动选择CPU0为主核(BSP)
↓
从核(CPU1-N)进入WFI或保持复位状态
阶段2: 主核安全启动链 (ATF流程)
BL1 (Boot ROM):
- 从芯片ROM启动
- 初始化最小安全环境
- 加载BL2到Trusted SRAM
BL2 (Trusted Boot):
- 验证BL31/BL32/BL33镜像
- 加载可信固件到内存
- 准备多核启动参数表
BL31 (EL3 Runtime):
- 初始化安全监控模式
- 设置PSCI服务框架
- 配置从核唤醒机制
阶段3: 从核唤醒机制
两种唤醒方式并行支持:
1. Spin-table (传统):
主核设置状态寄存器 → 从核轮询 → 状态就绪 → 跳转执行
2. PSCI (标准):
主核调用CPU_ON SMC → EL3处理 → 电源域上电 → 释放复位 → 执行
阶段4: 从核冷启动
公共入口点: secondary_cold_boot
↓
初始化CPU私有资源:
- 设置异常向量表
- 配置栈指针
- 初始化系统寄存器
↓
配置系统资源:
- 启用MMU/缓存
- 初始化GIC CPU接口
- 设置性能计数器
↓
同步等待:
- 内存屏障确保一致性
- 等待所有核心到达同步点
- 主核释放继续执行
阶段5: 非安全世界启动
BL33 (Non-Secure):
- U-Boot或EDK2引导程序
- 设备初始化
- 加载Linux内核
↓
Linux内核启动:
- 早期初始化
- 内存管理设置
- 设备树解析
阶段6: Linux SMP初始化
CPU拓扑发现:
- 通过ACPI/DT获取CPU信息
- 构建sched_domain层级
- 识别big.LITTLE架构
↓
调度器初始化:
- 设置CPU就绪队列
- 初始化负载均衡
- 配置CPU热插拔
↓
中断亲和性:
- 分配中断到特定核心
- 设置CPU掩码
- 启用核间中断
阶段7: 系统完全运行
所有核心在线状态:
- CPU0: 运行系统关键任务
- CPU1-N: 参与任务调度
- 动态频率调节启用
- 电源管理策略生效
关键时序点
渲染错误: Mermaid 渲染失败: Invalid date:00:00:00.0075
启动性能优化点
- 并行唤醒: 同时唤醒多个从核,减少串行延迟
- 延迟初始化: 非关键资源延后初始化
- 缓存预热: 提前加载共享数据到缓存
- 异步同步: 减少核心间的等待时间
- 动态拓扑: 根据系统负载动态上线核心
这个流程图清晰地展示了ATF+ARMv8多核启动的完整过程,从硬件复位到Linux SMP系统完全运行的各个阶段和交互关系。