ATF启动(六):bl32(OP-TEE)-->bl33 ATF ending
前言
前面BL31里面函数 bl31_main
void bl31_main(void)
{NOTICE("BL31: %s\n", version_string);NOTICE("BL31: %s\n", build_message);/* Perform platform setup in BL31 */bl31_platform_setup(); //初始化相关驱动,时钟等/* Initialise helper libraries */bl31_lib_init(); //用于执行bl31软件中相关全局变量的初始化/* Initialize the runtime services e.g. psci. */INFO("BL31: Initializing runtime services\n");runtime_svc_init(); //初始化el3中的service,通过在编译时指定特定的section来确定哪些service会被作为el3 service/** All the cold boot actions on the primary cpu are done. We now need to* decide which is the next image (BL32 or BL33) and how to execute it.* If the SPD runtime service is present, it would want to pass control* to BL32 first in S-EL1. In that case, SPD would have registered a* function to intialize bl32 where it takes responsibility of entering* S-EL1 and returning control back to bl31_main. Once this is done we* can prepare entry into BL33 as normal.*//** If SPD had registerd an init hook, invoke it.*/
/* 如果注册了TEE OS支持,在调用完成run_service_init之后会使用TEE OS的入口函数初始化bl32_init变量,然后执行对应的Init函数,以OP-TEE为例,bl32_init将会被初始化成opteed_init,到此将会执行 opteed_init函数来进入OP-TEE OS的Image,当OP-TEE image OS执行完了image后,将会产生一个TEESMC_OPTEED_RETURN_ENTRY_DONE的smc返回bl31,此时表明已经完成了OP-TEE的初始化*/if (bl32_init) {INFO("BL31: Initializing BL32\n");(*bl32_init)();}/** We are ready to enter the next EL. Prepare entry into the image* corresponding to the desired security state after the next ERET.*/bl31_prepare_next_image_entry(); //准备跳转到bl33,在执行runtime_service的时候会存在一个spd service,该在service的init函数中将会去执行bl32的image完成TEE OS初始化console_flush();/** Perform any platform specific runtime setup prior to cold boot exit* from BL31*/bl31_plat_runtime_setup();
}
在bl31中的runtime_svc_init函数会初始化OP-TEE对应的service,通过调用该service的init函数来完成OP-TEE的启动。
前面也知道了怎么注册服务,下面来看看optee的setuo函数。(optee是一个安全os,这里可以更换为业界其他的安全os)
1. opteed_setup
OP-TEE的service通过DECLARE_RT_SVC宏在编译的时候被存放到了rt_svc_des段中。
启动该段中的init成员会被初始化成opteed_setup函数(ini转换成执行opteed_setup函数),该函数的内容如下:
int32_t opteed_setup(void)
{entry_point_info_t *optee_ep_info;uint32_t linear_id;linear_id = plat_my_core_pos();/** Get information about the Secure Payload (BL32) image. Its* absence is a critical failure. TODO: Add support to* conditionally include the SPD service*/
/* 获取bl32(OP-TEE)镜像的描述信息 */optee_ep_info = bl31_plat_get_next_image_ep_info(SECURE);if (!optee_ep_info) {WARN("No OPTEE provided by BL2 boot loader, Booting device"" without OPTEE initialization. SMC`s destined for OPTEE"" will return SMC_UNK\n");return 1;}/** If there's no valid entry point for SP, we return a non-zero value* signalling failure initializing the service. We bail out without* registering any handlers*/if (!optee_ep_info->pc)return 1;/** We could inspect the SP image and determine it's execution* state i.e whether AArch32 or AArch64. Assuming it's AArch32* for the time being.*/opteed_rw = OPTEE_AARCH64;
/* 初始化CPU的smc上下文 */opteed_init_optee_ep_state(optee_ep_info,opteed_rw,optee_ep_info->pc,&opteed_sp_context[linear_id]);/** All OPTEED initialization done. Now register our init function with* BL31 for deferred invocation*/
/* 使用Opteed_init初始化bl32_init变量,以备在bl31中调用 */bl31_register_bl32_init(&opteed_init);return 0;
}
2. opteed_init
该函数将会在bl31中的所有service执行完init操作之后,通过执行存放在bl32_init变量中的函数指针来实现调用。该函数调用之后会进入到OP-TEE OS的初始化阶段。
static int32_t opteed_init(void)
{uint32_t linear_id = plat_my_core_pos();optee_context_t *optee_ctx = &opteed_sp_context[linear_id];entry_point_info_t *optee_entry_point;uint64_t rc;/** Get information about the OPTEE (BL32) image. Its* absence is a critical failure.*/
/* 获取OPTEE image的信息 */optee_entry_point = bl31_plat_get_next_image_ep_info(SECURE);assert(optee_entry_point);/* 使用optee image的entry point信息初始化cpu的上下文 */cm_init_my_context(optee_entry_point);/** Arrange for an entry into OPTEE. It will be returned via* OPTEE_ENTRY_DONE case*/
/* 开始设置CPU参数,最终会调用opteed_enter_sp函数执行跳转到OPTEE的操作 */rc = opteed_synchronous_sp_entry(optee_ctx);assert(rc != 0);return rc;
}
3. opteed_enter_sp
opteed_entr_sp函数完成跳转到OP-TEE image进行执行的操作,该函数中将会保存一些列的寄存器值,设定好堆栈信息,然后通过调用el3_eixt函数来实现跳转操作
func opteed_enter_sp/* Make space for the registers that we're going to save */mov x3, spstr x3, [x0, #0]sub sp, sp, #OPTEED_C_RT_CTX_SIZE/* Save callee-saved registers on to the stack */stp x19, x20, [sp, #OPTEED_C_RT_CTX_X19]stp x21, x22, [sp, #OPTEED_C_RT_CTX_X21]stp x23, x24, [sp, #OPTEED_C_RT_CTX_X23]stp x25, x26, [sp, #OPTEED_C_RT_CTX_X25]stp x27, x28, [sp, #OPTEED_C_RT_CTX_X27]stp x29, x30, [sp, #OPTEED_C_RT_CTX_X29]/* ---------------------------------------------* Everything is setup now. el3_exit() will* use the secure context to restore to the* general purpose and EL3 system registers to* ERET into OPTEE.* ---------------------------------------------*/b el3_exit //使用设定好的安全CPU上下文,退出EL3进入OPTEE
endfunc opteed_enter_sp
当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的执行
bl33为非安全image,例如uboot, linux kernel等,当前该部分为bootloader部分的image,再由bootloader来启动linux kernel.(所以不会这么久就是为了整个bootloader吧,应该是kernel吧)
bl33就到了正常世界,非安全,这部分的启动就是操作系统的了,atf整个启动流程到这里就结束了。
学到这里,你脑子是否对atf(TFA过程)启动有个更深的了解。
这个TF-A就是针对ARM a系列,还有atf-m等。
对于这个部分,各家厂商可能用的tee os不一样,但是还是可以参考阅读一下。
参考资料:
https://icyshuai.blog.csdn.net/article/details/72472028
ATF启动(六):bl32(OP-TEE)-->bl33 ATF ending相关推荐
- ATF启动(一):整体启动流程
前言 关于ATF启动这里先整个宏观的概念. 这个blog讲的很好,就不重复写了,自己写还写不到这么清晰,图页很漂亮. 原文链接:https://www.cnblogs.com/arnoldlu/p/1 ...
- [ATF]-ATF启动--BL31跳转到optee和uboot
ATF 1.背景 2.ATF编译 3.ATF的启动 4.获取optee/uboot的跳转地址 4.总结一下ATF启动流程 ★★★ 链接 : 个人博客导读首页-点击此处 ★★★ 1.背景 在vendor ...
- 【SemiDrive源码分析】【X9芯片启动流程】27 - AP1 Android Preloader启动流程分析(加载atf、tos、bootloader镜像后进入BL31环境)
[SemiDrive源码分析][X9芯片启动流程]27 - AP1 Android Preloader启动流程分析(加载atf.tos.bootloader镜像后进入BL31环境) 一.Android ...
- ATF启动(五):服务注册
前言 我们知道BL31提供smc这个.前面也知道了在atf中.这个smc是怎么执行的. 这篇文章我们来看看这个到底是什么?以及我么如果想要使用的话怎么去注册一个自定义的服务. 参考文档:<SMC ...
- ATF启动(二):BL1
1.BL1 BL1是干什么的? BL1位于ROM中,在EL3下从reset vector处开始运行.(说明了启动是从EL3启动的,为什么?因为EL3安全等级最高呗.) (BL1这些都是镜像,我的认识就 ...
- ATF官方文档翻译(四):ATF固件设计(Firmware Design)(1)-冷启动
1.固件设计-前言 Trusted Firmware-A(TF-A)实现了Trusted Board Boot Requirements(TBBR)平台设计的一个子集 Arm参考平台的文档(PDD). ...
- ATF官方文档翻译(十一):ATF固件设计(Firmware Design)-BL图像的内存布局
友友一起学习点赞关注不迷路!!! BL镜像的内存布局 每个引导程序镜像可以分为两部分: •镜像的静态内容.这些数据实际上存储在磁盘上的二进制文件中.在ELF术语中,它们被称为PROGBITS部分: • ...
- ATF官方文档翻译(十):ATF固件设计(Firmware Design)-CPU特定操作框架
CPU特定操作框架 Armv8-A体系结构的某些方面是由实现定义的,也就是说,某些行为不是由体系结构定义的,而是必须由单个处理器实现定义和记录的.TF-A实现了一个框架,该框架对通用实现定义的行为进行 ...
- 移动终端安全-ATF中bl1可信启动源码分析
一.目标 本报告分析ATF中bl1可信启动的源代码,源代码位于arm-trusted-firmware-master\bl1和arm-trusted-firmware-master\include\a ...
最新文章
- 编译原理:实验一练习
- python读取txt文件并写入excel-Python读取txt内容写入xls格式excel中的方法
- BGP边界网关协议线路优势
- elasticsearch文档-modules
- crawler_微信采集方案
- 计算机与现代教育技术论文开题报告,计算机科学技术大学硕士与本科毕业论文开题报告...
- FSF 称 DRM 被用于锁定、控制和监视用户
- 三、Spring的@Scope设置组件作用域
- 根据线程名获取线程及停止线程
- python zip函数小结
- 高等数学张宇18讲 第二讲 极限与连续
- ad中那个快捷键是重复上一部_7个高手常用的快捷键,你应该收藏!
- jQuery动画高级用法(上)——详解animation中的.queue()函数 http://www.cnblogs.com/hh54188/archive/2011/04/09/1996469.
- qq发送信息给对方一定经过服务器,QQ如何把你消息传递给好友的?(上篇)
- WORDPRESS优化技巧之CDN加速
- DAVIS: Densely Annotated VIdeo Segmentation
- 关于前端授权获取微信用户信息实践
- php7安装fileinfo扩展
- 用python获取指定路径下的所有目录路径和文件路径
- ROS群机器人自动驾驶TensorFlow和人脸检测跟踪OpenCV