ATF + ARMv8 多核启动流程图

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

启动性能优化点

  1. 并行唤醒: 同时唤醒多个从核,减少串行延迟
  2. 延迟初始化: 非关键资源延后初始化
  3. 缓存预热: 提前加载共享数据到缓存
  4. 异步同步: 减少核心间的等待时间
  5. 动态拓扑: 根据系统负载动态上线核心

这个流程图清晰地展示了ATF+ARMv8多核启动的完整过程,从硬件复位到Linux SMP系统完全运行的各个阶段和交互关系。

相关推荐
闫记康1 小时前
Linux ip基础
linux·网络·tcp/ip
思麟呀2 小时前
应用层自定义协议与序列化
linux·运维·服务器·网络·c++
Lost_in_the_woods2 小时前
Java程序员的Linux之路——命令篇
linux·运维·服务器
optimistic_chen2 小时前
【Vue3入门】自定义指令与插槽详解
linux·运维·服务器·vue.js·前端框架·指令
牛奶咖啡132 小时前
基于Cobbler的系统自动化安装部署——Cobbler的安装部署实践
linux·运维·服务器·cobbler·cobbler的安装配置·cobbler环境检查问题解决·cobbler中导入系统镜像
mounter6252 小时前
深度解析 RDMA 技术的里程碑:基于 DMA-BUF 的 P2P 直接访问(GPU Direct RDMA 新姿势)
linux·运维·服务器·网络·p2p·kernel
移远通信2 小时前
Helios SDK开发指南__入门准备
arm开发
Willliam_william2 小时前
CentOS 7系统中进行时间/时区设置
linux·运维·centos
李白的天不白2 小时前
linux安装MongoDB
linux·运维·服务器
BioRunYiXue2 小时前
从现象到机制:蛋白降解调控研究的系统策略与实验设计
java·linux·运维·服务器·网络·人工智能·eclipse