[手撕ARM64启动栈(十):OP-TEE 用户空间——libteec 与 C hello_world CA/TA 交互
系列文章目录手撕ARM64启动栈一QEMU TF-A → OP-TEE → U-Boot → Linux 全链路总览手撕ARM64启动栈二QEMU TF-A(ATF) BL1 执行上下文——GDB 实测复位到 BL2手撕ARM64启动栈三QEMU TF-A(ATF) BL1 核心职责——bl1_main()逐函数拆解与 BL2 加载手撕ARM64启动栈四QEMU TF-A(ATF) BL2 详解手撕ARM64启动栈五QEMU TF-A(ATF) BL32/OP-TEE 镜像头解析——三模式判定与入口改写手撕ARM64启动栈六QEMU TF-A(ATF) BL31 运行时服务框架与 opteed 注册手撕ARM64启动栈七QEMU TF-A(ATF) BL31 世界切换手撕ARM64启动栈八QEMU TF-A(ATF) OP-TEE 初始化详解手撕ARM64启动栈九OP-TEE Linux Driver——加载、SMC 握手与设备节点创建[手撕ARM64启动栈十OP-TEE 用户空间——libteec 与 C hello_world CA/TA 交互文章目录系列文章目录手撕ARM64启动栈十QEMU TF-A(ATF) OP-TEE 用户空间— hello_world CA/TA 交互1. 引言从一次 42 → 43 的调用说起2. hello_world运行结果3. CA 到 TA 的总体架构与 hello_world 协议3.1 目录结构3.2 UUID 与 command ID4.1 建立 context 与 session4.2 传参与 InvokeCommand4.3 关闭与释放5. 背后的机制libteec 与 GlobalPlatform API5.1 libteec 组件与 ioctl 映射5.2 核心对象与调用顺序5.3 参数类型、错误处理与共享内存6. 小结手撕ARM64启动栈十QEMU TF-A(ATF) OP-TEE 用户空间— hello_world CA/TA 交互1. 引言从一次 42 → 43 的调用说起上一篇讲到 Linux OP-TEE driver 完成 probe并注册/dev/tee0和/dev/teepriv0。本文用optee_examples/hello_world为例说明CA/TA完整交互流程到本篇截止你就可以写自己的CA/TA了并且完整了解了其工作原理本篇先给出CA/TA实际运行结果再逐步展开这次调用具体做了什么最后补充 GlobalPlatform Client API 的对象和参数细节。一次调用做了以下几件事CA 初始化 TEE contextCA 按 UUID 打开 hello_world TA sessionCA 把整数 42 作为VALUE_INOUT参数发给 TATA 加一并回写 43CA 关闭 session 和 context。2. hello_world运行结果启动 QEMU、登录 root 后运行optee_example_hello_world。Normal World 输出# optee_example_hello_world Invoking TA to increment 42 TA incremented value to 43 #Secure World 调试日志应包含D/TC:? 0 tee_ta_init_pseudo_ta_session:303 Lookup pseudo TA 8aaaf200-2450-11e4-abe2-0002a5d5c51b D/TC:? 0 ldelf_load_ldelf:110 ldelf load address 0x80008000 D/LD: ldelf:159 Loading TS 8aaaf200-2450-11e4-abe2-0002a5d5c51b D/TC:? 0 ldelf_syscall_open_bin:163 Lookup user TA ELF 8aaaf200-2450-11e4-abe2-0002a5d5c51b (early TA) D/TC:? 0 ldelf_syscall_open_bin:167 res0xffff0008 D/TC:? 0 ldelf_syscall_open_bin:163 Lookup user TA ELF 8aaaf200-2450-11e4-abe2-0002a5d5c51b (Secure Storage TA) D/TC:? 0 ldelf_syscall_open_bin:167 res0xffff0008 D/TC:? 0 ldelf_syscall_open_bin:163 Lookup user TA ELF 8aaaf200-2450-11e4-abe2-0002a5d5c51b (REE) D/TC:? 0 ldelf_syscall_open_bin:167 res0 D/TC:? 0 thread_rpc_free:2298 freeing cookie 0x100000000003 D/LD: ldelf:207 ELF (8aaaf200-2450-11e4-abe2-0002a5d5c51b) at 0x80044000 D/TA: TA_CreateEntryPoint:18 has been called D/TA: __GP11_TA_OpenSessionEntryPoint:47 has been called I/TA: Hello World! D/TC:? 0 thread_rpc_free:2298 freeing cookie 0x100000000001 D/TA: inc_value:78 has been called I/TA: Got value: 42 from NW I/TA: Increase value to: 43 D/TC:? 0 tee_ta_close_session:513 id 4 D/TC:? 0 tee_ta_close_session:527 Destroy session I/TA: Goodbye! D/TA: TA_DestroyEntryPoint:29 has been called D/TC:? 0 destroy_context:326 Destroy TA ctx (0x545f18e0)3. CA 到 TA 的总体架构与 hello_world 协议第 2 节的输出和日志走的就是这条路径CA 通过libteec打开/dev/tee0经 Linux TEE core 和 OP-TEE driver 转发给 Secure World由 hello_world TA 处理后原路返回。若 TA 尚未加载OP-TEE 会在OpenSession阶段通过 Reverse RPC 请求 Linux driver再由/dev/teepriv0交给tee-supplicant读取 REE-FS 上的.ta文件细节后续tee-supplicant篇章会展开。3.1 目录结构optee_examples/hello_world/ ├── Makefile ├── host/ │ ├── Makefile │ └── main.c # Normal World CA └── ta/ ├── Makefile ├── hello_world_ta.c # Secure World TA ├── user_ta_header_defines.h # 定义TA 属性、栈和堆大小 └── include/ └── hello_world_ta.h # 定义CA/TA 共用 UUID 和 command IDhost 与 TA 是两个独立二进制共用hello_world_ta.h里定义的 UUID 和 command ID。3.2 UUID 与 command ID#defineTA_HELLO_WORLD_UUID\{0x8aaaf200,0x2450,0x11e4,\{0xab,0xe2,0x00,0x02,0xa5,0xd5,0xc5,0x1b}}#defineTA_HELLO_WORLD_CMD_INC_VALUE0#defineTA_HELLO_WORLD_CMD_DEC_VALUE1TA 的 Makefile 用同一个 UUID 作为BINARY生成的 TA 文件名为8aaaf200-2450-11e4-abe2-0002a5d5c51b.taBINARY 8aaaf200-2450-11e4-abe2-0002a5d5c51b#4 一次open session 与InvokeCommand 逐步解析TA 侧实现五个标准入口入口调用时机hello_world 行为TA_CreateEntryPoint()TA 实例创建返回TEE_SUCCESSTA_OpenSessionEntryPoint()新 session 建立校验四个参数都是NONETA_InvokeCommandEntryPoint()CA 调用 command按 command ID 分发到inc_value()/dec_value()TA_CloseSessionEntryPoint()session 关闭无额外处理TA_DestroyEntryPoint()TA 实例销毁无额外资源清理4.1 建立 context 与 sessionCA 初始化 contextTEEC_Context ctx;TEEC_Result res;resTEEC_InitializeContext(NULL,ctx);if(res!TEEC_SUCCESS)errx(1,TEEC_InitializeContext failed with code 0x%x,res);libteec遍历/dev/tee0到/dev/teeN对候选设备执行TEE_IOC_VERSION成功后把 fd 保存到ctx。CA 按 UUID 打开 sessionTEEC_Session sess;TEEC_UUID uuidTA_HELLO_WORLD_UUID;uint32_terr_origin;resTEEC_OpenSession(ctx,sess,uuid,TEEC_LOGIN_PUBLIC,NULL,NULL,err_origin);TEEC_LOGIN_PUBLIC不附加身份数据两个NULL分别表示没有 login data、不向 TA 传 open-session 参数err_origin记录失败时的错误来源。libteec把 UUID 转成 Linux TEE UAPI 格式并发出TEE_IOC_OPEN_SESSION若 TA 尚未加载OP-TEE 会在此阶段触发 REE-FS 加载。TA 侧依次执行TA_CreateEntryPoint()和TA_OpenSessionEntryPoint()后者打印Hello World!对应第 2 节日志第一行随后 kernel 把返回的 session ID 保存到sess。4.2 传参与 InvokeCommandCA 构造参数并调用 command 0TEEC_Operation op;memset(op,0,sizeof(op));op.paramTypesTEEC_PARAM_TYPES(TEEC_VALUE_INOUT,TEEC_NONE,TEEC_NONE,TEEC_NONE);op.params[0].value.a42;printf(Invoking TA to increment %d\n,op.params[0].value.a);resTEEC_InvokeCommand(sess,TA_HELLO_WORLD_CMD_INC_VALUE,op,err_origin);if(res!TEEC_SUCCESS)errx(1,TEEC_InvokeCommand failed with code 0x%x origin 0x%x,res,err_origin);printf(TA incremented value to %d\n,op.params[0].value.a);参数 0 是双向 value。TEEC_InvokeCommand()把 command ID、session ID 和参数转换成TEE_IOC_INVOKE发给 kernel。TA 侧按 command ID 分发switch(cmd_id){caseTA_HELLO_WORLD_CMD_INC_VALUE:returninc_value(param_types,params);caseTA_HELLO_WORLD_CMD_DEC_VALUE:returndec_value(param_types,params);default:returnTEE_ERROR_BAD_PARAMETERS;}inc_value()校验参数类型后加一并回写uint32_texpectedTEE_PARAM_TYPES(TEE_PARAM_TYPE_VALUE_INOUT,TEE_PARAM_TYPE_NONE,TEE_PARAM_TYPE_NONE,TEE_PARAM_TYPE_NONE);if(param_types!expected)returnTEE_ERROR_BAD_PARAMETERS;IMSG(Got value: %u from NW,params[0].value.a);params[0].value.a;IMSG(Increase value to: %u,params[0].value.a);returnTEE_SUCCESS;4.3 关闭与释放TEEC_CloseSession(sess);TEEC_FinalizeContext(ctx);TEEC_CloseSession()发送TEE_IOC_CLOSE_SESSION触发 TA 的TA_CloseSessionEntryPoint()打印Goodbye!对应第 2 节日志最后一行。TEEC_FinalizeContext()关闭/dev/tee0fd。hello_world 没有独立TEEC_SharedMemory不需要额外 release。5. 背后的机制libteec 与 GlobalPlatform API前面已经逐步看过这次调用具体做了什么这里归纳背后的通用对象模型和 ioctl 映射关系。5.1 libteec 组件与 ioctl 映射OP-TEE 的通用用户空间组件位于optee_client/optee_client/ ├── libteec/ │ ├── include/tee_client_api.h # GlobalPlatform TEE Client API │ └── src/tee_client_api.c # Linux ioctl 实现 ├── tee-supplicant/ # Reverse RPC 守护进程 └── public/libteec向上给 CA 提供 GlobalPlatform 接口向下通过 ioctl 对接 Linux TEE UAPICA → GlobalPlatform TEEC_* API → libteec → Linux TEE UAPI ioctl → /dev/tee0TEEC_InitializeContext()/OpenSession()/InvokeCommand()/CloseSession()/FinalizeContext()对应的 ioctl 已在第 4 节逐步给出另外三个 hello_world 未用到的 APIlibteec APILinux 侧动作TEEC_RequestCancellation()发出TEE_IOC_CANCELTEEC_AllocateSharedMemory()若 driver 通告 registered-memory capability先分配 page-aligned 用户 buffer再发出TEE_IOC_SHM_REGISTER否则回退到TEE_IOC_SHM_ALLOC mmap()TEEC_RegisterSharedMemory()尝试发出TEE_IOC_SHM_REGISTER必要时使用 shadow buffer5.2 核心对象与调用顺序对象用途在当前实现中的关键状态TEEC_ContextCA 与一个 TEE 实例的连接/dev/teeNfd、registered-memory 和 NULL memref 能力TEEC_UUID标识目标 TA128 位 UUIDOpenSession时转换为 ioctl 字节序TEEC_SessionCA 与一个 TA 的逻辑会话所属 context 和 kernel 返回的 session IDTEEC_Operation一次 open/invoke 的四个参数paramTypes与params[4]TEEC_SharedMemoryCA 与 TA 之间的大块数据缓冲区buffer、size、方向、SHM ID、shadow buffer 等一个 context 可以建立多个 session一个 session 可以执行多次 command。标准调用顺序TEEC_InitializeContext() → TEEC_OpenSession() → TEEC_InvokeCommand()可重复 → TEEC_CloseSession() → TEEC_FinalizeContext()资源按相反顺序释放若使用独立共享内存还要在 finalize context 前调用TEEC_ReleaseSharedMemory()。5.3 参数类型、错误处理与共享内存TEEC_Operation固定四个参数槽TEEC_PARAM_TYPES()编码每槽类型类型数据形式方向TEEC_VALUE_INPUT/OUTPUT/INOUT两个uint32_tvalue.a、value.b输入、输出、双向TEEC_MEMREF_TEMP_*单次 operation 临时 buffer输入、输出、双向TEEC_MEMREF_WHOLE/PARTIAL_*已分配或已注册的TEEC_SharedMemory由 flags/type 决定hello_world 只传一个整数用TEEC_VALUE_INOUT即可不需要额外共享内存。TEEC_OpenSession()和TEEC_InvokeCommand()失败时同时返回TEEC_Result错误码和err_origin错误来源不能只看错误码判断err_origin含义TEEC_ORIGIN_APIlibteec参数检查或 API 实现TEEC_ORIGIN_COMMSCA 与 TEE 之间的通信层TEEC_ORIGIN_TEEOP-TEE 公共核心TEEC_ORIGIN_TRUSTED_APP目标 TA6. 小结C hello_world 用最小调用序列完成一次 CA/TA 交互InitializeContext → OpenSession(UUID) → InvokeCommand(INC_VALUE, VALUE_INOUT: 42) → TA 校验参数并写回 43 → CloseSession → FinalizeContext至此我们已经完成了从boot rom到linux 的启动流程并且完成了用户空间ca与ta交互的流程整个ATF的启动流程到此告一段落。后面章节将会针对security 不同领域进行分析。

相关新闻

[光学原理与应用-548]:光子的自旋与偏振,解读他们的区别与关联

[光学原理与应用-548]:光子的自旋与偏振,解读他们的区别与关联

光子的自旋与偏振:区别与关联关键结论先讲透: 自旋是光子本身固有的内禀量子属性(粒子层面);偏振是光的宏观可观测波动表现(波包的振动相位特征)。圆偏振直接对应光子自旋状态;线偏振…

2026/8/26 19:14:08 阅读更多 →
锤子助手第020个开关:启用生物验证解锁的位置、验证方法与认证安全边界

锤子助手第020个开关:启用生物验证解锁的位置、验证方法与认证安全边界

🔥 个人主页: 杨利杰YJlio ❄️ 个人专栏: 《Windows 疑难杂症与工单复盘案例库》 《Sysinternals实战教程》 《WINDOWS教程》 《Windows PowerShell 实战》 《IOS插件分析测试》 《超简单:用Python让Excel飞起来》…

2026/8/26 19:13:08 阅读更多 →
Yuki第009个开关:屏蔽输入状态回报的位置、验证方法与沟通透明边界

Yuki第009个开关:屏蔽输入状态回报的位置、验证方法与沟通透明边界

🔥 个人主页: 杨利杰YJlio ❄️ 个人专栏: 《Windows 疑难杂症与工单复盘案例库》 《Sysinternals实战教程》 《WINDOWS教程》 《Windows PowerShell 实战》 《IOS插件分析测试》 《超简单:用Python让Excel飞起来》…

2026/8/26 19:13:08 阅读更多 →

最新新闻

Python 自动化实战:搭建出海企业 B2B 销售线索池(附可直接运行的脚本)

Python 自动化实战:搭建出海企业 B2B 销售线索池(附可直接运行的脚本)

Python 自动化实战:搭建出海企业 B2B 销售线索池(附可直接运行的脚本) 对于正在“出海”的中国企业来说,海外 B2B 销售拓展有一个隐形的成本黑洞:线索获取。 你的销售团队可能每天花 2-3 小时在 LinkedIn、TechCrunc…

2026/8/26 20:20:51 阅读更多 →
SpringAI集成RAG实操(postgresql+pgvector)中(集成到项目中)

SpringAI集成RAG实操(postgresql+pgvector)中(集成到项目中)

1、在pom.xml 引入依赖<!-- 自动整合 PGVector 向量存储 --><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-starter-vector-store-pgvector</artifactId><version>1.0.0-M7</version></dep…

2026/8/26 20:20:51 阅读更多 →
从静态图到动态视频:让 InternVL3-2B-hf 看懂视频的完整实践指南

从静态图到动态视频:让 InternVL3-2B-hf 看懂视频的完整实践指南

从静态图到动态视频&#xff1a;让 InternVL3-2B-hf 看懂视频的完整实践指南 【免费下载链接】InternVL3-2B-hf 项目地址: https://ai.gitcode.com/hf_mirrors/OpenGVLab/InternVL3-2B-hf InternVL3-2B-hf 是 OpenGVLab 发布的 InternVL3 系列中最轻量的 20 亿参数多模…

2026/8/26 20:20:51 阅读更多 →
FastAPI + SQLAlchemy2.0 异步数据库

FastAPI + SQLAlchemy2.0 异步数据库

FastAPI 集成 SQLAlchemy2.0 异步数据库 主流 Python ORM 对比 Python 生态有很多 ORM 库&#xff1a;SQLAlchemy、Peewee、Pony ORM、Tortoise‑ORM。 SQLAlchemy&#xff1a;生态最成熟&#xff0c;支持异步&#xff0c;社区活跃 SQLModel&#xff1a;FastAPI 作者开发&…

2026/8/26 20:20:51 阅读更多 →
mentor PRO操作要点

mentor PRO操作要点

手动创建symbol_右键新建设置格点&#xff08;0.1in&#xff09;文本0.05引脚可以复制黏贴&#xff08;改pin num和pin type&#xff09;GND_1原点放在左下角Excel创建symbol需要.csv文件IC 新建symbol-右键import pin,引脚shift选中往里拖Padstack_edit---oblong(长宽)mm新建一…

2026/8/26 20:20:50 阅读更多 →
DeepSeek 涨价,我先算了笔账,决定不折腾

DeepSeek 涨价,我先算了笔账,决定不折腾

这两天后台群里最热闹的话题就是 DeepSeek 调价&#xff0c;好几个群友直接来问我&#xff1a;换了吗&#xff0c;换哪家&#xff1f;把两轮调价公告和几家的新价格表翻完、又对着自己的账单算了半天之后&#xff0c;我的结论可能跟很多人不一样&#xff1a;先别急着换&#xf…

2026/8/26 20:19:50 阅读更多 →

日新闻

Python random 模块常用函数详解:从入门到实战

Python random 模块常用函数详解:从入门到实战

目录 1. 引言2. 准备工作3. 基础随机函数4. 序列相关函数5. 随机种子与复现6. 实战案例7. 注意事项8. 常见问题与排查9. 总结 1. 引言 摘要&#xff1a; 本文系统介绍 Python 标准库 random 模块中最常用的随机数生成函数。内容涵盖基础随机函数&#xff08;random()、unifor…

2026/8/26 0:00:40 阅读更多 →
《Microsoft Sql server 2008 Internals》读书笔记--第三章Databases and Database Files(2)

《Microsoft Sql server 2008 Internals》读书笔记--第三章Databases and Database Files(2)

《Microsoft Sql server 2008 Internals》索引目录&#xff1a; 《Microsoft Sql server 2008 Internals》读书笔记--目录索引 在上篇文章中&#xff0c;主要介绍了创建数据库的基本语法和FileGroup的初步知识。需要注意的是: 关于FileGroup 如果你的系统是用Raid设备直接存…

2026/8/26 1:18:18 阅读更多 →
政务AI智能体怎么建?三种模式、三步路径与四个误区

政务AI智能体怎么建?三种模式、三步路径与四个误区

政务AI智能体已经从概念试点阶段&#xff0c;转入了政务服务的常态化落地应用&#xff1b;在实际使用过程中&#xff0c;它能自主理解办事需求、辅助完成填报申报、开展材料预审&#xff0c;并联动多个系统协同作业&#xff0c;真正嵌入到政务办理的全流程当中。但在落地推进过…

2026/8/26 1:18:18 阅读更多 →

周新闻

[光学原理与应用-521]:对光的错误理解与纠偏

[光学原理与应用-521]:对光的错误理解与纠偏

首先光是一种能量的载体和形态&#xff0c;宏观上观察到的光是由无数个微观的光量子组成的&#xff0c;每个光子在产生的瞬间&#xff0c;其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前&#xff0c;在微观层面&#xff0c;每个光量子的运动轨迹是以波函数所展现…

2026/8/26 14:45:33 阅读更多 →
SIP通话转接原理与REFER方法实战解析

SIP通话转接原理与REFER方法实战解析

1. 通话转接不是“挂断再拨号”&#xff0c;而是SIP会话的动态重定向你有没有遇到过这样的场景&#xff1a;客服坐席A正在和客户通电话&#xff0c;突然需要把这通对话无缝转给专家坐席B&#xff0c;客户完全感知不到中间的断连——既没听到忙音&#xff0c;也没被要求重新拨号…

2026/8/26 17:46:43 阅读更多 →
Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

1. 为什么选择Kolla-ansible来部署单节点OpenStack&#xff1f;如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法&#xff0c;那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

2026/8/26 14:46:37 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速&#xff1a;macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/26 3:50:20 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南&#xff1a;3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗&#xff1f;ncmdump解密工具帮你轻松解决这个困…

2026/8/26 17:46:39 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片&#xff1a;为英语学习 App 打造桌面级学习助手适用平台&#xff1a;HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0&#xff08;API 26 Beta&#xff09;新增了 AgentCard 智能体卡片能力&#xff0c;这是继 HMAF&#xff08;鸿蒙智能体框架&#x…

2026/8/26 1:24:05 阅读更多 →