安全之安全(security²)博客目录导读
OPTEE调试技术汇总
目录
一、序言
二、Ftrace配置
三、Ftrace使用
四、Ftrace典型输出
一、序言
本节描述如何使用ftrace为TA生成函数调用图。该名称来自具有类似目的的Linux框架,但是OP-TEE ftrace非常具体。
调用图记录了对函数的所有调用,并包含计时信息。因此,对于排除性能问题或优化代码来说,它是一个很有价值的工具。
二、Ftrace配置
配置选项CFG_FTRACE_SUPPORT=y使OP-TEE能够从在用户模式下运行并使用-pg编译的TA收集函数信息。收集后,函数调用数据通过RPC发送到tee-supplicant,因此它们可以保存到磁盘,稍后使用辅助脚本(可在optee_os/scripts中找到的ftrace_format.py和symbolize.py)进行处理和显示。有关symbolize.py的使用可参考OPTEE异常调用栈解析。
除了CFG_FTRACE_SUPPORT=y之外,另一个配置选项CFG_SYSCALL_FTRACE=y允许OP-TEE在内核模式下代表TA运行时收集系统调用的函数信息。请注意,少数内核函数无法跟踪;它们在源代码中有__noprof属性。
第三个配置选项CFG_ULIBS_MCOUNT=y可以跟踪optee_os中包含的用户空间库以及ta使用的用户空间库(例如libutee和libutils)。
三、Ftrace使用
使用CFG_FTRACE_SUPPORT=y构建OP-TEE OS,有选择性地配置CFG_ULIBS_MCOUNT=y和CFG_SYSCALL_FTRACE=y。
使用-pg构建用户TA,例如,启用CFG_TA_MCOUNT=y来检测整个TA。此外,如果用户希望为特定文件设置-pg,则应在相应的子.mk中执行以下操作:cflags-<file-name>-y+=-pg。注意,instrumented ta有一个更大的.bss段。内存开销取决于CFG_FTRACE_BUF_SIZE宏,该宏可以使用config: CFG_FTRACE_BUF_SIZE=4096(默认值:2048,详细信息请参阅TA链接器脚本:TA /arch/$(arch)/ TA .ld. s)对用户TAs进行配置。
正常运行应用程序。当当前会话退出或TA执行过程中有任何中止时,tee- supplant将把函数数据写入/tmp/ftrace-<ta_uuid>.out。如果文件已经存在,则附加一个数字,例如:ftrace-<ta_uuid>.1.out。
运行名为ftrace_format.py的辅助脚本将函数二进制数据转换为人类可读的文本,并运行symbolize.py将函数地址转换为函数名:
cat ftrace-<ta_uuid>.out | optee_os/scripts/ftrace_format.py | optee_os/scripts/symbolize.py -d <ta_uuid>.elf -d tee.elf
有关QEMU的完整使用示例,请参阅commit 5c2c0fb31efb。
四、Ftrace典型输出
持续时间(函数的执行时间)显示在函数的右括号行上,如果函数是叶(leaf )函数,则显示在同一行上。换句话说,只要检测函数返回,就会显示持续时间。它包括执行函数及其任何调用者所花费的时间。计数器物理计数寄存器(CNTPCT)和计数器频率寄存器(CNTFRQ)用于计算持续时间。服务外部中断所花费的时间被减去。
第二列是当前函数的堆栈深度。它有助于直观地匹配函数入口和退出。
参考:Ftrace (function tracing) — OP-TEE documentation documentation