目录
一、序言
本节中描述的特性依赖于上游不可用的Linux kernel patch,并且在OP-TEE版本3.15.0之前一直在linaro-swg kernel repository中维护。带有此补丁的最新内核源代码可以在基于Linux 5.14的 optee-3.15.0分支中找到。
Benchmark测试框架在OP-TEE 3.16.0或更高版本上仍然可以像这里描述的那样工作,前提是:(a)使用从分支optee-3.15.0构建的Linux内核,或者(b)benchmark kernel patch 被前向移植。
如果内核补丁缺失,打印如下错误:

二、Benchmark框架
由于其性质,OP-TEE是一个跨越多个体系结构层的解决方案,其中每个层都包含自己的复杂部分。为了进一步优化性能,需要一种工具来为每一层提供详细和精确的分析信息。
需要接收以下情况的延迟(latency)值:
从非安全世界下的client应用程序到可信应用程序再返回的往返时间。浏览每一层所需时间的详细信息,并原路返回:
-
libTEEC -> Linux OP-TEE kernel driver
-
Linux OP-TEE kernel driver -> OP-TEE OS Core
-
OP-TEE OS Core -> TA entry point (not supported yet)
三、Benchmark实现细节
1、设计概况
Benchmark框架由以下组件组成:
1)Benchmark Client Application (CA):一个专用的客户端应用程序,它负责分配时间戳循环缓冲区,在Benchmark PTA中注册这些缓冲区,并使用所有OP-TEE层生成的所有时间戳数据。最后,将时间戳数据放入扩展名为.ts的适当文件中。更多的构建细节可以在optee_benchmark上找到。
2)Benchmark Pseudo Trusted Application (PTA):它拥有共享内存中的所有每个cpu循环非安全缓冲区。必须(由CA)调用Benchmark PTA来注册时间戳循环缓冲区。然后,Benchmark PTA调用OP-TEE Linux驱动程序(通过一些RPC方法)在Linux内核层中注册这个循环缓冲区。
3)libTEEC and Linux kernel OP-TEE driver:包括处理来自Benchmark PTA的时间戳缓冲区注册请求的功能。
当启用Benchmark测试时,所有OP-TEE层(libTEEC、Linux内核OP-TEE驱动程序、OP-TEE操作系统核心)在分配/注册循环缓冲区的条件下,都会用所有调用请求的时间戳数据填充已注册的时间戳循环缓冲区。

2、时间戳源
Arm性能监视器单元被用作时间戳值的主要来源。之所以选择这种技术,是因为它支持所有Armv7-A/Armv8-A核。除了它可以提供精确的cpu周期计数器值之外,还可以启用EL0访问所有事件,因此用户模式应用程序可以直接从协处理器寄存器读取cpu计数器值,通过避免对EL1内核进行额外的系统调用来实现最小的延迟。
除了CPU周期计数器值,时间戳本身还包含以下信息:
1)执行CPU核心索引
2)OP-TEE层id,该时间戳是从哪里获得的
3)记录时间戳时的程序计数器值,可用于获取符号名称(文件名和行号)。
3、调用时序图

4、添加自定义时间戳
目前,时间戳只针对InvokeCommand调用,但也可以在受支持的OP-TEE层中选择自定义位置。在自定义的c源文件中添加时间戳存储命令:
1)包含适当的头文件
-
OP-TEE OS Core:
bench.h -
Linux kernel OP-TEE module:
optee_bench.h -
libTEEC:
teec_benchmark.h
2)在您想要放置时间戳的地方的函数中调用bm_timestamp()(对于linux kmod使用optee_bm_timestamp())。
5、构建并运行Benchmark
请参阅optee_benchmark提供的说明。
6、限制和进一步措施
应用程序的实现,该应用程序将分析时间戳数据,并为提供avg/min/max值(CPU周期和时间值)的不同类型的调用提供统计数据。
添加对支持OP-TEE的所有平台的支持。
增加对S-EL0时间戳的支持。
为每个时间戳附加额外的有效负载信息,例如,会话。
在OP-TEE操作系统核心中断上下文中的时间戳。