TF-A(Trusted Firmware-A)及其启动流程详解:以stm32MP1平台为例
0 参考资料
stm32官网 wiki
https://www.trustedfirmware.org/
https://git.trustedfirmware.org/TF-A/trusted-firmware-a.git
Trusted Firmware-A documentation
ARM Power State Coordination Interface
SMC Calling Convention (SMCCC)
Arm System Control and Management Interface
Trusted Firmware-A Firmware Design
TF-A documentation AArch64 BL31 chapter
1 什么是TF-A?
1.1 简介
TF-A全称是Trusted Firmware-A,也就是可信固件-A,-A表示针对Cortex-A内核处理器,-M表示针对Cortex-M内核处理器。TF-A最初设计用于Armv8-A内核,ST将TF-A改造以支持其发布的基于Cortex-A7内核的stm32MP1系列处理器,在常见的基于Corte-A7的imx6ull处理器上是没有TF-A这一功能的。
以下是包含TF-A功能的stm32MP1的软件框架:
1.2 功能
现如今很多设备都支持联网、在线支付、语音、视频等敏感操作,为了加强设备的安全性,提出了许多保护措施。TF-A就是保护设备启动过程,通过各种鉴权,保证各个设备启动过程中的每个阶段固件都是可信赖的,避免被修改导致信息泄露等安全问题。常见的应用场景如下:
(1)智能物联网设备:保护数据安全,防止恶意攻击。
(2)移动设备:确保操作系统和关键应用的安全启动。
(3)服务器平台:保障数据中心的数据安全和可靠性。
(4)嵌入式系统:增强对敏感信息处理的安全控制。
传统的不带TF-A功能处理器的Linux系统启动流程为:内部bootloader->uboot->kernel->rootfs,整个过程没有安全校验的过程。TF-A被用于引导链上的第一阶段引导加载程序(FSBL),可以对uboot、kernel进行校验,如果还要使用 TEE OS(Trusted Execution Environment, TEE),那么 TF-A 还要完成对TEE OS 的校验。
TF-A的代码也是开源的,遵循BSD-3-Clause许可协议。可以在https://git.trustedfirmware.org/TF-A/trusted-firmware-a.git查看源码和实现文档。
除了对设备各阶段镜像进行安全校验,TF-A还实现了多种ARM接口标准:
(1)管理处理器和系统组件的电源和性能状态(PSCI)。
(2)定义在不同安全状态之间调用安全监控器的方法(SMC)。
(3)提供跨平台的系统控制和管理服务的通讯协议(SCMI)。
2 TF-A启动流程
2.1 TF-A启动步骤
TF-A分为几个二进制文件,每个文件都有自己专属功能。
对于32位ARM处理器(AArch32),可信引导(启动)按顺序分为4个阶段:
(1)Boot loader stage 1 (BL1) application processor trusted ROM。引导加载阶段1(BL1)可信内部ROM程序。
(2)Boot loader stage 2 (BL2) trusted boot firmware。引导加载阶段2(BL2)受信任的引导固件。
(3)Boot loader stage 3-2 (BL32) trusted runtime firmware。引导加载阶段3-2(BL3)受信任的Runtime固件。
(4)Boot loader stage 3-3 (BL33) non-trusted firmware。引导加载阶段3-3(BL33)不受信任的固件。
对于64位ARM处理器(AArch64),可信引导(启动)按顺序分为5个阶段:
(1)Boot loader stage 1 (BL1) application processor trusted ROM。引导加载阶段1可信内部ROM程序。
(2)Boot loader stage 2 (BL2) trusted boot firmware。引导加载阶段2(BL2)受信任的引导固件。
(3)Boot loader stage 3-1 (BL31) EL3 runtime software。引导加载阶段3-1(BL31)信Runtime固件。
(4)Boot loader stage 3-2 (BL32) trusted runtime firmware。引导加载阶段3-2(BL32)受信任的Runtime固件。
(5)Boot loader stage 3-3 (BL33) non-trusted firmware。引导加载阶段3-3(BL33)不受信任的固件。
BL1、BL2、BL31(仅在AArch64平台上)是TF-A的一部分,BL32可以属于TF-A或启动第三方固件,如TEE OS和uboot。
由于stm32 MPU平台使用内部ROM代码作为BL1阶段代码,因此BL1阶段代码在TF-A中被删除。
BL33不属于TF-A。这是TF-A加载的第一个非安全镜像,也就是所谓的第二阶段引导程序(Second-Stage boot loader,SSBL)。对于STM32MP1平台而言,SSBL默认为uboot。
2.2 TF-A启动流程图
2.2.1 32位ARM处理器
说明:
1.固化在ROM的加载并调用BL2
2.BL2加载BL32
3.BL2加载BL33
4.BL2调用BL32
5.BL32调用BL33
2.2.2 64位ARM处理器
说明:
1.固化在ROM的加载并调用BL2
2.BL2加载BL31
3.BL2加载BL32
4.BL2加载BL33
5.BL2调用BL31
6.BL31调用BL32
7.BL31调用BL33
2.3 TF-A启动阶段操作
2.3.1 BL1
BL1是启动的第一阶段,stm32MPU使用固化在内部ROM的BL1代码(不需要再自行编写),加载到RAM中运行,负责将BL2阶段镜像加载到SYSRAM。
2.3.2 BL2
BL2是启动的第二阶段,负责加载下一阶段镜像(安全或非安全)。为了实现这一目的,BL2必须初始化所有使用到的外设:
(1)系统组件:时钟、DDR、串口、MMU…
(2)安全组件:加密外设、内存防火墙…
此外,BL2使用不同的方式来加载和验证镜像是否安全。以上工作完成后,会执行BL32(32位ARM处理器)或BL31(64位ARM处理器),最终目的是执行BL33(一般是uboot)。
2.3.3 BL31
在64位ARM处理器上,BL31是EL3Runtime软件,也称为安全监视器。它处理安全监视器调优以及其他标准服务调用,例如PSCI(Power State Control Interface,电源状态控制接口)。
说明:
EL( Exception level,异常级别),用于描述特权级别,一共有4个级别:EL0、EL1、EL2、EL3,数字越大级别越大权限越高。 4个EL 级别对应的应用场合如下:
(1)EL0:一般的应用程序。
(2)EL1: 操作系统,比如 Linux。
(3)EL2:虚拟化(Hypervisor),虚拟机管理器。
(4)EL3: 最底层的安全固件(安全监视器),比如 ARM Trusted Firmware(ARM 安全固件, ATF,也就是 TF-A)。
2.3.4 BL32
BL32提供Runtime安全服务。BL32一般为安全系统(TEE OS)固件,比如OP-TEE,TF-A 为AArch32提供了EL3的Runtime软件,这个Runtime软件就是BL32固件,sp_min就是这个Runtime软件。打开ST提供的TF-A源码可以看到该文件夹:
2.3.5 BL33
BL33就是正常模式(Normal World)下的镜像,比如uboot。
相关文章:

TF-A(Trusted Firmware-A)及其启动流程详解:以stm32MP1平台为例
0 参考资料 stm32官网 wiki https://www.trustedfirmware.org/ https://git.trustedfirmware.org/TF-A/trusted-firmware-a.git Trusted Firmware-A documentation ARM Power State Coordination Interface SMC Calling Convention (SMCCC) Arm System Control and Management…...

FL Studio 2024 发布,添加 FL Cloud 插件、AI 等功能
作为今年最受期待的音乐制作 DAW 更新之一,FL Studio 2024发布引入了新功能,同时采用了新的命名方式,从现在起将把发布年份纳入其名称中。DAW 的新增功能包括在 FL Cloud 中添加插件、AI 驱动的音乐创作工具和 FL Studio 的新效果。 FL Clou…...

webpack实战 | 医保服务平台信息查询 | 国密SM4 | SM2 | 逆向分析
请求头参数加密,请求参数encData用的是SM4加密,signData用的是SM2加密,响应数据用的是SM4解密 请求头不要也没关系,直接搜signData,都打上断点,点击分页 signData的核心代码 o.doSignature就是4d09模块…...

脉冲扩散模型
论文 Spiking Diffusion Models 主要内容是提出了“脉冲扩散模型(Spiking Diffusion Models, SDMs)”,一种基于脉冲神经网络(SNN)的生成模型,旨在解决传统人工神经网络(ANN)在图像生…...

blender分离含有多个动作的模型,并导出含有材质的fbx模型
问题背景 笔者是模型小白,需要将网络上下载的fbx模型中的动作,分离成单独的动作模型,经过3天摸爬滚打,先后使用了blender,3d max,unity,最终用blender完成,期间参考了众多网络上大佬…...

胤娲科技:AI大模型的隐秘战争——当“智能”成为双刃剑
当AI不再是单纯的助手 想象一下,你正在训练一个AI模型,希望它能成为你的得力助手,帮你解决各种复杂问题。然而,有一天,你突然发现,这个模型不仅没有如你所愿, 反而悄悄地在代码库中埋下了“炸弹…...

RK平台 GPIO序号转换软件
RK平台 GPIO序号转换软件 下载地址 https://download.csdn.net/download/ruidongren/89900151 链接: link...
UDP协议和TCP协议
UDP协议: 是一种无连接的、简单的传输层通信协议,它在IP协议(网络层)之上提供服务。 特点: 无连接:在数据传输前,发送方和接收方之间不需要建立连接,可以直接发送数据。 简单&…...

算法题总结(十三)—— 动态规划(上)
动态规划 动态规划理论基础 什么是动态规划 动态规划,英文:Dynamic Programming,简称DP,如果某一问题有很多重叠子问题,使用动态规划是最有效的。 所以动态规划中每一个状态一定是由上一个状态推导出来的ÿ…...

Leetcode - 周赛419
目录 一,3318. 计算子数组的 x-sum I 二,3319. 第 K 大的完美二叉子树的大小 三,3320. 统计能获胜的出招序列数 四,3321. 计算子数组的 x-sum II 一,3318. 计算子数组的 x-sum I 本题数据范围较小,可以…...
C# 的两个list怎么判断是否存在交集
要判断两个 List<string>(dateList 和 LocalDate)是否有交集,可以使用 LINQ(Language Integrated Query)来简化这个过程。以下三种方法来判断两个列表之间是否有交集。 方法 1: 使用 LINQ 的 Any 方法 using S…...

【Python】基础语法
1. 变量 1.1. 变量的创建 变量的定义规则: 变量只能由数字,字母,下划线构成,不能包含特殊符号数字不能作为变量开头变量名不能和 Python 的关键字重复Python 的变量是区分大小写的 除了上述的硬性规则外,还建议变量…...

scala 类的继承
继承的定义 idea实例 语法 重写 重写:在子类中重新定义父类的同名方法 idea实例 多态 多态:传入的对象不同,调用的方法的效果就不同! 原理:参数是父类类型 idea实例 构造器...

穷举vs暴搜vs深搜vs回溯vs剪枝(一)
文章目录 全排列子集找出所有子集的异或总和再求和全排列 II电话号码的字母组合 全排列 题目:全排列 思路 通过深度优先搜索的方式,不断枚举每个数在当前位置的可能性,然后回溯到上一个状态,直到枚举完所有可能性得到正确的结果 r…...
枚举的应用
1.枚举的语法特点 枚举是jdk1.5提供的一个特性 枚举是一个特殊的类,这个类的对象的数量是有限的。在定义枚举类的同时就已经确定了类对象及类对象的数量。 枚举使用enum关键字定义 class A{} enum A{} 在枚举类中的第一行,就需要提供枚举类的对象&a…...

读数据工程之道:设计和构建健壮的数据系统14源系统
1. 源系统中的数据生成 1.1. 数据工程师的工作是从源系统获取数据,对其进行处理,使其有助于为下游用例提供服务 1.2. 数据工程师的角色将在很大程度上转向理解数据源和目的地之间的相互作用 1.3. 数据工程的最基本的数据管道任务——将数据从A移动到B…...

基于SpringBoot+Vue的厨艺交流系统的设计与实现(源码+定制开发)厨艺知识与美食交流系统开发、在线厨艺分享与交流平台开发、智能厨艺交流与分享系统开发
博主介绍: ✌我是阿龙,一名专注于Java技术领域的程序员,全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师,我在计算机毕业设计开发方面积累了丰富的经验。同时,我也是掘金、华为云、阿里云、InfoQ等平台…...

STMicroelectronics 意法半导体芯片选型表
意法半导体作为全球知名的半导体厂商,其产品广泛应用于各个领域,从消费电子到工业控制,从汽车电子到通信设备,都能看到意法半导体芯片的身影。在电子硬件设计领域,芯片的选型至关重要。亿配芯城(ICgoodFind…...
TCP/IP 寻址
TCP/IP 寻址 概述 TCP/IP(传输控制协议/互联网协议)是一组用于数据网络的通信协议。它们定义了数据如何在网络上从一个设备传输到另一个设备。在TCP/IP网络中,每个设备都有一个唯一的地址,称为IP地址,用于标识网络上…...
深入探索 APKTool:Android 应用的反编译与重打包工具
文章目录 一、反编译 APK1.1 解压 APK1.2 DEX 文件转换1.3 资源解码 二、重新打包 APK2.1 资源重新编译2.2 smali 转换为 DEX2.3 打包 APK2.4 签名 APK 三、技术原理3.1 Smali/Baksmali3.1.1 DEX 文件格式3.1.2 Smali 语法3.1.2.1 指令3.1.2.2 寄存器3.1.2.3 操作码3.1.2.4 注释…...
浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)
✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...

聊聊 Pulsar:Producer 源码解析
一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台,以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中,Producer(生产者) 是连接客户端应用与消息队列的第一步。生产者…...
条件运算符
C中的三目运算符(也称条件运算符,英文:ternary operator)是一种简洁的条件选择语句,语法如下: 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true,则整个表达式的结果为“表达式1”…...
Qt Http Server模块功能及架构
Qt Http Server 是 Qt 6.0 中引入的一个新模块,它提供了一个轻量级的 HTTP 服务器实现,主要用于构建基于 HTTP 的应用程序和服务。 功能介绍: 主要功能 HTTP服务器功能: 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...
鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/
使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

Java面试专项一-准备篇
一、企业简历筛选规则 一般企业的简历筛选流程:首先由HR先筛选一部分简历后,在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如:Boss直聘(招聘方平台) 直接按照条件进行筛选 例如:…...
ip子接口配置及删除
配置永久生效的子接口,2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...
Java 二维码
Java 二维码 **技术:**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...

C# 表达式和运算符(求值顺序)
求值顺序 表达式可以由许多嵌套的子表达式构成。子表达式的求值顺序可以使表达式的最终值发生 变化。 例如,已知表达式3*52,依照子表达式的求值顺序,有两种可能的结果,如图9-3所示。 如果乘法先执行,结果是17。如果5…...

springboot 日志类切面,接口成功记录日志,失败不记录
springboot 日志类切面,接口成功记录日志,失败不记录 自定义一个注解方法 import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;/***…...