前言

前面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相关推荐

  1. ATF启动(一):整体启动流程

    前言 关于ATF启动这里先整个宏观的概念. 这个blog讲的很好,就不重复写了,自己写还写不到这么清晰,图页很漂亮. 原文链接:https://www.cnblogs.com/arnoldlu/p/1 ...

  2. [ATF]-ATF启动--BL31跳转到optee和uboot

    ATF 1.背景 2.ATF编译 3.ATF的启动 4.获取optee/uboot的跳转地址 4.总结一下ATF启动流程 ★★★ 链接 : 个人博客导读首页-点击此处 ★★★ 1.背景 在vendor ...

  3. 【SemiDrive源码分析】【X9芯片启动流程】27 - AP1 Android Preloader启动流程分析(加载atf、tos、bootloader镜像后进入BL31环境)

    [SemiDrive源码分析][X9芯片启动流程]27 - AP1 Android Preloader启动流程分析(加载atf.tos.bootloader镜像后进入BL31环境) 一.Android ...

  4. ATF启动(五):服务注册

    前言 我们知道BL31提供smc这个.前面也知道了在atf中.这个smc是怎么执行的. 这篇文章我们来看看这个到底是什么?以及我么如果想要使用的话怎么去注册一个自定义的服务. 参考文档:<SMC ...

  5. ATF启动(二):BL1

    1.BL1 BL1是干什么的? BL1位于ROM中,在EL3下从reset vector处开始运行.(说明了启动是从EL3启动的,为什么?因为EL3安全等级最高呗.) (BL1这些都是镜像,我的认识就 ...

  6. ATF官方文档翻译(四):ATF固件设计(Firmware Design)(1)-冷启动

    1.固件设计-前言 Trusted Firmware-A(TF-A)实现了Trusted Board Boot Requirements(TBBR)平台设计的一个子集 Arm参考平台的文档(PDD). ...

  7. ATF官方文档翻译(十一):ATF固件设计(Firmware Design)-BL图像的内存布局

    友友一起学习点赞关注不迷路!!! BL镜像的内存布局 每个引导程序镜像可以分为两部分: •镜像的静态内容.这些数据实际上存储在磁盘上的二进制文件中.在ELF术语中,它们被称为PROGBITS部分: • ...

  8. ATF官方文档翻译(十):ATF固件设计(Firmware Design)-CPU特定操作框架

    CPU特定操作框架 Armv8-A体系结构的某些方面是由实现定义的,也就是说,某些行为不是由体系结构定义的,而是必须由单个处理器实现定义和记录的.TF-A实现了一个框架,该框架对通用实现定义的行为进行 ...

  9. 移动终端安全-ATF中bl1可信启动源码分析

    一.目标 本报告分析ATF中bl1可信启动的源代码,源代码位于arm-trusted-firmware-master\bl1和arm-trusted-firmware-master\include\a ...

最新文章

  1. 编译原理:实验一练习
  2. python读取txt文件并写入excel-Python读取txt内容写入xls格式excel中的方法
  3. BGP边界网关协议线路优势
  4. elasticsearch文档-modules
  5. crawler_微信采集方案
  6. 计算机与现代教育技术论文开题报告,计算机科学技术大学硕士与本科毕业论文开题报告...
  7. FSF 称 DRM 被用于锁定、控制和监视用户
  8. 三、Spring的@Scope设置组件作用域
  9. 根据线程名获取线程及停止线程
  10. python zip函数小结
  11. 高等数学张宇18讲 第二讲 极限与连续
  12. ad中那个快捷键是重复上一部_7个高手常用的快捷键,你应该收藏!
  13. jQuery动画高级用法(上)——详解animation中的.queue()函数 http://www.cnblogs.com/hh54188/archive/2011/04/09/1996469.
  14. qq发送信息给对方一定经过服务器,QQ如何把你消息传递给好友的?(上篇)
  15. WORDPRESS优化技巧之CDN加速
  16. DAVIS: Densely Annotated VIdeo Segmentation
  17. 关于前端授权获取微信用户信息实践
  18. php7安装fileinfo扩展
  19. 用python获取指定路径下的所有目录路径和文件路径
  20. ROS群机器人自动驾驶TensorFlow和人脸检测跟踪OpenCV

热门文章

  1. html两个tab页面,html如何实现tab页面切换
  2. Ruby On Rails的傻瓜安装
  3. linux 技能包【2】:什么是Mbps、Kbps、bps、kb、mb及其换算和区别?
  4. node.js -v15.0.0下载安装配置教程笔记
  5. 组合数学之隔板法:多元一次方程组解的统计
  6. http中302与304
  7. 各大互联网大厂年终奖一览表,又是别人家的公司!
  8. 笔记——setInterval()设置停止和循环
  9. PowerShell隐藏不显示窗口的多种方法
  10. 阀门定位器的三种维护方式