Linux-arm(1)ATF启动流程
Linux-arm(1)ATF启动流量
Author:Once Day Date:2025年1月22日
漫漫长路有人对你微笑过嘛…
全系列文章可查看专栏: Linux实践记录_Once_day的博客-CSDN博客
参考文档:
- ARM Trusted Firmware分析——启动、PSCI、OP-TEE接口 Arnold Lu 博客园
- Trusted Firmware-A Documentation — Trusted Firmware-A 2.12.0 documentation
- GitHub - ARM-software/arm-trusted-firmware: Read-only mirror of Trusted Firmware-A
- Linux 核心專題: Trusted Firmware-A 及 Linux 啟動流程分析 - HackMD
文章目录
- Linux-arm(1)ATF启动流量
- 1. 概述
- 1.1 ATF-A介绍
- 1.2 ATF-A启动流程
- 1.3 BL1固件
- 1.4 BL2固件
- 1.5 BL31固件
- 2. 启动流程一览图
1. 概述
1.1 ATF-A介绍
ARM ATF-A (ARM Trusted Firmware-A)是ARM官方为ARMv8-A架构提供的一套开源、安全、可靠的参考firmware实现。它主要面向ARM64(AArch64)和ARM32(AArch32)架构,提供了全面的安全世界(Secure World)支持和丰富的功能。
ATF-A支持ARMv7-A和ARMv8-A架构系列处理器,包括Cortex-A53/57/72/73/75/76/77等。通过实现ARMv7-A和ARMv8-A架构的安全扩展,ATF-A能在EL3异常级提供可信执行环境。
上图源自于Linux 核心專題: Trusted Firmware-A 及 Linux 啟動流程分析 - HackMD
(1)安全世界支持, ATF-A固件运行在EL3(最高异常级),提供了安全世界的基础设施。它负责处理器的安全启动、各异常级之间的世界切换、中断管理等关键安全职责。ATF-A将non-secure世界和secure世界隔离,保障了系统安全。
(2)PSCI (Power State Coordination Interface), PSCI定义了一套让non-secure软件请求电源管理的标准接口。ATF-A对PSCI的主要函数如CPU_ON、CPU_OFF、SYSTEM_SUSPEND等提供了参考实现,并提供具体平台的底层支持代码。
(3)TBBR-CLIENT (Trusted Board Boot Requirements), TBBR定义了可信启动的客户端要求,旨在建立一个可信的启动链。ATF-A参考实现了Trusted Boot的各阶段,包括引导ROM、可信引导固件、non-secure引导加载器等,最终完成完整可信启动。
(4)SMC Calling Convention,SMC (Secure Monitor Call)是non-secure世界和secure世界之间通讯的机制。ATF-A规范了ARM架构下SMC调用的编号、参数传递约定、返回值格式等,统一了SM层的接口标准。
(5)SCMI (System Control and Management Interface), SCMI定义了non-secure软件和secure软件之间的系统控制和管理接口,如电源、时钟、sensor等。ATF-A实现了SCMI的message传递标准,并提供了通用的SCMI server端的参考实现。
(6)SDEI (Software Delegated Exception Interface),SDEI让EL3能将某些中断和异常处理委托给更低异常级的non-secure软件,提高了中断处理的灵活性。ATF-A实现了事件路由、事件注册等SDEI核心机制。
(7)固件更新,ATF-A对ARM PSA规范的固件更新部分作了参考实现。它定义了一套通用的固件更新架构和接口,支持安全的固件版本查询、认证、更新等。
ATF-A作为ARM官方的参考实现,在功能上非常全面,代码质量也很高,已在业界被广泛应用。主要芯片厂商都以ATF-A为基础,加入自己的定制开发,移植到各自的ARM64平台上。ATF-A极大促进了ARM生态系统中secure firmware的标准化,让安全启动和固件实现变得更加规范和可靠。
1.2 ATF-A启动流程
ARM ATF是ARM提供的一套开源的、安全的固件,用于ARM处理器的启动和安全管理。它为ARM平台提供了一个标准化的、安全可靠的启动环境。AArch64架构下启动流程主要分为以下五个阶段:
Boot Loader stage | Execution | 描述 |
---|---|---|
BL1(Boot Loader Stage 1) | AP Boot ROM | ATF的第一阶段启动程序,负责初始化硬件、加载并验证BL2 |
BL2(Boot Loader Stage 2) | Trusted Boot Firmware | 第二阶段启动程序,负责加载并验证BL31、BL32和BL33 |
BL31(EL3 Runtime Software) | EL3 Runtime Firmware | 运行在EL3异常等级,提供安全监视器功能 |
BL32(Secure-EL1 Payload) | Secure-EL1 Payload | 可选组件,运行在S-EL1异常等级,提供额外的安全服务 |
BL33(Non-trusted Firmware) | Non-trusted Firmware | 非安全世界的固件,通常是一个引导程序,如U-Boot |
下面是AArch64 CPU的启动流程示意图:
整体流程描述如下:
-
上电复位,当系统上电或复位时,处理器进入EL3异常等级,从固定地址(如0x0)开始执行BL1。
-
BL1阶段,BL1初始化硬件,如MMU、缓存等,并加载BL2到内存中。然后BL1验证BL2的完整性和authenticity,如果验证通过,就跳转到BL2继续执行。
-
BL2阶段,BL2负责加载BL31、BL32(可选)和BL33,并验证它们的完整性和authenticity。加载完成后,BL2将控制权交给BL31。
-
BL31阶段,BL31初始化EL3异常等级的环境,提供安全监视器功能,并根据配置加载并执行BL32(如果存在)。然后,BL31切换到非安全世界,将控制权交给BL33。
-
BL33阶段,BL33通常是一个引导程序,如U-Boot。它初始化非安全世界的硬件环境,加载并启动操作系统内核,如Linux内核。
-
进入内核,Linux内核接管系统控制权,完成剩余的硬件初始化,并启动系统服务和用户空间进程。
1.3 BL1固件
BL1是Trusted Firmware中的第一级引导加载程序(First Level Bootloader),负责执行最早期的系统初始化和引导工作。BL1位于ROM(Read-Only Memory)中,在EL3(Exception Level 3)下从复位向量(Reset Vector)处开始运行。
BL1的主要工作包括:
(1)决定启动路径,根据复位类型(如冷启动、热启动等)决定启动路径。这有助于优化启动流程,跳过一些不必要的初始化步骤。
(2)架构初始化,设置异常向量表,配置CPU复位处理函数,设置重要的控制寄存器,如SCRLR_EL3、SCR_EL3、CPTR_EL3、DAIF等。这些初始化为后续的固件执行做好准备。
(3)平台初始化,使能Trusted Watchdog,确保系统可靠性。初始化控制台,允许输出调试信息。配置硬件一致性互连,确保多核之间的数据一致性。配置MMU(Memory Management Unit),准备内存环境。初始化相关存储设备,为加载后续固件做准备。
(4)固件更新处理,检查是否需要进行固件更新。如果需要,执行固件更新流程。
(5)BL2镜像加载和执行,BL1输出Booting Trusted Firmware
信息。BL1将BL2镜像从非易失性存储加载到SRAM(Static Random-Access Memory)中。如果SRAM空间不足或者BL2镜像校验失败,输出Failed to load BL2 firmware.
错误信息。BL1切换到Secure EL1,将执行权交给BL2。
总的来说,BL1是Trusted Firmware引导流程中的第一个阶段,主要负责最基本的系统初始化和BL2的加载。它为后续的引导阶段(BL2、BL31、BL32、BL33)做好了准备,是整个可信引导流程的起点。
1.4 BL2固件
BL2是Trusted Firmware中的第二级引导加载程序(Second Level Bootloader),承担了更多的系统初始化任务和引导后续固件的责任。BL2位于SRAM(Static Random-Access Memory)中,运行在Secure EL1(Exception Level 1)下。
BL2的主要工作包括:
(1)架构初始化,在EL1和EL0中使能浮点单元(Floating-Point Unit),使能ASMID(Address Space Memory Identifier)。
(2)平台初始化,进一步初始化控制台,支持更丰富的调试输出。初始化相关存储设备,为加载其他固件做准备。配置MMU(Memory Management Unit),建立更完善的内存环境。对相关设备进行安全配置,确保系统安全性。
(3)加载并执行SCP_BL2(System Control Processor Firmware),SCP_BL2是一个独立的固件,用于控制系统功耗、时钟、复位等。BL2负责将SCP_BL2加载到专用的系统控制核(System Control Processor)上执行。
(4)加载BL31镜像(EL3 Runtime Firmware),BL2将控制权交还给BL1,BL1关闭MMU和Cache,为BL31的执行做准备。BL1将控制权交给BL31,由BL31继续引导流程。
(5)加载BL32镜像(Secure Payload),BL32运行在安全世界(Secure World),提供安全服务,BL2依赖BL31将控制权交给BL32。SPSR(Saved Program Status Register)通过Secure-EL1 Payload Dispatcher进行初始化,以支持BL32的执行。
(6)加载BL33镜像(Non-secure Firmware),BL33通常是一个非安全的固件,如UEFI(Unified Extensible Firmware Interface)。BL2依赖BL31将控制权交给BL33,由BL33继续引导操作系统。
可以看到,BL2在Trusted Firmware的引导流程中扮演了非常重要的角色。它不仅负责更多的系统初始化工作,还要协调和加载其他关键固件,如SCP_BL2、BL31、BL32和BL33。
1.5 BL31固件
BL31是Trusted Firmware中的EL3运行时固件(EL3 Runtime Firmware),运行在最高的异常等级EL3(Exception Level 3)下。BL31位于SRAM(Static Random-Access Memory)中,是整个Trusted Firmware的核心组件。
除了进行必要的架构和平台初始化外,BL31还承担了以下关键任务:
(1)初始化PSCI(Power State Coordination Interface)服务,PSCI是一种标准的接口,用于管理CPU的功耗状态。BL31实现了PSCI服务,供其他软件调用。通过PSCI服务,BL31可以控制CPU的上电、下电、休眠等操作。
(2)初始化并执行BL32镜像(Secure Payload),BL32运行在Secure EL1模式下,提供安全服务。BL31负责初始化BL32的执行环境,并将控制权交给BL32。BL32可以是OP-TEE(Open Portable Trusted Execution Environment)等安全操作系统。
(3)初始化非安全世界(Non-secure World)的执行环境,根据配置,BL31可以初始化非安全世界的EL2或EL1。初始化完成后,BL31将控制权交给BL33(如UEFI),由BL33继续引导非安全操作系统。
(4)负责安全世界和非安全世界之间的切换,在Arm架构中,EL3是安全世界和非安全世界的切换门户。BL31实现了世界切换的机制,确保两个世界之间的安全隔离。当非安全世界需要访问安全服务时,会通过SMC(Secure Monitor Call)指令触发世界切换。
(5)分发和处理安全服务请求,非安全世界通过SMC指令请求安全服务。BL31接收并分发这些请求,调用相应的安全服务处理函数。安全服务可以包括PSCI服务、Trusted OS服务、固件更新服务等。
可以看到,BL31是Trusted Firmware的核心,承担了大量的关键职责。它不仅要初始化和管理安全世界的执行环境,还要作为安全世界和非安全世界之间的桥梁和守卫者。
BL31需要提供各种标准化的服务接口,如PSCI,以便其他软件可以方便地使用这些服务。同时,BL31还要保证世界切换的安全性,严格控制非安全世界对安全资源的访问。
2. 启动流程一览图
上图源自于ARM Trusted Firmware分析——启动、PSCI、OP-TEE接口 - ArnoldLu - 博客园
相关文章:

Linux-arm(1)ATF启动流程
Linux-arm(1)ATF启动流量 Author:Once Day Date:2025年1月22日 漫漫长路有人对你微笑过嘛… 全系列文章可查看专栏: Linux实践记录_Once_day的博客-CSDN博客 参考文档: ARM Trusted Firmware分析——启动、PSCI、OP-TEE接口 Arnold Lu 博…...

C#编程:List.ForEach与foreach循环的深度对比
在C#中,List<T>.ForEach 方法和传统的 foreach 循环都用于遍历列表中的元素并对每个元素执行操作,但它们之间有一些关键的区别。 List<T>.ForEach 方法 方法签名:public void ForEach(Action<T> action)类型:…...

C语言文件操作:标准库与系统调用实践
目录 1、C语言标准库文件操作 1.1.题目要求: 1.2.函数讲解: fopen 函数原型 参数 常用的打开模式 返回值 fwrite函数 函数原型 参数 返回值 注意事项 fseek函数 函数原型 参数 返回值 fread函数 函数原型 参数 返回值 fclose 函数…...

代码随想录 栈与队列 test 7
347. 前 K 个高频元素 - 力扣(LeetCode) 首先想到哈希,用key来存元素,value来存出现次数,最后进行排序,时间复杂度约为o(nlogn)。由于只需求前k个,因此可以进行优化,利用堆来维护这…...

C语言练习(21)
有一行电文,已按下面规律译成密码: A→Za→Z B→Yb→y C→Xc→X 即第1个字母变成第26个字母,第2个字母变成第25个字母,第i个字母变成第(26-i十1)个字母。非字母字符不变。假如已知道密码是Umtorhs&…...

智能手机“混战”2025:谁将倒下而谁又将突围?
【潮汐商业评论原创】 “去年做手机比较艰难,几乎每个品牌都在调价、压货,像华为这种以前都不给我们分货的厂商,也开始成为我的主要库存。不过今年开头比较好,20号国补一开始,店里的人流和手机销量就明显涨了不少&…...

计算机图形学:实验一 OpenGL基本绘制
1.OpenGL的环境配置: 集成开发环境Visual Studio Community 2019的安装: 在Windows一栏选择使用C的桌面开发;再转到“单个组件”界面,在“编译器、生成工具和运行时”一栏选择用于“Windows的C CMake工具”;然后转到…...

二分查找题目:快照数组
文章目录 题目标题和出处难度题目描述要求示例数据范围 解法思路和算法代码复杂度分析 题目 标题和出处 标题:快照数组 出处:1146. 快照数组 难度 7 级 题目描述 要求 实现支持下列接口的快照数组: SnapshotArray(int length) \textt…...

深度学习|表示学习|卷积神经网络|参数共享是什么?|07
如是我闻: Parameter Sharing(参数共享)是卷积神经网络(CNN)的一个重要特性,帮助它高效地处理数据。参数共享的本质就是参数“本来也没有变过”。换句话说,在卷积层中,卷积核的参数&…...

基于相机内参推导的透视投影矩阵
基于相机内参推导透视投影矩阵(splatam): M c a m [ 2 ⋅ f x w 0.0 ( w − 2 ⋅ c x ) w 0.0 0.0 2 ⋅ f y h ( h − 2 ⋅ c y ) h 0.0 0 0 f a r n e a r n e a r − f a r 2 f a r ⋅ n e a r n e a r − f a r 0.0 0.0 − 1.0 0.0 ] M_…...

浅析Dubbo 原理:架构、通信与调用流程
一、Dubbo 简介 Dubbo 是阿里巴巴开源的高性能、轻量级的 Java RPC(Remote Procedure Call,远程过程调用)框架,旨在实现不同服务之间的远程通信和调用。在分布式系统中,不同服务可能部署在不同的服务器上,D…...

03垃圾回收篇(D3_垃圾收集器的选择及相关参数)
目录 学习前言 一、收集器的选择 二、GC日志参数 三、垃圾收集相关的常用参数 四、内存分配与回收策略 1. 对象优先在Eden分配 2. 大对象直接进入老年代 3. 长期存活的对象将进入老年代 4. 动态对象年龄判定 5. 空间分配担保 学习前言 本章主要学习垃圾收集器的选择及…...

一、引论,《组合数学(第4版)》卢开澄 卢华明
零、前言 发现自己数数题做的很烂,重新学一遍组合数学吧。 参考卢开澄 卢华明 编著的《组合数学(第4版)》,只打算学前四章。 通过几个经典问题来了解组合数学所研究的内容。 一、幻方问题 据说大禹治水之前,河里冒出来一只乌龟,…...

Vue3+TS 实现批量拖拽文件夹上传图片组件封装
1、html 代码: 代码中的表格引入了 vxe-table 插件 <Tag /> 是自己封装的说明组件 表格列表这块我使用了插槽来增加扩展性,可根据自己需求,在组件外部做调整 <template><div class"dragUpload"><el-dialo…...

二叉树的所有路径(力扣257)
因为题目要求路径是从上到下的,所以最好采用前序遍历。这样可以保证按从上到下的顺序将节点的值存入一个路径数组中。另外,此题还有一个难点就是如何求得所有路径。为了解决这个问题,我们需要用到回溯。回溯和递归不分家,每递归一…...

Python OrderedDict 实现 Least Recently used(LRU)缓存
OrderedDict 实现 Least Recently used(LRU)缓存 引言正文 引言 LRU 缓存是一种缓存替换策略,当缓存空间不足时,会移除最久未使用的数据以腾出空间存放新的数据。LRU 缓存的特点: 有限容量:缓存拥有固定的…...

LabVIEW项目中的工控机与普通电脑选择
工控机(Industrial PC)与普通电脑在硬件设计、性能要求、稳定性、环境适应性等方面存在显著差异。了解这些区别对于在LabVIEW项目中选择合适的硬件至关重要。下面将详细分析这两种设备的主要差异,并为LabVIEW项目中的选择提供指导。 硬件设…...

Ansys Speos | Speos Meshing 网格最佳实践
概述 网格划分是在各种计算应用中处理3D几何的基本步骤: 表面和体积:网格允许通过将复杂的表面和体积分解成更简单的几何元素(如三角形、四边形、四面体或六面体)来表示复杂的表面和体积。 模拟和渲染:网格是创建离散…...

elasticsearch segment数量对读写性能的影响
index.merge.policy.segments_per_tier 是一个配置选项,用于控制 Elasticsearch 中段(segment)合并策略的行为。它定义了在每一层的段合并过程中,允许存在的最大段数量。调整这个参数可以优化索引性能和资源使用。 假设你有一个索…...

全同态加密理论、生态现状与未来展望(中2)
《全同态加密理论、生态现状与未来展望》系列由lynndell2010gmail.com和mutourend2010gmail.com整理原创发布,分为上中下三个系列: 全同态加密理论、生态现状与未来展望(上):专注于介绍全同态加密理论知识。全同态加密…...

鸿蒙UI(ArkUI-方舟UI框架)-开发布局
返回主章节 → 鸿蒙UI(ArkUI-方舟UI框架) 开发布局 1、布局概述 1)布局结构 2)布局元素组成 3)如何选择布局 声明式UI提供了以下10种常见布局,开发者可根据实际应用场景选择合适的布局进行页面开发。 …...

RPC是什么?和HTTP区别?
RPC 是什么?HTTP 是什么? 作为一个程序员,假设我们需要从A电脑的进程发送一段数据到B电脑的进程,我们一般会在代码中使用 Socket 进行编程。 此时,可选性一般就是 TCP 和 UDP 二选一,由于 TCP 可靠、UDP 不…...

Linux C\C++编程-建立文件和内存映射
【图书推荐】《Linux C与C一线开发实践(第2版)》_linux c与c一线开发实践pdf-CSDN博客 《Linux C与C一线开发实践(第2版)(Linux技术丛书)》(朱文伟,李建英)【摘要 书评 试读】- 京东图书 Linu…...

行政纠错——pycorrector学习
pycorrector是一个开源中文文本纠错工具,它支持对中文文本进行音似、形似和语法错误的纠正。此工具是使用Python3进行开发的,并整合了Kenlm、ConvSeq2Seq、BERT、MacBERT、ELECTRA、ERNIE、Transformer等多种模型来实现文本纠错功能。pycorrector官方仓库…...

Go的defer原理
Go 的 defer 原理 defer 是 Go 语言中的一个关键字,用于延迟执行一个函数调用。它通常用于处理资源释放、连接关闭等操作,确保这些操作在函数返回之前执行。 1. 什么是 defer? defer 关键字用于延迟执行一个函数调用,直到包含它…...

Windows 下本地 Docker RAGFlow 部署指南
Windows 下本地 Docker RAGFlow 部署指南 环境要求部署步骤1. 克隆代码仓库2. 配置 Docker 镜像加速(可选)3. 修改端口配置(可选)4. 启动服务5. 验证服务状态6. 访问服务7. 登录系统8. 配置模型8.1 使用 Ollama 本地模型8.2 使用在线 API 服务9. 开始使用10. 常见问题处理端…...

专题三_穷举vs暴搜vs深搜vs回溯vs剪枝_全排列
dfs解决 全排列&子集 1.全排列 link:46. 全排列 - 力扣(LeetCode) 全局变量回溯 code class Solution { public:vector<vector<int>> ans;vector<int> cur;vector<bool> used;vector<vector<int>> permute…...

【IEEE Fellow 主讲报告| EI检索稳定】第五届机器学习与智能系统工程国际学术会议(MLISE 2025)
重要信息 会议时间地点:2025年6月13-15日 中国深圳 会议官网:http://mlise.org EI Compendex/Scopus稳定检索 会议简介 第五届机器学习与智能系统工程国际学术会议将于6月13-15日在中国深圳隆重召开。本次会议旨在搭建一个顶尖的学术交流平台…...

华为E9000刀箱服务器监控指标解读
美信监控易内置了数千种常见设备监测器,能够监测超过20万项指标。这些指标涵盖了从硬件设备到软件系统,从网络性能到安全状态等各个方面。如下基于美信监控易——IT基础监控模块,对华为E9000刀箱服务器部分监控指标进行解读。 一、华为E9000…...

【LC】2544. 交替数字和
题目描述: 给你一个正整数 n 。n 中的每一位数字都会按下述规则分配一个符号: 最高有效位 上的数字分配到 正 号。剩余每位上数字的符号都与其相邻数字相反。 返回所有数字及其对应符号的和。 示例 1: 输入:n 521 输出&…...