OpenHarmony teecd频繁崩溃问题分析

teecd 崩溃分析

根本原因

两个层面的问题:

  1. 初始崩溃(pid 239,运行 ~3.8 秒后退出)

main() 的执行流程:

  1. TcuAuthentication() --- 打开 /dev/tc_private,执行 ioctl(TC_NS_CLIENT_IOCTL_SET_NATIVE_IDENTITY),此 ioctl 会阻塞等待 TEE OS 就绪,耗时约 3.8 秒

  2. ProcessAgentInit() --- 尝试注册 FS/MISC/SECLOAD 三个 agent,失败,返回 -1

  3. main() 返回 -1,即 exit code 255

ProcessAgentInit 失败的原因在 tee_agent.c:60-73:

int fd = tee_open(TC_PRIVATE_DEV_NAME, O_RDWR, 0); // 打开 /dev/tc_private

ret = ioctl(fd, TC_NS_CLIENT_IOCTL_REGISTER_AGENT, &args); // 注册 agent

if (ret) {

return -1; // ioctl 失败 -> 返回 -1

}

  1. 后续崩溃循环(pid 504/529/530/655/2518...)

agent_manager.c:320-322:

if (find_agent(agent_id)) {

tloge("agent whose id = 0x%x has been registered\n", agent_id);

goto fail0; // -> return TEE_ERROR_GENERIC

}

TEE OS 中的 agent 注册是持久的,且系统 agent(FS/MISC/SECLOAD)不允许注销(agent_manager.c:355-357):

if (is_system_agent(agent_id)) {

tloge("system agents not allowed to unregister\n");

return TEE_ERROR_GENERIC;

}

一旦 teecd 崩溃,TEE OS 侧的 agent 注册记录不会清除,后续所有重启都会因"agent already registered"而立即失败。


崩溃链路

teecd(239) 启动

-> TcuAuthentication() 阻塞 ~3.8s (等待 TEE OS 就绪)

-> ProcessAgentInit() 失败 (ioctl REGISTER_AGENT 返回错误)

-> main() 返回 -1 (exit 255)

teecd(504) 重启

-> ProcessAgentInit() 立即失败 (agent already registered in TEE OS)

-> exit 255 (0.27s)

teecd(529/530/...) 继续崩溃循环


需要排查的方向

问题1:为什么 pid 239 的 REGISTER_AGENT ioctl 失败?

可能原因:

  • TEE OS 尚未完全初始化(mailbox 未就绪,in_mailbox_range() 检查失败)

  • /dev/tc_private 的 tzdriver 内核模块未加载或初始化失败

  • 需要查看 tzdriver 内核日志(dmesg 中的 TEE 相关错误)

问题2:TEE OS 侧 agent 重注册机制缺失

register_agent() 在 agent 已存在时直接失败,没有更新 buffer 地址的路径。修复方向是在 agent_manager.c:320 处,当 agent 已注册时,更新其 phys_buffer 和 size 而不是返回错误:

// 当前代码(agent_manager.c:319-323)

if (find_agent(agent_id)) {

tloge("agent whose id = 0x%x has been registered\n", agent_id);

goto fail0;

}

可以改为允许系统 agent 重新注册(更新 buffer 地址),以支持 teecd 崩溃重启场景。

建议下一步: 查看设备的 dmesg 内核日志,找到 teecd 首次启动时 tzdriver 侧的错误信息,确认 REGISTER_AGENT ioctl 失败的具体原因。

相关推荐
小此方9 分钟前
Linux网络(二十九):从内网穿透到P2P打洞:NAT转换、代理机制与局域网通信的底层全景解析
linux·网络·p2p
Brilliantwxx16 分钟前
【Linux】基础IO(下):输出重定向、dup2 与 minishell 重定向实战
linux·运维·服务器·github·bash
学linux的QQ蛋17 分钟前
IMX6 嵌入式多传感器系统整体架构梳理
linux·嵌入式硬件·架构
小HANN29 分钟前
(架构 + InnoDB 事务 MVCC):《MySQL 底层探秘①:拆解 InnoDB,读懂事务、MVCC 与日志的底层逻辑》
linux·运维·服务器·经验分享
kyle~31 分钟前
Linux --- 虚拟内存 1.fork、2.COW、3.mmap、4.page fault、5.TLB、6.页表
linux·运维·服务器
Techblog of HaoWANG1 小时前
Ubuntu 下将 Ollama 服务配置为监听 0.0.0.0:11434 完整实践
linux·数据库·ubuntu·ollama
小HANN1 小时前
Ceph分布式存储深度解析-下篇
linux·运维·服务器·经验分享
张文君1 小时前
ubuntu iscsi客户端 关闭磁盘
linux·运维·ubuntu
道尔柯南2 小时前
Linux 网络编程:从零掌握 TCP Socket 编程(附 C++ 实战)
linux·网络·tcp/ip
0+1112 小时前
Linux --ARP的具体过程与ARP欺骗
linux·服务器·网络