当前位置: 首页 > news >正文

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 stageExecution描述
BL1(Boot Loader Stage 1)AP Boot ROMATF的第一阶段启动程序,负责初始化硬件、加载并验证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的启动流程示意图:

在这里插入图片描述

引用于https://hackmd.io/@sysprog/rkxaDOWI3

整体流程描述如下:

  1. 上电复位,当系统上电或复位时,处理器进入EL3异常等级,从固定地址(如0x0)开始执行BL1。

  2. BL1阶段,BL1初始化硬件,如MMU、缓存等,并加载BL2到内存中。然后BL1验证BL2的完整性和authenticity,如果验证通过,就跳转到BL2继续执行。

  3. BL2阶段,BL2负责加载BL31、BL32(可选)和BL33,并验证它们的完整性和authenticity。加载完成后,BL2将控制权交给BL31。

  4. BL31阶段,BL31初始化EL3异常等级的环境,提供安全监视器功能,并根据配置加载并执行BL32(如果存在)。然后,BL31切换到非安全世界,将控制权交给BL33。

  5. BL33阶段,BL33通常是一个引导程序,如U-Boot。它初始化非安全世界的硬件环境,加载并启动操作系统内核,如Linux内核。

  6. 进入内核,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#中&#xff0c;List<T>.ForEach 方法和传统的 foreach 循环都用于遍历列表中的元素并对每个元素执行操作&#xff0c;但它们之间有一些关键的区别。 List<T>.ForEach 方法 方法签名&#xff1a;public void ForEach(Action<T> action)类型&#xff1a;…...

C语言文件操作:标准库与系统调用实践

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

代码随想录 栈与队列 test 7

347. 前 K 个高频元素 - 力扣&#xff08;LeetCode&#xff09; 首先想到哈希&#xff0c;用key来存元素&#xff0c;value来存出现次数&#xff0c;最后进行排序&#xff0c;时间复杂度约为o(nlogn)。由于只需求前k个&#xff0c;因此可以进行优化&#xff0c;利用堆来维护这…...

C语言练习(21)

有一行电文&#xff0c;已按下面规律译成密码&#xff1a; A→Za→Z B→Yb→y C→Xc→X 即第1个字母变成第26个字母&#xff0c;第2个字母变成第25个字母&#xff0c;第i个字母变成第&#xff08;26-i十1&#xff09;个字母。非字母字符不变。假如已知道密码是Umtorhs&…...

智能手机“混战”2025:谁将倒下而谁又将突围?

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

计算机图形学:实验一 OpenGL基本绘制

1.OpenGL的环境配置&#xff1a; 集成开发环境Visual Studio Community 2019的安装&#xff1a; 在Windows一栏选择使用C的桌面开发&#xff1b;再转到“单个组件”界面&#xff0c;在“编译器、生成工具和运行时”一栏选择用于“Windows的C CMake工具”&#xff1b;然后转到…...

二分查找题目:快照数组

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

深度学习|表示学习|卷积神经网络|参数共享是什么?|07

如是我闻&#xff1a; Parameter Sharing&#xff08;参数共享&#xff09;是卷积神经网络&#xff08;CNN&#xff09;的一个重要特性&#xff0c;帮助它高效地处理数据。参数共享的本质就是参数“本来也没有变过”。换句话说&#xff0c;在卷积层中&#xff0c;卷积核的参数&…...

基于相机内参推导的透视投影矩阵

基于相机内参推导透视投影矩阵&#xff08;splatam&#xff09;&#xff1a; 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&#xff08;Remote Procedure Call&#xff0c;远程过程调用&#xff09;框架&#xff0c;旨在实现不同服务之间的远程通信和调用。在分布式系统中&#xff0c;不同服务可能部署在不同的服务器上&#xff0c;D…...

03垃圾回收篇(D3_垃圾收集器的选择及相关参数)

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

一、引论,《组合数学(第4版)》卢开澄 卢华明

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

Vue3+TS 实现批量拖拽文件夹上传图片组件封装

1、html 代码&#xff1a; 代码中的表格引入了 vxe-table 插件 <Tag /> 是自己封装的说明组件 表格列表这块我使用了插槽来增加扩展性&#xff0c;可根据自己需求&#xff0c;在组件外部做调整 <template><div class"dragUpload"><el-dialo…...

二叉树的所有路径(力扣257)

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

Python OrderedDict 实现 Least Recently used(LRU)缓存

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

LabVIEW项目中的工控机与普通电脑选择

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

Ansys Speos | Speos Meshing 网格最佳实践

概述 网格划分是在各种计算应用中处理3D几何的基本步骤&#xff1a; 表面和体积&#xff1a;网格允许通过将复杂的表面和体积分解成更简单的几何元素&#xff08;如三角形、四边形、四面体或六面体&#xff09;来表示复杂的表面和体积。 模拟和渲染&#xff1a;网格是创建离散…...

elasticsearch segment数量对读写性能的影响

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

全同态加密理论、生态现状与未来展望(中2)

《全同态加密理论、生态现状与未来展望》系列由lynndell2010gmail.com和mutourend2010gmail.com整理原创发布&#xff0c;分为上中下三个系列&#xff1a; 全同态加密理论、生态现状与未来展望&#xff08;上&#xff09;&#xff1a;专注于介绍全同态加密理论知识。全同态加密…...

React 第五十五节 Router 中 useAsyncError的使用详解

前言 useAsyncError 是 React Router v6.4 引入的一个钩子&#xff0c;用于处理异步操作&#xff08;如数据加载&#xff09;中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误&#xff1a;捕获在 loader 或 action 中发生的异步错误替…...

【第二十一章 SDIO接口(SDIO)】

第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

Spring Boot面试题精选汇总

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...

爬虫基础学习day2

# 爬虫设计领域 工商&#xff1a;企查查、天眼查短视频&#xff1a;抖音、快手、西瓜 ---> 飞瓜电商&#xff1a;京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空&#xff1a;抓取所有航空公司价格 ---> 去哪儿自媒体&#xff1a;采集自媒体数据进…...

服务器--宝塔命令

一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行&#xff01; sudo su - 1. CentOS 系统&#xff1a; yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...

人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式

今天是关于AI如何在教学中增强学生的学习体验&#xff0c;我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育&#xff0c;这并非炒作&#xff0c;而是已经发生的巨大变革。教育机构和教育者不能忽视它&#xff0c;试图简单地禁止学生使…...

LOOI机器人的技术实现解析:从手势识别到边缘检测

LOOI机器人作为一款创新的AI硬件产品&#xff0c;通过将智能手机转变为具有情感交互能力的桌面机器人&#xff0c;展示了前沿AI技术与传统硬件设计的完美结合。作为AI与玩具领域的专家&#xff0c;我将全面解析LOOI的技术实现架构&#xff0c;特别是其手势识别、物体识别和环境…...

git: early EOF

macOS报错&#xff1a; Initialized empty Git repository in /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/.git/ remote: Enumerating objects: 2691797, done. remote: Counting objects: 100% (1760/1760), done. remote: Compressing objects: 100% (636/636…...

《Docker》架构

文章目录 架构模式单机架构应用数据分离架构应用服务器集群架构读写分离/主从分离架构冷热分离架构垂直分库架构微服务架构容器编排架构什么是容器&#xff0c;docker&#xff0c;镜像&#xff0c;k8s 架构模式 单机架构 单机架构其实就是应用服务器和单机服务器都部署在同一…...

【Kafka】Kafka从入门到实战:构建高吞吐量分布式消息系统

Kafka从入门到实战:构建高吞吐量分布式消息系统 一、Kafka概述 Apache Kafka是一个分布式流处理平台,最初由LinkedIn开发,后成为Apache顶级项目。它被设计用于高吞吐量、低延迟的消息处理,能够处理来自多个生产者的海量数据,并将这些数据实时传递给消费者。 Kafka核心特…...