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 注释…...
网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...
简易版抽奖活动的设计技术方案
1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...
k8s从入门到放弃之Ingress七层负载
k8s从入门到放弃之Ingress七层负载 在Kubernetes(简称K8s)中,Ingress是一个API对象,它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress,你可…...
【大模型RAG】Docker 一键部署 Milvus 完整攻略
本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装;只需暴露 19530(gRPC)与 9091(HTTP/WebUI)两个端口,即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...
postgresql|数据库|只读用户的创建和删除(备忘)
CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...
P3 QT项目----记事本(3.8)
3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...
css的定位(position)详解:相对定位 绝对定位 固定定位
在 CSS 中,元素的定位通过 position 属性控制,共有 5 种定位模式:static(静态定位)、relative(相对定位)、absolute(绝对定位)、fixed(固定定位)和…...
【决胜公务员考试】求职OMG——见面课测验1
2025最新版!!!6.8截至答题,大家注意呀! 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:( B ) A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...
【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)
🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...
Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理
引言 Bitmap(位图)是Android应用内存占用的“头号杀手”。一张1080P(1920x1080)的图片以ARGB_8888格式加载时,内存占用高达8MB(192010804字节)。据统计,超过60%的应用OOM崩溃与Bitm…...
