ATF的启动过程根据ARMv8的运行模式(AArch32/AArch64)会有所不同,但基本一致。
在AArch32中是不会去加载bl31而是将EL3或者Monitor模式的运行代码保存在bl32中执行。在AArch64中,ATF的完整启动流程如图下所示。
AArch64模式的ATF启动流程
在上述启动过程中,从一个镜像跳转到另外一个镜像文件执行的方式各不相同,以下为镜像跳转的过程和方式说明。
概要流程
- bl1跳转到bl2执行
在bl1完成了将bl2镜像文件加载到RAM中的操作、中断向量表的设定以及其他CPU相关设定后,bl1_main函数会解析出bl2镜像文件的描述信息,获取入口地址,并设定下一个阶段的cpu上下文。这些操作完成之后,调用el3_exit函数来实现bl1到bl2的跳转,进入bl2中开始执行。
- 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中去执行。
- bl31跳转到bl32执行
在bl31中会执行runtime_service_inti函数,该函数会调用注册到EL3中所有服务的初始化函数,其中有一个服务项就是TEE服务,该服务项的初始化函数会将TEEOS的初始化函数赋值给bl32_init变量,当所有服务项执行完初始化后,在bl31中会调用bl32_init执行的函数来跳转到TEE OS中并开始执行TEE
OS的启动。
- bl31跳转到bl33执行
当TEE-OS镜像启动完成后会触发一个ID为TEESMC_OPTEED_RETURN_ENTRY_DONE的安全监控模式调用,该调用是用来告知EL3 TEE OS镜像已经完成了初始化,然后将CPU的状态恢复到bl31_init的位置继续执行。
bl31通过遍历在bl2中记录的所有镜像信息的链表来找到需要执行的bl33的镜像。然后通过获取到bl33镜像的信息,设定下一个阶段的CPU上下文,退出el3后进入到bl33镜像中开始执行。
-
ARM
+关注
关注
134文章
9091浏览量
367500 -
内存
+关注
关注
8文章
3024浏览量
74034 -
镜像
+关注
关注
0文章
164浏览量
10715
发布评论请先 登录
相关推荐
评论