ATF的启动过程介绍

描述

ATF的启动过程根据ARMv8的运行模式(AArch32/AArch64)会有所不同,但基本一致。

在AArch32中是不会去加载bl31而是将EL3或者Monitor模式的运行代码保存在bl32中执行。在AArch64中,ATF的完整启动流程如图下所示。

内存AArch64模式的ATF启动流程

在上述启动过程中,从一个镜像跳转到另外一个镜像文件执行的方式各不相同,以下为镜像跳转的过程和方式说明。

概要流程

  1. bl1跳转到bl2执行

在bl1完成了将bl2镜像文件加载到RAM中的操作、中断向量表的设定以及其他CPU相关设定后,bl1_main函数会解析出bl2镜像文件的描述信息,获取入口地址,并设定下一个阶段的cpu上下文。这些操作完成之后,调用el3_exit函数来实现bl1到bl2的跳转,进入bl2中开始执行。

  1. bl2跳转到bl31执行

在bl2中将会加载bl31、bl32、bl33的镜像文件到对应权限的内存中,并将该三个镜像文件的描述信息组成一个链表保存起来,以备bl31启动bl32和bl33使用。在AArch64中,bl31为EL3的执行软件,其运行时的主要功能是对安全监控模式调用(smc)指令和中断处理,运行在ARM的Monitor模式中。

bl32一般为TEE OS镜像文件,本章以OP-TEE为例进行说明。

bl33为正常世界状态的镜像文件,例如uboot、EKD2等。当前该部分为BootLoader部分的镜像文件,再由BootLoader来启动Linux内核镜像。

从bl2跳转到bl31是通过带入bl31的入口点信息作为参数,然后调用安全监控模式调用指令,触发在bl1中设定的安全监控模式调用请求,该请求处理完成后会将中央处理器的执行权限交给bl31,并跳转到bl31中去执行。

  1. bl31跳转到bl32执行

在bl31中会执行runtime_service_inti函数,该函数会调用注册到EL3中所有服务的初始化函数,其中有一个服务项就是TEE服务,该服务项的初始化函数会将TEEOS的初始化函数赋值给bl32_init变量,当所有服务项执行完初始化后,在bl31中会调用bl32_init执行的函数来跳转到TEE OS中并开始执行TEE
OS的启动。

  1. bl31跳转到bl33执行

当TEE-OS镜像启动完成后会触发一个ID为TEESMC_OPTEED_RETURN_ENTRY_DONE的安全监控模式调用,该调用是用来告知EL3 TEE OS镜像已经完成了初始化,然后将CPU的状态恢复到bl31_init的位置继续执行。

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

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分