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系统完全运行的各个阶段和交互关系。

相关推荐
飘忽不定的bug9 分钟前
ubuntu20.04交叉编译QT5.15.12(RK3562+ubuntu20.04)
linux·qt·ubuntu
库玛西18 分钟前
深入浅出Linux select网络模型:从底层位图原理到C++面向对象高级封装
linux·服务器·网络·c++·ubuntu
Tingjct20 分钟前
线程详细讲解---聚焦linux
linux·服务器·jvm
ComputerInBook35 分钟前
linux包管理工具——yum(YellowdogUpdaterModified)
linux·运维·服务器·yum·dnf
霸道流氓气质40 分钟前
通义千问 Chat 模型高级用法:Function Calling / Structured Output / 多轮对话
linux·运维·windows
实心儿儿1 小时前
Linux —— epoll(1)
linux·网络
s_w.h1 小时前
【 计网 】序列化与反序列化
linux·服务器·网络·算法·bash
祖力551 小时前
网络编程:IO多路复用(select、poll、epoll)
linux·服务器·网络
迷路爸爸1801 小时前
在 Ubuntu / Linux 上轻量安装 LaTeX:TinyTeX 使用记录
linux·运维·ubuntu
tedcloud1232 小时前
OpenLogi 怎么搭建?用 Rust 打造一个轻量的 Logitech 外设管理工具
linux·运维·服务器·开发语言·后端·rust·开源