ARM的安全启动—ATF TF-A以及它与UEFI的互动_atf runtime spmd

一、网安学习成长路线图

网安所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
在这里插入图片描述

二、网安视频合集

观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
在这里插入图片描述

三、精品网安学习书籍

当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。
在这里插入图片描述

四、网络安全源码合集+工具包

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
需要体系化学习资料的朋友,可以加我V获取:vip204888 (备注网络安全)

在这里插入图片描述

五、网络安全面试题

最后就是大家最关心的网络安全面试题板块
在这里插入图片描述在这里插入图片描述

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化资料的朋友,可以点击这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

git clone https://source.codeaurora.org/external/qoriq/qoriq-components/atf -b LX2160_UEFI_ACPI_EAR3


UEFI代码下载可以用图片上的地址。我们可以把参考资料2和这些代码对照来看,加深理解。  
 支持ATF的ARM机器,启动过程如下



![](https://img-blog.csdnimg.cn/img_convert/e3b138dc7a66ddce0a52d09d9159d129.webp?x-oss-process=image/format,png)


来源:参考资料2


注意蓝色箭头上的数字,它是启动顺序。一切起源于在EL3的BL1。


**BL1:Trusted Boot ROM**


启动最早的ROM,它可以类比Boot Guard的ACM,


[老狼:什么是Boot Guard?电脑启动中的信任链条解析269 赞同 · 44 评论文章​编辑]( )


不过它是在CPU的ROM里而不是和BIOS在一起,是一切的信任根。它的代码在这里:



![](https://img-blog.csdnimg.cn/img_convert/1e49f2906ec853d1bca5af87efd34dee.webp?x-oss-process=image/format,png)


代码很简单(略去不重要内容):



func bl1_entrypoint

bl bl1_early_platform_setup
bl bl1_plat_arch_setup

bl bl1_main

b el3_exit
endfunc bl1_entrypoint


bl1\_main()开始就是c程序了,那c运行依靠的堆和栈空间在哪里呢?在CPU内部的SRAM里。SRAM一启动就已经可以访问了,bl1\_plat\_arch\_setup()简单地在其中划分出来一块作为Trusted SRAM给c程序用,而不用像x86在cache里面扣一块出来,简单了很多。


BL1主要目的是建立Trusted SRAM、exception vector、初始化串口console等等。然后找到并验证BL2(验签CSF头),然后跳过去。


**BL2:Trusted Boot Firmware**


同样运行在EL3上的BL2和BL1一个显著的不同是它在Flash上,作为外置的一个Firmware,它的可信建立在BL1对它的验证上。它也有完整的源代码:



![](https://img-blog.csdnimg.cn/img_convert/eb2fab32ea25a809d00294448636a300.png)


它也会初始化一些关键安全硬件和软件框架。更主要的是,也是我希望大家下载NXP 2160A的分支的重要原因,BL2会初始化很多硬件,而这些硬件初始化在x86中是BIOS完成的(无论是在PEI中还是包在FSP/AGESA中),而在ARM的ATF体系中,很多种CPU是在BL2中完成的。2160A在Plat目录下提供了很多开源的硬件初始化代码,供ATF BL2框架代码调用。比较重要的是bl2\_main()



void bl2_main(void)
{

bl2_arch_setup();

/* initialize boot source /
bl2_plat_preload_setup();
/
Load the subsequent bootloader images. */
next_bl_ep_info = bl2_load_images();

bl2_run_next_image(next_bl_ep_info);
}


最重要的两步都在这个函数中完成:初始化硬件和找到BL31。


bl2\_plat\_preload\_setup()中会初始化一堆硬件,包括读取RCW初始化Serdes等,对内存初始化感兴趣的人(比如我)也可以在里面找到初始化DDR4的代码:dram\_init(),它在Plat\nxp\drivers\ddr\nxp-ddr下。比较遗憾的是DDR4 PHY的代码是个Binary,不含源码,这里对DDR4的初始化仅仅聚焦设置timing寄存器和功能寄存器,而没有内存的Training过程。


Anyway,x86带内初始化硬件的很多代码ARM ATF体系都包括在BL2中,而不在UEFI代码中,这是和x86 UEFI代码的一个显著区别。部分原因这些代码都要求是Secure的。更加糟糕的是,很多ARM平台,BL1和BL2,甚至后面的BL31都是以二进制的形式提供,让定制显得很困难。BL2能否提供足够的信息和定制化选择给固件厂商和提供足够信息给UEFI代码,考验BL2的具体设计实现。NXP在两个方面都做的不错,不但提供RCW等配置接口,还开源了大部分代码,十分方便。


BL2在初始化硬件后,开始寻找BL3的几个小兄弟:BL31,BL32和BL33。它先找到BL31,并验签它,最后转入BL31。


**BL31:EL3 Runtime Firmware**


BL31作为EL3最后的安全堡垒,它不像BL1和BL2是一次性运行的。如它的runtime名字暗示的那样,它通过SMC为Non-Secure持续提供设计安全的服务。关于SMC的调用calling convention我们今后再详细介绍,这里只需要知道它的服务主要是通过BL32。它负责找到BL32,验签,并运行BL32。


**BL32:OPTee OS + 安全app**


BL32实际上是著名的Open Portable Trusted Execution Enveiroment[[5]]( ) OS,它是由Linaro创立的。它是个很大的话题,我们今后再细聊。现在仅需要知道OPTee OS运行在 S-EL1,而其上的安全APP运行在S-EL0。OPTee OS运行完毕后,返回EL3的BL31,BL31找到BL33,验签它并运行。


**BL33: Non-Trusted Firmware**


BL33实际上就是UEFI firmware或者uboot,也有实现在这里直接放上Linux Kernel。2160A的实现是UEFI和uboot都支持。我们仅仅来看UEFI的路径。


第一次看到UEFI居然是Non-Trusted,我是有点伤心的。UEFI运行在NS\_EL2,程序的入口点在ARM package



edk2/ArmPlatformPkg/PrePi/AArch64/ModuleEntryPoint.S


做了一些简单初始化,就跳到C语言的入口点CEntryPoint( )。其中ArmPlatformInitialize()做了一些硬件初始化,调用了




|  |
| --- |
| edk2-platforms/Silicon/NXP/ |


的代码。重要的是PrimaryMain()。


PrimaryMain()有两个实例,2160A NXP选择的是PrePI的版本(edk2/ArmPlatformPkg/PrePi/MainUniCore.c),说明它跳过了SEC的部分,直接进入了PEI的后期阶段,在BL2已经干好了大部分硬件初始化的情况下,这个也是正常选择。PrePI的实例直接调用PrePiMain()(仅保留重要部分)



VOID
PrePiMain (
IN UINTN UefiMemoryBase,
IN UINTN StacksBase,
IN UINT64 StartTimeStamp
)
{

ArchInitialize ();
SerialPortInitialize ();
InitializeDebugAgent (DEBUG_AGENT_INIT_POSTMEM_SEC, NULL, NULL);
// Initialize MMU and Memory HOBs (Resource Descriptor HOBs)
Status = MemoryPeim (UefiMemoryBase, FixedPcdGet32 (PcdSystemMemoryUefiRegionSize));
BuildCpuHob (ArmGetPhysicalAddressBits (), PcdGet8 (PcdPrePiCpuIoSize));
BuildGuidDataHob (&gEfiFirmwarePerformanceGuid, &Performance, sizeof (Performance));
SetBootMode (ArmPlatformGetBootMode ());
// Initialize Platform HOBs (CpuHob and FvHob)
Status = PlatformPeim ();

Status = DecompressFirstFv ();
Status = LoadDxeCoreFromFv (NULL, 0);
}


从中我们可以看到,这里几乎就是UEFI PEI阶段DXEIPL的阶段了,后面就是直接DXE阶段。


好了,我们来梳理一下,ATF整个信任链条是逐步建立的:



![](https://img-blog.csdnimg.cn/img_convert/96ba3fac4764128717a61c7dc49dd21a.webp?x-oss-process=image/format,png)


来源:参考资料2


从作为信任根的BL1开始,一步一步验签CSF头中的签名,最后来到BL33,后面就是OS了。那BL33后面怎么就断了呢?其实后面的验签就是UEFI Secure Boot了


[老狼:趣话安全启动:迷思与启示152 赞同 · 24 评论文章​编辑]( )


### 结语


ATF的官网一张图包含了更多的信息:



![](https://img-blog.csdnimg.cn/img_convert/570e61f9e7567735c2904a7287939e2f.webp?x-oss-process=image/format,png)


如果你仅仅对ATF的UEFI启动路径感兴趣,下面这张图可能更加简单明了:



![](https://img-blog.csdnimg.cn/img_convert/2bbef7a30c054acf561c1a0a34e3614e.webp?x-oss-process=image/format,png)


NXP 2160A的开源和良好的文档,让我们可以在一个具体的平台上切片观察ATF的具体实现,建议大家仔细阅读参考资料2和下载代码来看看。



关于ATF启动这里先整个宏观的概念。


这个blog讲的很好,就不重复写了,自己写还写不到这么清晰,图页很漂亮。


原文链接:https://www.cnblogs.com/arnoldlu/p/14175126.html


## 启动正文


下图划分成不同EL,分别描述BL1、BL2、BL31、BL32、BL33启动流程,以及PSCI、SP处理流程。


### 1. 冷启动(Cold boot)流程及阶段划分


restart–冷启动  
 reset–热启动


ATF冷启动实现分为5个步骤:


* BL1 - AP Trusted ROM,一般为BootRom。
* BL2 - Trusted Boot Firmware,一般为Trusted Bootloader。
* BL31 - EL3 Runtime Firmware,一般为SML,管理SMC执行处理和中断,运行在secure monitor中。
* BL32 - Secure-EL1 Payload,一般为TEE OS Image。
* BL33 - Non-Trusted Firmware,一般为uboot、linux kernel。


ATF输出BL1、BL2、BL31,提供BL32和BL33接口。  
 (我想提供的接口就是BL32和BL33的镜像可以是指定的,atf其实是一个启动框架,这其中包含的五个步骤,每个步骤你想要的内容,可以由厂商自己定义。)


启动流程如下:


![在这里插入图片描述](https://img-blog.csdnimg.cn/e91ea23699914f9e9f3c3844bab23111.png)


#### 1.1 BL1


BL1位于ROM中,在EL3下从reset vector处开始运行。(bootrom就是芯片上电运行的(chip-rom的作用就是跳转到bootrom))


BL1做的工作主要有:


* 决定启动路径:冷启动还是热启动。
* 架构初始化:异常向量、CPU复位处理函数配置、控制寄存器设置(SCRLR\_EL3/SCR\_EL3/CPTR\_EL3/DAIF)
* 平台初始化:使能Trusted Watchdog、初始化控制台、配置硬件一致性互联、配置MMU、初始化相关存储设备。
* 固件更新处理
* BL2镜像加载和执行:
	+ BL1输出“Booting Trusted Firmware"。
	+ BL1加载BL2到SRAM;如果SRAM不够或者BL2镜像错误,输出“Failed to load BL2 firmware.”。
	+ BL1切换到Secure EL1并将执行权交给BL2.


### 1.2 BL2


BL2位于SRAM中,运行在Secure EL1主要工作有:


* 架构初始化:EL1/EL0使能浮点单元和ASMID。
* 平台初始化:控制台初始化、相关存储设备初始化、MMU、相关设备安全配置、
* SCP\_BL2:系统控制核镜像加载,单独核处理系统功耗、时钟、复位等控制。
* 加载BL31镜像:BL2将控制权交给BL1;BL1关闭MMU并关cache;BL1将控制权交给BL31。
* 加载BL32镜像:BL32运行在安全世界,BL2依赖BL31将控制权交给BL32。SPSR通过Secure-EL1 Payload Dispatcher进行初始化。
* 加载BL33镜像:BL2依赖BL31将控制权交给BL33。


### 1.3 BL31


BL31位于SRAM中,EL3模式。除了做架构初始化和平台初始化外,还做了如下工作:


* PSCI服务初始化,后续提供CPU功耗管理操作。
* BL32镜像运行初始化,处于Secure EL1模式。
* 初始化非安全EL2或EL1,跳转到BL33执行。
* 负责安全非安全世界切换。
* 进行安全服务请求的分发。


![在这里插入图片描述](https://img-blog.csdnimg.cn/469ec68209c54d179fe21b59e84866bd.png)


这两幅图真的不错,棒。


## 小结


**ATF将系统启动从最底层进行了完整的统一划分**,将secure monitor的功能放到了bl31中进行,这样当系统完全启动之后,在CA或者TEE OS中触发了smc或者是其他的中断之后,首先是遍历注册到bl31中的对应的service来判定具体的handle,**这样可以对系统所有的关键smc或者是中断操作做统一的管理和分配**。


在上述启动过程中,每个Image跳转到写一个image的方式各不相同,下面将列出启动过程中每个image跳转到下一个image的过程:


### 1. bl1跳转到bl2执行


在bl1完成了bl2 image加载到RAM中的操作,中断向量表设定以及其他CPU相关设定之后,在bl1\_main函数中解析出bl2 image的描述信息,获取入口地址,并设定下一个阶段的cpu上下文,完成之后,调用el3\_exit函数实现bl1到bl2的跳转操作,进入到bl2中执行.


### 2.bl2跳转到bl31执行


在bl2中将会加载bl31, bl32, bl33的image到对应权限的RAM中,**并将该三个image的描述信息组成一个链表保存起来**,以备bl31启动bl32和bl33使用在AACH64中,bl31位于EL3 runtime software,运行时的主要功能是管理smc指令的处理和中断的主力,运行在secure monitor状态中


**bl32一般为TEE OS image**,本章节以OP-TEE为例进行说明


**bl33为非安全image,例如uboot, linux kernel等,当前该部分为bootloader部分的image,再由bootloader来启动linux kernel.**(所以不会这么久就是为了整个bootloader吧,应该是kernel吧)


**从bl2跳转到bl31是通过带入bl31的entry point info调用smc指令触发在bl1中设定的smc异常来通过cpu将全向交给bl31并跳转到bl31中执行。**(这个handle是再bl1配置的)


### 3.bl31跳转到bl32执行


在bl31中会执**行runtime\_service\_inti操作,该函数会调用注册到EL3中所有service的init函数,** **其中有一个service就是为TEE服务,该service的init函数会将TEE OS的初始化函数赋值给bl32\_init变量**,当所有的service执行完init后,**在bl31中会调用bl32\_init执行的函数来跳转到TEE OS的执行**


### 4.bl31跳转到bl33执行


当TEE\_OS image启动完成之后会触发**一个ID为TEESMC\_OPTEED\_RETURN\_ENTRY\_DONE的smc调用来告知EL3 TEE OS image已经完成了初始化,然后将CPU的状态恢复到bl31\_init的位置继续执行。**


**bl31通过遍历在bl2中记录的image链表来找到需要执行的bl33的image。然后通过获取到bl33 image的镜像信息,设定下一个阶段的CPU上下文,退出el3然后进入到bl33 image的执行**


这一步对宏观的步骤有所认识,下一步对每个步骤的细节进行认识。





### 给大家的福利


**零基础入门**


对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。


![](https://img-blog.csdnimg.cn/img_convert/95608e9062782d28f4f04f821405d99a.png)


同时每个成长路线对应的板块都有配套的视频提供:


![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/a91b9e8100834e9291cfcf1695d8cd42.png#pic_center)

因篇幅有限,仅展示部分资料

**需要体系化学习资料的朋友,可以加我V获取:vip204888 (备注网络安全)**

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化资料的朋友,可以点击这里获取](https://bbs.csdn.net/topics/618540462)**

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

  • 8
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
# 学习对象在全民造车、造芯的大时代,在努力去解决卡脖子的时代,ASIC硬件、SOC底层软件、Linux Kernel等操作系统软件(内核/驱动)、软硬件方面的系统架构师等的岗位需求也越来越明显,社会一直都是非常缺人的,缺的是核心的那一小撮、领头的那一小撮,社会所缺的更是能够软硬件融合的那一小撮人……总之,要想在这个时代,站稳自己的脚跟,能够在大公司或行业上拥有一席之地,就必需深入学习底层技术原理,核心技术才是您的看家本领。本课程设计之初,主要针对SOC底层软件开发的者、系统开发者,或者励志成为这样的人。既适合资深/高级工程师来查缺补漏,又适合初级工程师入门。(理论上该课程和ASIC硬件电路设计无关,该课程偏软件,但事实购买该课程的做ASIC的同学已然超过了15%)适用人群1、芯片开发者(包括底层软件、或做ASIC硬件的)。不限行业,例如车、云、物联网、移动端等领域;2、汽车行业开发者(主机厂、tier1、SOC厂家、各级供应商);3、嵌入式开发者、kernel开发者、驱动、软件工程师;4、学生。既适合学生从入门到精通,也适合资深工程师查缺补漏;您的收益:1、全体系的掌握ARMv8/ARMv9的核心知识点(ARM基础、异常中断GIC、MMU/Cache、architecture...);2、掌握ARM架构、掌握SOC架构、掌握常规IP(gic、smmu、timer、AXI/ACE/CHI、TZC400...);3、快速熟悉常规系统软件(bootrom、spl、ATF、TEE、bootloader、kernel...), Secureboot安全启动...4、技术水平提升N个level, 掌握快速的学习方法;# 学习什么在ARM蓬勃发展的年代,不仅仅涉及到物联网IOT、移动领域(如手机)、汽车电子领域,现在还涉及到PC、服务器的,简直就是各行各业。ARMv8出来已经有10年了,ARMv9也2年时间了。在技术不断更新迭代的背景下,此时再去学习十五年前的ARMv7、二十年前的ARMv5/v6显然不是明智的选择。本课程主要基于当前最新的架构,ARMv8的aarch64和ARMv9,如涉及具体的ARM Core IP主要还是以最新的ARM Core IP为主,软件架构也是以当前最主流的/未来所趋势的架构来讲解。以下也给大家列举初了一个ARM产品的timeline的总结(在本课程中有着大量的这种总结),从这张图中,您是可以清晰的看到本课程拥有独具一格的风格、拥有全网最新(且唯一)的资料总结或学习路线。# 本课程大纲和规划(课程持续更新中,课程总量统计:2022/10/02  当前是 61节课, 22小时)第一章:主要是快速学习: ARM简介、指令集、寄存器总结等。第二章:本系列视频的一大亮点,系统全面地讲解了arm异常中断gic等相关的软硬件知识,本人一直在倡导“学arm安全其实就是学arm架构,学arm架构其实就是学习arm的异常和中断”,异常中断是领着你进入架构的入门,是让你变成系统软硬件架构师的必走之路。第三章:安全专题,这也是本视频最核心的东西。因为你无论买书还是看博客等,你都很难找到讲解安全的教程,这里就是有和无的区别。本人系统的整理的安全的知识,带领你快速入门。第四章:mmu专题,透过事务看本质的讲解,白话式的演讲。在所有模块中,mmu也算是相对较简单模块。相信人人听得懂,人人学得会。第五章:cache专题,一切追求实事求是,不人云亦云,一切知识点都有迹可循,推翻了网络的很多观念。在众多模块中,cache算是一个比较难的模块。了解了cache后,才能算真正了解系统的软硬件架构。第六章:虚拟化,本人不擅长,会啥就随便讲点啥。(以后学会了再来补)第七章:architecture,就是零散和零碎的系统架构知识,如exclusive、arch timer、reset、系统启动、SOC设计、AMBA/AXI/ACE、DSU、WFE/WFI这样的。第八章: 新增的ARMv9 CCA/RME安全架构专题第九章:主要放置一些直播课。# 课程收益1、知道我学习什么,我要怎么去学习,从此之后有了一个明确的学习路线。2、认识一些共同目标的人,相互讨论问题,共同进步。勤学、共学、助学。3、ARM不再神秘,SOC不在神秘,让您短期内就能cover住全局4、熟悉ARM Architecture架构知识5、熟悉SOC架构知识6、熟悉主流的系统软件框架7、熟悉各项硬件原理和机制,如异常中断、MMU、cache、TLB、VMSA、Trustzone6、深入了解当前的系统架构、软硬件架构,能够看懂这些大家,将来也能够自己设计。7、熟悉系统的启动流程、Secureboot等8、熟悉各类标准和规范9、能够进入芯片厂商干活、能够在非芯片产生成为技术担当。10、学习资料的获取方法,会看11500多页的ARM手册,会看数以百计的ARM各项参考手册。 本课程会持续更新。也希望通过本课程的学习,能够让大家的ARMv8/ARMv9开发技术能有质的飞越,能找到自己心仪的工作。在购买之前,也建议大家看一看第一章第一节的课程介绍。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值