[optee]-opteeTA启动的过程(open_ta的过程)
open TA
- 1、open TA的两种方式
- 2、TA的分类 & 查询TA的顺序
- (1)、Look for already loaded TA
- (2)、Look for pseudo TA
- (3)、Look for user TA
★★★ 友情链接 : 个人博客导读首页—点击此处 ★★★
1、open TA的两种方式
- 在CA中TEEC_OpenSession()打开一个TA
- 在TA中TEE_OpenSession()打开一个TA
如下图所示,是打开一个user_ta的过程,最终都是调用了rpc_load,然后再调用shdr_verify_signature()验证TA签名.
2、TA的分类 & 查询TA的顺序
- Look for already loaded TA
- Look for pseudo TA
- Look for user TA
如代码所示在tee_ta_manage.c的tee_ta_init_session中,先去查找已经loaded的TA,再去寻址PTA,最好才去找user TA
static TEE_Result tee_ta_init_session(TEE_ErrorOrigin *err,struct tee_ta_session_head *open_sessions,const TEE_UUID *uuid,struct tee_ta_session **sess)
{TEE_Result res;struct tee_ta_ctx *ctx;struct tee_ta_session *s = calloc(1, sizeof(struct tee_ta_session));*err = TEE_ORIGIN_TEE;if (!s)return TEE_ERROR_OUT_OF_MEMORY;s->cancel_mask = true;condvar_init(&s->refc_cv);condvar_init(&s->lock_cv);s->lock_thread = THREAD_ID_INVALID;s->ref_count = 1;/** We take the global TA mutex here and hold it while doing* RPC to load the TA. This big critical section should be broken* down into smaller pieces.*/mutex_lock(&tee_ta_mutex);TAILQ_INSERT_TAIL(open_sessions, s, link);/* Look for already loaded TA */ctx = tee_ta_context_find(uuid);if (ctx) {res = tee_ta_init_session_with_context(ctx, s);if (res == TEE_SUCCESS || res != TEE_ERROR_ITEM_NOT_FOUND)goto out;}/* Look for pseudo TA */res = tee_ta_init_pseudo_ta_session(uuid, s);if (res == TEE_SUCCESS || res != TEE_ERROR_ITEM_NOT_FOUND)goto out;/* Look for user TA */res = tee_ta_init_user_ta_session(uuid, s);out:if (res == TEE_SUCCESS) {*sess = s;} else {TAILQ_REMOVE(open_sessions, s, link);free(s);}mutex_unlock(&tee_ta_mutex);return res;
}
(1)、Look for already loaded TA
其实就是遍历链表link,查看TA是否已经被loaded了
/* Look for already loaded TA */ctx = tee_ta_context_find(uuid);if (ctx) {res = tee_ta_init_session_with_context(ctx, s);if (res == TEE_SUCCESS || res != TEE_ERROR_ITEM_NOT_FOUND)goto out;}
static struct tee_ta_ctx *tee_ta_context_find(const TEE_UUID *uuid)
{struct tee_ta_ctx *ctx;TAILQ_FOREACH(ctx, &tee_ctxes, link) {if (memcmp(&ctx->uuid, uuid, sizeof(TEE_UUID)) == 0)return ctx;}return NULL;
}
(2)、Look for pseudo TA
其实就算去rodata中的__start_ta_head_section段就寻找PTA
/* Look for pseudo TA */res = tee_ta_init_pseudo_ta_session(uuid, s);if (res == TEE_SUCCESS || res != TEE_ERROR_ITEM_NOT_FOUND)goto out;*(.rodata .rodata.*)/** 8 to avoid unwanted padding between __start_ta_head_section* and the first structure in ta_head_section, in 64-bit* builds*/. = ALIGN(8);__start_ta_head_section = . ;KEEP(*(ta_head_section))__stop_ta_head_section = . ;. = ALIGN(8);__start_phys_mem_map_section = . ;KEEP(*(phys_mem_map_section))__end_phys_mem_map_section = . ;. = ALIGN(8);__start_phys_sdp_mem_section = . ;KEEP(*(phys_sdp_mem_section))__end_phys_sdp_mem_section = . ;. = ALIGN(8);__start_phys_nsec_ddr_section = . ;KEEP(*(phys_nsec_ddr_section))__end_phys_nsec_ddr_section = . ;. = ALIGN(8);__start_phys_ddr_overall_section = . ;KEEP(*(phys_ddr_overall_section))__end_phys_ddr_overall_section = . ;
(3)、Look for user TA
通过RPC调用,从REE侧的文件系统中读取TA Binary
[optee]-opteeTA启动的过程(open_ta的过程)相关推荐
- optee的启动过程
在ATF中opteed_setup()跳转到optee起始地址 optee起始代码位置 从kern.ld.S可以看到,无论是arm32还是arm64,代码段都是从_start函数处开始 OUTPUT_ ...
- 编写一个USB接口程序,模拟计算机启动过程和关闭过程启动过程中要加载鼠标、键盘、麦克风等USB设备,具体要求如下: (1)定义一个接口USB,包含两个抽象方法turnOn()he turnOff(),
一.好物推荐 给大家推荐三款蓝牙耳机,下面的链接可以直接购买: 1.https://item.taobao.com/item.htm?ft=t&id=643733003968 2.https: ...
- 记录一次elasticsearch挂掉之后无法启动 kibana Status: Red -分析过程
记录一次elasticsearch挂掉之后无法启动 kibana Status: Red -分析过程 现象 现象一 kibana Status: Red 现象二 elasticsearch 集群挂掉 ...
- 电脑主机开机时一直断电启动循环或者在使用过程中死机只能强制关机
这篇文章只提供参考,我的解决办法不一定能解决你的问题. 电脑主机开机时一直断电启动循环 或者在使用过程中死机只能强制关机 有可能是你的内存条出了问题,建议检查主机的内存条(看看是不是内存条的金手指脱落 ...
- Java编写USB接口,模拟计算机启动过程和关闭过程
编写一个USB接口程序,模拟计算机启动过程和关闭过程启动过程中要加载鼠标.键盘.麦克风等USB设备,具体要求如下: (1)定义一个接口USB,包含两个抽象方法turnOn()he turnOff(), ...
- rhel系统启动过程_Linux系统启动过程
Linux启动过程 前言: Linux是一种自由和开放源代码的类UNIX操作系统.该操作系统的内核由林纳斯·托瓦兹在1991年10月5日首次发布.在加上用户空间的应用程序之后,成为Linux操作系统. ...
- CMMI2.0之我见-过程管理PCM过程资产开发PAD
编者按: CMMI2.0之我见系列将通过系列文章形式介绍CMMI2.0所涉及到的其中20个实践域,笔者将通过系统性的梳理.浅显易懂的文字描述,同时结合笔者的思考和观点,对每个实践域的目标以及所基本涵盖 ...
- 深入思考编译原理之 理解执行过程和编译过程
在深入编译器原理细节之前,很多学习者并没有真正从宏观上理解一个编译器都做了些什么,这其实是非常遗憾的. 从计算机执行过程角度思考,函数调用的尤为重要,面向过程的语言更是将函数调用作为最基本的要素.面向 ...
- 读《大道至简——失败的过程也是过程》有感
再次怀着热情读了大道至简的第五章--失败的过程也是过程.作者首先告诉我们: 做过程不是做工程 .为什么这么说?作者讲到,按照模型,做完过程的每一个阶段, 并不等于做工程.或者说,工程并不是这样就可以做 ...
最新文章
- 一文梳理深度学习算法演进
- 什么是智能仓储?一文带你彻底搞懂!
- 【SICP练习】127 练习3.58
- [转]sudoers设置
- Word2Vec学习笔记(三)
- xp的服务器系统怎么安装win7系统教程,怎么在xp系统下安装win7双系统教程
- dante pam mysql_FreeBSD下安装dante(sockd)并使用pam-pwdfile进行认证
- lenet5卷积神经网络_tensorflow图像识别入门实战:使用LeNet5模型实现猫狗分类
- 破解钉钉旧版本强制更新(实现旧版本登录)
- 中国行政区划代码,包括五级行政区划详细代码,县级以上区划地理围栏
- 华为员工去面试被淘汰后怒怼HR:华为出来的也能被拒,很无语
- 第二周 Linux文件管理类命令及bash基本特性
- docker部署finebi 帆软
- elasticsearch rpm安装及详细配置
- 模仿360安全卫士项目笔记3
- html5学习笔记——三、图文展示网页设计
- 在python中gevent monkey_patch 出现Monkey-patching may lead to errors解决
- Xftp的下载和安装教程
- 反向链接的类型(转)
- vue2+elTree 实现右键菜单
热门文章
- c#程序设计语言杜松江版_当前最流行的10款编程语言,你会哪种?
- java https 慢_jetty https慢怎么调优?
- 成功解决AttributeError: module tensorflow.image has no attribute resize
- Interview:算法岗位面试—10.30上午上海某信息公司(偏图算法)技术面试之单链表反转、给定整型数组和目标值 二分法查找+下午上海某金融公司(AI岗位,上市)CTO和主管技术面试之Xcepti
- Ubuntu:Ubuntu系统下在pycharm软件内配置anaconda环境(一张图轻松搞定!)
- ML之xgboost:利用xgboost算法(sklearn+3Split+调参曲线)训练mushroom蘑菇数据集(22+1,6513+1611)来预测蘑菇是否毒性(二分类预测)
- BC之SC:区块链之智能合约——与传统合约的比较以及智能合约模型部署原理、运行原理相关配图
- Matlab:Matlab中常用的函数、案例详细攻略
- 【强烈推荐】最好理解的LSTM与GRU教程
- errno_t open_s()打开文件出现的错误分析