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 - 博客园

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/68950.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解决docker: ‘buildx‘ is not a docker command.

简介 buildx 是 Docker 官方提供的一个构建工具,它可以帮助用户快速、高效地构建 Docker 镜像,并支持多种平台的构建。使用 buildx,用户可以在单个命令中构建多种架构的镜像,例如 x86 和 ARM 架构,而无需手动操作多个…

提示词工程(Prompt Engineering)

1. Prompt 是什么? Prompt:提示词,是描述 AI 需要执行的任务的自然语言文本。 如上图所示,Prompt就是用户的提问。其实我们大家都用过Prompt,比如我们使用的ChatGPT、文心一言、豆包等AI产品时的提问就是Prompt&…

【Linux】文件操作、系统IO相关操作、inode和输入输出重定向

⭐️个人主页:小羊 ⭐️所属专栏:Linux 很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~ 目录 1、理解文件1.1 狭义理解1.2 广义理解1.3 文件操作1.4 系统角度 2、系统文件IO2.1 文件相关操作2.2 文件描述符2.3 重定向 3、动静…

头像生成小程序搭建(免费分享)

如下图为小程序页面的基本效果&#xff0c;下面将介绍该小程序的功能 页面template代码如下&#xff1a; <template><view class"avatar-containner"><block v-if"!showCropper"><image class"pageback" src"../../s…

2025寒假备战蓝桥杯02---朴素二分查找升级版本的学习+分别求解左右端点

文章目录 1.朴素二分查找的升级版2.查找左端点3.查找右端点4.代码的编写 1.朴素二分查找的升级版 和之前介绍的这个二分查找相比&#xff0c;我觉得这个区别就是我们的这个二分查找需要找到的是一个区间&#xff0c;而不是这个区间里面的某一个元素的位置&#xff1b; 2.查找…

css命名规范——BEM

目录 引言 BEM是什么? 块Block 元素Element 修饰语Modifier BEM解决了哪些问题? 在流行框架的组件中使用 BEM 格式 实战 认识设计图 如何使用当前的css规范正确命名? 引言 css样式类命名难、太难了,难于上青天,这个和js变量命名还不一样。看看项目中五花八门的样…

C++AVL树(一)详解

文章目录 AVL树概念AVL树的插入平衡因子的更新旋转的规则左单旋右单旋抽象的情况h0h1h 2h 3 AVL树 概念 AVL树是一棵平衡二叉查找树&#xff0c;AVL树是空树&#xff0c;保证左右子树都是AVL树&#xff0c;AVL树要求高度差的绝对值不超过1&#xff0c;因为最好情况是1&#…

JAVA与数据结构-线性表

目录 一.线性表的概念 二.线性表的关系及分类 三.数组与顺序表 四.链表 1.静态链表(链表的的数组底层实现&#xff09; 2.循环链表 3.双向链表 五.栈 1.栈的概念 2.栈的底层实现 3.共享空间栈 4.逆波兰表达式&#xff08;后缀表达式&#xff09; 5.栈与递归 六.…

AI绘画:从灵感到杰作的奇幻之旅(3/10)

AI 绘画&#xff1a;新时代的艺术创作浪潮 在数字化时代的浪潮下&#xff0c;AI 绘画已成为艺术领域中一颗耀眼的新星&#xff0c;掀起了一场前所未有的创作革命。只需在相关工具中输入简单的文字描述&#xff0c;或者上传一张参考图片&#xff0c;就能迅速生成令人惊叹的艺术…

【C语言系列】深入理解指针(3)

深入理解指针&#xff08;3&#xff09; 一、字符指针变量二、数组指针变量2.1数组指针变量是什么&#xff1f;2.2数组指针变量怎么初始化&#xff1f; 三、二维数组传参的本质四、函数指针变量4.1函数指针变量的创建4.2函数指针变量的使用4.3两段有趣的代码4.4 typedef关键字 …

广东某海水取排水管线工程边坡自动化监测

1. 项目简介 广东廉江核电项目田螺岭厂址位于廉江市车板镇北约4km处&#xff0c;地理位置为东经10948’28.88“北纬2134’01.55”&#xff0c;东距廉江市约48km&#xff0c;东南距湛江市约 65km&#xff0c;厂址西南距离北部湾约4.5km。广东廉江核电项目一期工程海水取排水管线…

Qt基础项目篇——Qt版Word字处理软件

一、核心功能 本软件为多文档型程序&#xff0c;界面是标准的 Windows 主从窗口 拥有&#xff1a;主菜单、工具栏、文档显示区 和 状态栏。 所要实现的东西&#xff0c;均在下图了。 开发该软件&#xff0c;主要分为下面三个阶段 1&#xff09;界面设计开发 多窗口 MDI 程序…

神经网络梯度爆炸的原因及解决方案

在深度学习中&#xff0c;梯度爆炸&#xff08;gradient exploding&#xff09;是一种常见的训练问题&#xff0c;尤其是在深层神经网络中。梯度爆炸指的是在反向传播过程中&#xff0c;梯度值呈指数级增长&#xff0c;导致网络权重的大幅更新&#xff0c;从而使得网络变得不稳…

deap系统重构,再新增一个新的因子,年化39.1%,卡玛提升至2.76(附python代码)

原创内容第776篇&#xff0c;专注量化投资、个人成长与财富自由。 本周核心工作之一&#xff0c;deap因子挖掘&#xff1a; Deap牛刀小试&#xff0c;挖掘出长期年化29.2%的轮动因子 deap时间序列函数补充&#xff0c;挖掘出年化39.12%的轮动因子&#xff0c;卡玛比率2.52 …

计算机图形学:实验二 三维模型读取与控制

一、程序功能设计 通过键盘和鼠标结合实现了对三维牛模型的变换控制&#xff0c;可以灵活调整旋转的轴、方向、速度以及暂停或复位三维牛模型状态。 动画启动和暂停&#xff1a; 按键&#xff1a;鼠标左键&#xff08;启动&#xff09;&#xff0c;鼠标右键&#xff08;暂停…

最新-CentOS 7 基于1 Panel面板安装 JumpServer 堡垒机

CentOS 7 基于1 Panel面板安装 JumpServer 堡垒机 一、前言二、设备要求三、环境要求四、安装4.1 环境安装4.2 JumpServer安装4.3 访问JumpServerWeb端&#xff0c;进行登录 五、登录Web控制台 一、前言 JumpServer是广受欢迎的开源堡垒机。运维必备神器&#xff01;JumpServe…

WordPress果果对象存储插件

将网站上的图片等静态资源文件上传至七牛云对象存储&#xff0c;可以减轻服务器文件存储压力&#xff0c;提升静态文件访问速度&#xff0c;从而加速网站访问速度。 支持&#xff1a;阿里云对象存储、华为云对象存储、百度云对象存储、腾讯云对象存储、七牛云对象存储。 下载…

ChatGPT大模型极简应用开发-CH2-深入了解 GPT-4 和 ChatGPT 的 API

文章目录 2.1 基本概念2.2 OpenAI API 提供的可用模型2.3 在 OpenAI Playground 中使用 GPT模型2.4 开始使用 OpenAI Python 库2.4.1 OpenAI 访问权限和 API 密钥2.4.2 Hello World 示例程序 2.5 使用 GPT-4 和 ChatGPT2.5.1 ChatCompletion 端点的输入选项2.5.2 ChatCompletio…

war包 | Docker部署flowable-ui

文章目录 引言I war包部署flowable-ui下载war包配置Tomcat访问 flowable-uiII Docker启动flowable-ui并修改配置Docker启动flowable-ui修改配置访问Flowable UI界面。III 知识扩展加速源docker run -i -t -d 参数引言 Flowable 支持 BPMN 2.0 行业标准,同时提供了一些 Flowab…

Qt Creator 15.0.0如何更换主题和字体

1.打开Qt Creator 15.0.0 (Community)&#xff0c; 2.点击编辑栏3.点击Preferences... 4.修改主题&#xff0c;点击环境&#xff0c;修改Theme:栏 5.修改字体大小&#xff0c;点击文本编辑器&#xff0c;修改字号栏。&#xff0c;修改Theme:栏