Ch1:背景与基础内容介绍
1.1 背景
最近工作中使用 U-boot 进行内核引导启动调整,发现编译手册中对Uboot镜像编译流程和之前接触的不太一样,在完成U-boot编译流程后,需要单独再进行 ATF 编译。且 ATF 编译过程中需要使用 U-boot.bin产物并且给出硬件配置。此工程的最终生成产物被分成了 atf.bin 和 u-boot.bin。对此我不禁产生了疑问,新增的 ATF 编译流程是什么?实现了什么功能?以及BootLoader引导启动流程有何变化?
1.2 BootLoader简介
首先我们需要了解一下BootLoader是什么。在嵌入式系统中,通常没有BIOS那样的固件程序,因此需要实现整个系统的加载启动任务需要BootLoader来完成,它在操作系统内核运行之前运行,可以完成初始化硬件设备、建立内存空间映射、配置系统的软硬件环境的工作,为最终调用操作系统内核运行准备好运行环境。不同的处理器架构有不同的BootLoader,它不仅依赖于CPU的体系结构,也依赖于嵌入式系统板级设备配置与参数(DDR、Flash等)。
对于Bootloader可总结以下四点:
-
Bootloader是硬件启动时执行的引导程序,是运行操作系统的前提;
-
Bootloader是在操作系统内核或用户应用程序运行之前运行的一段代码;
-
在嵌入式系统中,整个系统的初始化和加载任务一般由Bootloader来完成;
-
对硬件进行相应的初始化和设定,最终为操作系统准备好环境。
需要注意的是 BootLoader 是独立于操作系统的,一般由汇编代码和C代码组成,也根据代码实现不同划分为两个阶段:
- 第一阶段使用汇编代码实现,完成一些依赖于CPU体系结构的初始化,包括硬件设备初始化、配置C语言运行环境(准备RAM空间,初始化栈等)、调用第二阶段的代码;
- 第二阶段通常使用C语言实现,可以实现较复杂的功能,主要包括初始化本阶段的硬件设备、检查系统内存映射、读取内核镜像和根文件系统到内存、为内核设置启动参数、调用内核。
U-boot (Universal Boot Loader),是一个被广泛使用的开源引导加载程序,由DENX开发,支持多种处理器架构,包括ARM、MIPS、PowerPC等,广泛使用与嵌入式Linux系统的引导。此文档只做简单介绍,核心关注ATF部分。
1.3 缩写对照
缩写 | 全称 | 意思 |
---|---|---|
TEE | Trusted Execution Environment | 可信执行环境 |
SMC | Secure Monitor Call | 安全监视器调用 |
REE | Rich Execution Environment | (非可信)富执行环境 |
CA | Client Application | 富执行环境下应用程序 |
TA | Trusted Application | 可信执行环境下应用程序 |
SMCCC | SMC Calling Convention | SMC调用约定 |
EL | Exception Level | 异常等级 |
SCTLR | system control registers | 系统控制寄存器 |
SPSR | saved programstatus register | 程序状态保存寄存器 |
CPSR | current program status register | 当前程序状态寄存器 |
Ch2:ATF介绍
TF(Trusted Firmware)是ARM在Armv8引入的安全解决方案,它的核心功能为对启动和运行过程进行特权级划分,为安全提供了整体解决方案。相较于Armv7中的Trust Zone(TZ)进行了提高,它包括启动和运行过程中的特权级划分,实现了启动过程信任链的传导,细化了运行过程的特权级区间。TF实际有两种Profile,对ARM Profile A的CPU应用TF-A,对ARM Profile M的CPU应用TF-M。我们一般接触的都是TF-A,又因为这个概念是ARM提出的,有时候也缩写做ATF(ARM Trusted Firmware)。
2.1 安全引导(安全启动)
安全引导(Secure Boot)功能是指在系统的整个启动过程中,使用链式验证电子签名的方式来验证系统中重要镜像文件的可靠性,然后再加载镜像文件的引导过程。安全引导功能可以保护二级厂商系统的独立性和完整性。
安全引导功能的原理就是采用链式验签的方式启动系统,也就是在系统启动过程中,在加载下一个阶段的镜像之前都会对需要被加载的镜像文件进行电子验签,只有验签操作通过后,该镜像才能被加载到内存中,然后系统才会跳转到下一个阶段继续执行,整个验签链中的任何一环验签失败都会导致系统挂死,系统启动过程中的第一级验签操作是由Chip ROM来完成的。
只要芯片一出厂,用户就无法修改固化在芯片中的这部分代码,因此无法通过修改第一级验签结果来关闭安全引导功能。而且验签操作使用的RSA公钥或者哈希值将会被保存在OTP/efuse中,该区域中的数据一般只有Chip ROM和TEE能够读取且无法被修改。RSA公钥或者哈希值将会在产品出厂之前被写入到OTP/efuse中,而且不同厂商使用的密钥会不一样。
安全引导可用于保证系统的完整性,防止系统中重要镜像文件被破坏或替换。一般情况下,安全引导需要保护:
- 系统的BootLoader镜像文件
- TEE镜像文件(TEE,Trusted Execution Environment,可信执行环境)
- Linux内核镜像文件
- Recover镜像文件
- 在ARMv8中使用的ATF镜像文件
将TEE镜像文件的加载操作加入安全引导功能中可阻止黑客通过替换TEE镜像文件的方式来窃取被TEE保护的重要资料。
当前使用ARM芯片的系统中大部分使能了安全引导功能,该功能对于用户的最直接感受就是,当用户非法刷入其他厂商的ROM后无法正常启动,这是因为非法刷机将导致系统中的重要镜像文件被替换,系统在启动过程中对镜像文件的电子验签失败,如果BootLoader验证失败,则系统在进入BootLoader阶段之前就会挂死。
在ARMv8架构中ARM提供了ARM可信固件(ATF)。Bootloader、Linux内核、TEE OS的启动都由ATF来加载和引导。对于ARMv8, Bootloader、Linux内核和TEE OS镜像文件的验签工作都是在ATF中完成的。
2.2 ARM Trust Zone简介
Trust Zone 是 ARM 为设备安全开发的一个硬件架构。它通过硬件隔离的方式将系统分为了两个环境——Non Secure 和 Secure ,也叫做 Normal 和 Trusted。Normal 环境中可以运行地软件比较丰富和复杂,比如 Linux,因此有时也称在 Normal 环境为 REE(Rich Execution Environment)。在 Trusted 环境中运行地软件很“小”,提供的功能也有限,通常称 Trusted 为 TEE(Trusted Execution Environment,可信执行环境)。
硬件隔离是说是使用 TrustZone 可以将设备中的外设(UART、I2C、SPI、DDR 等)分为两个部分,其中一部分可以在 Normal 环境下进行操作,另外一部分在 Trusted 的环境下进行操作。硬件隔离实现在两个方面:芯片外设隔离、内存隔离(对于DDR,需要将整个区域划分为若干安全和非安全区域。通过TZASC可实现)。示意图如下所示。
2.3 ATF简介
ATF 在CPU和内存中区隔出两个空间:Secure空间和Non-Secure空间,同时划分了EL0(Exception level 0)到EL3四个特权级;其中EL0和EL1是ATF必须实现的,EL2和EL3是可选的。实际上,没有EL2和EL3,整个模型就基本退化成了ARMv7的TZ版本。ATF带来最大的变化是信任链的建立(Trust Chain),整个启动过程包括从EL3到EL0的信任关系的打通,过程比较抽象。
根据上图可以看出划分中EL0、EL1、EL2都存在安全/非安全两种状态,EL3一直处于安全状态。由此非安全部分包括:NS.EL0、NS.EL1、NS.EL2;安全部分包括 EL3、S.EL2(ARMv8.4新增)、S.EL1、S.EL0。无论从安全切换到非安全,还是非安全切换到安全都需要经过EL3,从NS.EL1切换到S.EL1流程图如下:
- Rich OS通过SMC异常进入EL3。
- EL3中执行对应的异常处理函数,并进行SCTLR_EL3.NS位设置1->0;保存非安全寄存器状态;恢复安全寄存器状态。
- 从异常处理中退出并将CPU从EL3切换到S.EL1。
标签:ATF,引导,安全,简介,镜像文件,Part1,EL3,ARM From: https://www.cnblogs.com/silas041301/p/18679630NOTE:SMC是在Trust Zone中引入的方法,是为了在安全区和非安全进行切换时的接口。