高通HLOS↔TrustZone通信框架演进(1): ARM TrustZone通信基石与QSEECOM架构详解

发布时间:2026/6/4 13:23:21

高通HLOS↔TrustZone通信框架演进(1): ARM TrustZone通信基石与QSEECOM架构详解 1. 引言隔离世界之间的通信需求从事过ARM平台安全开发的工程师对Trustzone应该并不陌生。ARM TrustZone 技术通过硬件将处理器划分为Secure World安全世界和Normal World非安全世界。二者在物理上隔离——各自拥有独立的内存地址空间、外设访问权限和执行特权级内存地址空间通过 TZASC 等控制器划分外设访问权限通过 TZPC 等控制器控制异常级Exception Level执行环境在高通芯片平台上Secure World运行QTEEQualcomm Trusted Execution Environment其中包含一个微型内核MINK和若干Trusted ApplicationTA如 Keymaster、Widevine DRM、Gatekeeper。Normal World运行 HLOSLinux / Android需要调用 TA 提供的安全服务如生成密钥、验证指纹、解密 DRM 内容。两个世界之间的硬件隔离决定了 HLOS 无法直接调用 TA 的函数必须依赖一套受控的通信机制在Secure Monitor的仲裁下让请求安全穿越。高通第一代解决方案就是QSEECOM。2. ARMv8 异常级模型与 SMC 指令理解 QSEECOM 前需要掌握 ARMv8 的异常级模型和世界切换机制异常级典型运行内容所属世界EL0用户态应用AppNormal / SecureEL1OS 内核 / QTEE 内核Normal / SecureEL2HypervisorQHEENormalEL3Secure MonitorARM FW / TZBSPSecureblock-beta columns 1 block:normal[Normal World] block:el0n[EL0] ua[User App (HLOS userspace)] end block:el1n[EL1] lk[Linux Kernel (HLOS kernel)] end block:el2n[EL2] hv[Hypervisor (QHEE)] end end block:el3[EL3 — Secure Monitor (ARM FW / TZBSP)] block:secure[Secure World] block:el0s[EL0] ta[Trusted Applications (TA)] end block:el1s[EL1] qtee[QTEE Kernel (MINK TZBSP)] end end end ua -- lk lk -- hv hv -- el3 ta -- qtee qtee -- el3ARMv8 异常级与世界划分参考 [5] ARM Architecture Reference Manual、[4] 80-NH537-4 §2.世界切换的唯一硬件入口是SMCSecure Monitor Call指令。当 HLOS kernel 执行SMC时CPU 从 Normal World EL1 陷入 Secure World EL3Secure Monitor 保存 Normal World 上下文根据 SMC 功能号SMC ID路由到对应的 TrustZone 处理函数TrustZone 处理完成后原路返回QSEECOM 以及后续的 SMCInvoke 都建立在SMC之上区别在于上层封装与抽象层次。3. QSEECOM 整体架构QSEECOM 是一套完整的HLOS ↔ TustZone 通信框架覆盖从 HLOS 用户态进程到 TrustZone 中 TA 的全链路。block-beta columns 1 block:us[HLOS Userspace] tca[TA Client\nApplication] lsnr[Listener\nApplication] api[QSEECom API\n(libQSEEComAPI)] end block:ks[HLOS Kernel] drv[QSEECom Driver\n(/dev/qseecom)] end block:sw[Secure World] qtee[QTEE\n(MINK Kernel TZBSP)] ta2[Trusted Application\n(TA)] end tca -- drv lsnr -- drv api -- drv drv -- SMC -- qtee qtee -- ta2QSEECOM 端到端架构参考 [1] 80-PK177-40 §TrustZone、[4] 80-NH537-4 §8.5核心组件表组件位置职责libQSEEComAPIHLOS UserspaceC 库封装ioctl调用提供QSEECom_start_app/send_cmd等 APIQSEECom DriverHLOS Kernel字符设备驱动/dev/qseecom处理ioctl执行 SMCQTEE (MINK)Secure World EL1接收 SMC 请求调度到对应 TATASecure World EL0安全应用实现具体业务如密码验证、DRM 解密端到端数据流简述HLOS 用户态 Client 调用libQSEEComAPI函数API 内部通过ioctl进入 QSEECom DriverDriver 构建 SMC 命令并触发SMC指令Secure Monitor 跳转到 QTEEQTEE 将请求路由到目标 TATA 处理请求结果写回共享内存SMC 返回HLOS 从共享内存读取结果4. Client 与 Listener 双角色模型QSEECOM 定义了两种 HLOS 侧角色Client客户端主动方负责启动load一个 TA向 TA 发送命令SendCommand接收 TA 的响应关闭shutdownTAListener监听器被动方 / 服务方在 HLOS 用户态注册一个监听器阻塞等待 TA 发来的请求处理请求如文件 I/O、网络访问将结果返回给 TA被动等待 TA 请求的一方。当 TA 需要 HLOS 提供某些服务比如文件 I/O、网络访问时TA 会向已注册的 Listener 发送请求Listener 处理后再将结果返回给 TA。这实现了 TA → HLOS 的反向通信。sequenceDiagram participant C as Client participant T as TA participant L as Listener C-T: Send Command T--C: Response T-L: Request to Listener L--T: Response from ListenerQSEECOM Client/Listener 双向通信模型参考 [4] 80-NH537-4 §8.5这种双向通信模型解决了 TA 需要 HLOS 服务的场景例如安全文件系统读写。但 Listener 需要独立线程阻塞等待资源开销较大。5. 通信数据结构与共享内存模型QSEECOM 的数据交换基于共享内存Shared Memorystructqsecom_req{void*req;// 请求缓冲区指针uint32_treq_len;// 请求长度void*rsp;// 响应缓冲区指针uint32_trsp_len;// 响应缓冲区大小};数据流详细步骤HLOS Client 在用户态分配内存填充请求数据通过ioctl传递请求/响应缓冲区的用户态虚拟地址及长度QSEECom Driver 将用户态地址转换为物理地址或 ION 句柄Driver 执行 SMC将物理地址传递给 TrustZoneQTEE 将该物理地址映射到 Secure World 地址空间TA 直接读写该共享内存区域SMC 返回后HLOS 从响应缓冲区读取结果大块数据零拷贝QSEECom_send_modified_cmd允许传递 ION 文件描述符。HLOS 先通过 ION 分配大块连续物理内存将 fd 传给 TrustZoneTrustZone 可直接访问同一块物理内存避免数据拷贝适用于 DRM 视频帧等场景。6. 关键 API 清单Client 侧 APIintQSEECom_start_app(structQSEECom_handle**handle,constchar*app_name,uint32_tsize);intQSEECom_shutdown_app(structQSEECom_handle*handle);intQSEECom_send_cmd(structQSEECom_handle*handle,void*send_buf,uint32_tbuf_len,void*recv_buf,uint32_trbuf_len);intQSEECom_send_modified_cmd(structQSEECom_handle*handle,void*send_buf,uint32_tbuf_len,void*recv_buf,uint32_trbuf_len,structqsecom_ion_fd_info*ion_fd_info);Listener 侧 APIintQSEECom_register_listener(structQSEECom_handle*handle,uint32_tlistener_id,uint32_tsb_length);intQSEECom_unregister_listener(structQSEECom_handle*handle);intQSEECom_receive_req(structQSEECom_handle*handle,void*req_buf,uint32_treq_buf_len);intQSEECom_send_resp(structQSEECom_handle*handle,void*resp_buf,uint32_tresp_buf_len);7. 典型通信流程无 Listener流程一Client 向 TA 发送命令无需 ListenersequenceDiagram participant C as HLOS Userspacebr/(TA Client) participant D as HLOS Kernelbr/(QSEECom Driver) participant T as Secure Worldbr/(QTEE TA) C-D: QSEECom_start_app() D-T: ioctl → SMC (LOAD_APP) T--T: Load start TA T--D: return D--C: handle C-C: 填充 send_buf C-D: QSEECom_send_cmd() D-T: ioctl → SMC (SEND_CMD) T--T: TA 处理请求 T--D: SMC return D--C: 读取 recv_buf C-D: QSEECom_shutdown_app() D-T: ioctl → SMC (SHUTDOWN_APP) T--T: Unload TA T--D: return D--C: doneClient 调用QSEECom_start_app→ Driver 发送LOAD_APPSMC → QTEE 加载 TAClient 填充send_buf调用QSEECom_send_cmd→ Driver 发送SEND_CMDSMC → TA 处理TA 写recv_buf→ SMC 返回 → Client 读取结果Client 调用QSEECom_shutdown_app→ Driver 发送SHUTDOWN_APPSMC → QTEE 卸载 TAClient→TA 命令发送流程参考 [4] 80-NH537-4 §8.9 Figure 8-1/8-2流程二TA 请求 Listener 服务当 TA 需要访问 HLOS 的资源时例如安全文件系统的 I/O 操作可以通过已注册的 Listener 反向请求 HLOSsequenceDiagram participant L as HLOS Userspacebr/(Listener) participant D as HLOS Kernelbr/(QSEECom Driver) participant T as Secure Worldbr/(QTEE TA) L-D: QSEECom_register_listener() D-T: ioctl → SMC (REGISTER_LSNR) T--D: return D--L: handle L-D: QSEECom_receive_req() Note over L,D: 阻塞等待 TA 请求... T-D: TA 发起请求 (SMC) D--L: 唤醒 Listener交付请求数据 L-L: 处理请求填充响应 L-D: QSEECom_send_resp() D-T: ioctl → SMC (SEND_RESP) T--T: TA 获得结果 T--D: returnTA→Listener 反向请求流程参考 [4] 80-NH537-4 §8.9 Figure 8-3/8-48. 小结QSEECOM 是第一代实用的 HLOS↔TrustZone 通信框架它基于 SMC 共享内存 ION 零拷贝提供了基础能力并支持 Listener 反向通信。然而其扁平模型、缺乏类型安全、无身份传递等设计局限在高版本芯片和高安全需求场景下逐渐暴露为后续 SMCInvoke 的诞生埋下了技术驱动力。

相关新闻