基于TrustZone的安全应用性能优化*
2021-01-05杨保绚张利军
杨保绚,董 攀,张利军,丁 滟
(1.国防科技大学计算机学院,湖南 长沙 410073;2.中国人民解放军32228部队24分队,福建 福州 350101)
1 引言
随着信息技术的快速发展,智能设备已经广泛应用在军事、工农业和生产生活的方方面面,几乎无处不在,改变着人们的生产生活方式[1]。以物联网(IoT)设备为例,根据国际数据公司IDC(International Data Corporation)的最新预测估计,到2025年,将有416亿台联网的IoT设备,产生79.4 ZB的数据[2]。然而伴随智能设备的快速发展,安全性受到广泛重视,如何在不利的环境中,保护敏感数据及其处理过程成为研究重点。作为ARM平台上的可信执行环境TEE(Trusted Execution Environment)扩展支持,TrustZone技术将软硬件资源划分为安全世界和非安全世界(即TEE和REE(Rich Execution Environment)),安全世界为应用程序提供了可信执行环境,通常用于存储、处理用户敏感信息和提供安全服务,2个世界之间通过硬件方式实现隔离,保证了安全世界中运行程序的安全性。TrustZone技术[3]已广泛应用于各种智能设备的安全防护,例如数据加解密、指纹登录、DRM版权和电子支付等等,目前国产处理器如飞腾和华为鲲鹏等都集成了TrustZone技术。TrustZone的软件开发一般符合GlobalPlatform[4]组织所制定的TEE标准规范,应用程序划分为TA和CA 2部分,其中TA运行在安全世界,包含敏感的数据存储和运行过程等内容,而CA运行在普通世界,通过调用相关接口请求TA程序。为了实现两者之间的消息和数据传递,如图1所示,一般采用数据链路和消息链路2条途径。消息链路是通过两者世界切换来实现消息传递,数据链路借助TEE可访问REE内存的特点,通过共享REE部分内存来传递数据。数据链路通过消息链路世界切换进行消息通知。
Figure 1 TrustZone application example图1 TrustZone应用程序示例
较之前单操作系统程序的运行过程,基于TrustZone技术的应用程序结构发生了变化,代码进行了划分,增加了2个世界间的通信过程。本文基于TrustZone的安全应用运行过程详细分析,将性能提升的问题定位到以下4个方面:(1)世界切换导致性能降低。在通信过程中消息链路是依靠世界切换完成,世界切换需要经历复杂的状态保存和恢复过程,频繁、冗余的世界切换必然导致程序运行性能的降低。(2)中断处理方式对程序性能的影响。现代计算机设计是多用途多任务的,CPU在TEE执行TA程序时,响应其他应用程序的中断会经历状态保存、世界切换和等待中断执行等过程,导致程序效率降低;而屏蔽外部中断,其他应用程序将面临CPU长时等待而出现“饿死”的情况。(3)注册销毁共享内存对程序的影响。数据链路依靠共享内存完成数据交换,对于需多次重复调用执行TA服务的应用程序,重复地注册和销毁共享内存,会引起额外的通信开销,造成运行性能降低。而单次或临时调用执行TA服务的应用程序,不应该长时间占用内存资源,否则会造成其他应用程序无资源可用。(4)数据内存拷贝对程序性能的影响。传递数据时,CA程序将原始数据读取到CA数据区,在调用执行TA时,将所需数据拷贝进共享内存,之后将共享内存数据拷贝进TA数据区。整个过程中面临多次数据内存拷贝的情况,降低了程序性能。
基于以上问题分析,本文认为TrustZone 的安全应用运行过程应符合以下原则:(1)尽可能减少世界切换次数;(2)充分考虑中断处理方式对程序运行的影响;(3)合理分配共享内存;(4)减少数据的内存拷贝次数。因此,本文提出以下TrustZone的安全应用性能优化改进方法:(1)合理配置参数,尽可能地减少不必要的调用和冗余执行;(2)配置灵活的中断处理方式,充分考虑不同应用程序执行过程的需求,在TA执行过程中分别提供屏蔽和不屏蔽中断请求2种中断处理方式;(3)优化共享内存分配方式,提供“一次一用”和“一次多用”内存分配方式;(4)减少内存拷贝,改用指针进行数据传递。
为了验证问题分析和优化方向的正确性,本文借助于TrustZone技术的开源项目OP-TEE,搭建典型的安全应用程序,在实际开发板中对应用程序调用过程分段进行测试,分别提出4个优化方向并进行测试。定量分析了世界切换、中断、共享内存分配和数据拷贝对整个程序运行过程的影响。实验表明:(1)世界切换会影响程序执行效率,如果参数设置不合理,世界切换阶段消耗的CPU周期数最大占整个执行过程的49%,严重影响了程序执行效率。通过合理设置参数,减少世界切换、不必要过程调用和冗余执行,最大可以实现31%的性能提升。(2)响应外部中断,会造成程序执行过程的不确定性,将会导致性能降低60%。屏蔽外部中断,最大可以实现4.5%的性能提升。(3)注册和销毁共享内存包含内存分配与回收,以及内存数据的拷贝,在没有内存复用的情况下,注册、销毁共享内存阶段消耗的CPU周期数最大占整个执行过程的27%,制约了程序性能提升。对于大计算量服务,内存复用最大可以实现37%的性能提升。(4)减少内存数据拷贝最大可以实现39%的性能提升。因此,本文的主要贡献包括以下方面:
(1) 对基于TrustZone技术的应用程序调用过程进行了深入分析,将制约程序性能提升的问题定位到世界切换方式、中断、共享内存管理和数据内存拷贝4个方面。
(2) 针对问题分析,分别从合理配置参数、配置灵活的中断处理方式、优化共享内存分配方式和减少内存拷贝4个方面提出TrustZone应用程序性能优化改进方向。
(3) 在实际开发板上实现调用过程和优化改进,定量验证了问题分析和优化改进方向的正确性。
2 相关研究工作
2.1 TEE系统的发展
TEE是一个与主机操作系统相互安全隔离的可信执行环境,在此环境中,安全敏感的应用程序可以与主机操作系统隔离地执行。鉴于主机系统和受信任的执行环境可能由不同制造商开发,为了实现相互操作,制造商已经在推进TEE标准化工作。在2009年,开放移动终端平台OMTP(Open Mobile Terminal Platform)为此迈出了第一步,它规定了TEE标准,该标准定义了与TEE应该支持的功能相关的一系列安全要求[5]。GlobalPlatform组织通过定义标准API使TEE标准更加全面细致:定义了受信任的应用程序可以依赖的内部API(例如TEE内部API),以及主机操作系统软件可以用来与由其维护的TEE应用程序进行交互的通信接口。
典型的基于TrustZone技术的TEE内核系统主要有3种类型:(1)专有且封闭源代码可信的内核。三星Knox[6]是此类系统中最具代表性的项目。Knox是一个国防级移动安全平台,旨在为企业数据保护提供有力的保障。(2)小型可信内核系统。包括OP-TEE(Open Portable Trusted Execution Environment)[7,8]、TLK(Trusted Little Kernel)[9]和Open-TEE(Open virtual Trusted Execution Environment)[10]等小型TEE运行时系统。除了TLK之外,这些系统的优点是可以作为开放源代码项目公开提供给研究团体使用。(3)其他非常规可信内核。相比于前两类都只能在安全世界中构建可执行环境,而TrustICE[11]技术可以支持在正常世界中创建隔离计算环境ICE(Isolated Computing Environments)。其中OP-TEE完整地实现了一个可信执行环境,符合GlobalPlatform标准。项目包括下列几个组件:安全世界操作系统(OP-TEE OS)、安全世界客户端(OP-TEE client)、完整的构建工具链、测试工具和其他工具。
2.2 系统性能优化研究
具体的TrustZone应用程序性能优化的相关研究不太多,下面以虚拟机和双操作系统性能优化为参考:
(1)虚拟机系统性能优化研究。XenSocket[12]在2个VM(Virtual Machine)之间提供了基于共享内存的单向共存通道,该通道是为大型分布式流处理系统中的应用程序设计的,并通过绕过TCP/IP网络协议栈进行本地通信来提高性能。XenLoop[13]为基于Xen内存共享工具的共存VM提供了快速的VM间共享内存通道,从而以较少的特权域干预即可进行VM间的网络通信。Pinto等人[14]提出了通过在KVM中共享主机-客户内存来实现零拷贝共享内存机制。LTZVisor(Lightweight TrustZone-assisted hypervisor)[15]是一种轻量级的TrustZone辅助虚拟机管理程序,通过该管理程序,可以实现虚拟机间通信和管理。
(2)双操作系统性能优化研究。Sangorrín等人[16]针对实时双操作系统存在的不必要的数据拷贝和上下文切换问题,提出了一种新的双OS通信方法,该方法在不影响实时操作系统可靠性的情况下,通过减少不必要的通信开销来提升系统性能。TZDKS(TrustZone-based Dual-Kernel System)[17]提出了基于TrustZone的双系统隔离方案,在任务切换、内存访问、中断处理和设备访问等方面兼顾安全性的同时提升了效率。在RTRG-RPC(Real-Time RTOS-GPOS Remote Procedure Call)[18]中建立了一种可预测时间且安全的RPC(Remote Procedure Call)机制。在详细分析实时双操作系统RPC每个阶段的时间延迟的基础上,通过软件生成中断消息转换、中断处理程序RPC服务和优先级交换等方法,实现了实时通信过程。
3 现有TrustZone安全应用性能影响问题分析
根据GlobalPlatform组织所制定的TEE标准规范,基于TrustZone技术的应用程序划分为TA和CA 2部分。应用程序之间一般通过数据链路和消息链路2条途径进行消息和数据传递,其中数据链路通过注册共享内存传递数据,消息链路通过世界切换传递消息。如图2所示,程序之间会经历如下调用过程:首先CA与TA建立连接,CA调用注册共享内存接口,由TEE内核分配共享内存;之后CA将数据传递给共享内存,并调用执行命令接口,TA收到调用请求并执行,执行结束后将结果保存至共享内存并返回CA;最终销毁共享内存,销毁连接,完成一次调用。而CA和TA之间建立和销毁连接是调用执行必不可少的步骤,对于调用执行影响不大,因此本文重点考虑在两者之间建立连接后,CA调用执行TA服务对程序性能的影响。同时考虑到OP-TEE是基于TrustZone技术的开源项目,也遵循GlobalPlatform标准,CA和TA之间调用过程也符合上述规范,具有TrustZone技术通信过程的普遍代表性,因此本文使用OP-TEE作为TrustZone安全服务调用过程分析对象。
Figure 2 Service request process from CA to TA图2 CA调用执行TA过程
在程序执行过程中,对CA调用执行TA过程进行数学建模,考虑到程序执行过程中需要经历多次TA调用过程,调用次数跟传递数据和注册分配的共享内存大小有关,记Mg是注册分配的共享内存大小,M是需要传递的数据大小,n是程序执行过程中CA调用执行TA的次数。三者之间满足:
(1)
对具体调用过程进行分解,在调用命令前需要分别为输入和输出数据注册共享内存和数据拷贝,会经历世界切换和数据拷贝,记tq为执行世界切换时间,tc为数据拷贝时间,2次注册共享内存和数据拷贝过程执行时间分别为Ts1和Ts2,则有:
Ts1=tq1+tc1
(2)
Ts2=tq2+tc2
(3)
注册共享内存并完成数据拷贝后,CA调用执行TA程序,会经历世界切换、执行外部中断和执行TA程序。记CA调用执行TA程序时间为Tc。在TA执行外部中断的时间记为ti,TA具体执行时间记为ta,则有:
Tc=tq3+ti+ta
(4)
CA调用执行TA程序后,需要数据拷贝并销毁共享内存,记Tx1和Tx2分别是第1、2次销毁共享内存执行时间。则有:
Tx1=tq4+tc3
(5)
Tx2=tq5+tc4
(6)
因此,程序调用执行TA总时延T满足:
T=n*(Ts1+Ts2+Tc+Tx1+Tx2)
(7)
从上述分析中可以看出,为了保证程序执行过程的安全性,与程序在单操作系统中的运行过程相比,基于TrustZone技术的应用程序额外增加了注册和销毁共享内存、数据拷贝、中断执行和世界切换等额外过程,从公式上看,为了提高服务调用的性能,需要尽可能地保证ta的执行时间,减少Ts1、Ts2、Tx1、Tx2、tq和ti等非TA执行时间,也要降低调用TA的执行次数n,减少世界切换次数。
具体分析得出影响效率提高的因素有以下几个方面:
(1)普通世界和安全世界切换带来的性能降低。
根据对通信过程的分析,消息链路贯穿于注册和销毁共享内存、调用执行TA和执行中断响应等全过程,而消息链路依靠世界切换来完成。在CA调用执行TA时会经历如下过程:REE用户态CA程序调用REE端TEE命令接口,进入REE内核态,REE内核态调用SMC(Secure Monitor Call)进入Monitor模式,Monitor模式保存当前REE状态和运行程序状态,加载TEE状态,进入TEE内核态。TEE内核态分配线程,加载线程,线程转入TEE用户态,TEE用户态执行TA程序。
因此,世界切换会经历复杂的状态保存和加载过程,尤其对于多次调用执行TA的程序则面临多次世界切换,是程序性能提升不可忽略的影响因素。
(2)中断对程序的影响
在TrustZone技术中,建议配置FIQ(Fast Interrupt reQuest)由安全世界进行响应,IRQ(Interrupt ReQuest)由普通世界进行响应,在OP-TEE中,采用了此方式。在TEE执行TA程序时,收到来自REE的IRQ中断请求后会经历如下执行过程:首先保存当前运行TA程序的状态,之后保存当前TEE状态,调用SMC命令,加载REE状态,引起世界的切换;之后在REE中由REE中断处理程序响应中断请求,执行完后,返回至TEE,加载之前运行的程序状态继续执行。因此,在执行TA程序过程中响应中断请求,会引起额外的世界切换、状态保存恢复和执行中断程序,TA程序无法有效利用CPU资源,造成干扰,增加了服务执行时间的不确定性。
但与此同时,为了安全性的考虑,在TEE执行TA程序时,只是在当前CPU核执行,不允许核间调度。而当前CPU执行都是面向多进程多任务的,在执行过程中如果屏蔽来自REE的中断请求,对于大计算量服务,长时间占用CPU资源,执行TA程序,也会面临REE程序长时间等待而“饿死”的情况。因此,应该合理配置中断响应方式,满足多种程序需求。
(3)注册销毁共享内存对程序的影响。
出于安全性的考虑,在TrustZone中TEE可以访问REE中的资源,而REE不能访问TEE中的资源。注册和销毁共享内存都是CA在调用REE中的相应接口,在TEE中的执行分配和回收,注册和销毁共享内存会引起世界切换。尤其对于需要频繁多次调用TEE服务的应用程序,多次频繁注册和销毁共享内存,势必引起较多冗余的世界切换等过程,造成程序性能的下降,可以通过共享内存复用,减少冗余的注册和销毁共享内存调用次数,有效缓解该问题。
但也应该考虑,对于只需临时调用执行TA服务,和较长时间范围内单次调用执行TA服务的应用程序,如果内存复用,该程序长时间占用共享内存资源,会造成其他程序无法得到有效资源。因此,需要结合程序调用过程的需求,采用灵活的共享内存分配策略。
(4)数据交换带来的性能开销。
2个世界之间的数据交换依靠数据链路完成,而数据链路是以共享内存为载体。以CA向TA传递数据为例,会经历以下过程:从REE系统中读取原始数据至CA程序数据区;在CA调用执行TA时,会将原始数据从CA程序数据区拷贝到共享内存,之后通过Monitor模式切换到TEE,调用执行TA程序,TA执行完毕后又会将结果数据拷贝到共享内存,再通过Monitor模式切换回REE继续执行CA程序,最后CA程序将从共享内存中拷贝将结果数据至CA程序数据区,完成整个数据的传递。
传递数据过程中会面临多次数据拷贝,内存数据拷贝的过程必然带来额外的程序开销,且拷贝数据量越大程序开销越多,程序执行效率越低。
4 TrustZone安全应用性能优化设计
针对上述问题分析,本文认为基于TrustZone 应用程序调用过程应符合4点原则:(1)尽可能减少世界切换次数;(2)充分考虑中断处理方式对程序运行的影响;(3)合理分配共享内存;(4)减少数据的内存拷贝次数。根据上述原则,本文提出基于TrustZone应用程序性能优化方法,分别是:通过合理配置参数,减少不必要的过程调用;配置灵活的中断处理方式;优化共享内存分配方式;减少内存拷贝。
4.1 合理配置参数,减少不必要的过程调用
参数设置不合理,将引入不必要的状态切换,或冗余过程调用和执行,给程序性能带来影响。在参数配置时,应尽可能减少调用次数,从式(1)表示的程序调用执行TA的次数看,主要从以下3方面减少调用次数:(1)增加Mg的值,在需要传递的数据相同的情况下,申请共享内存的大少增加,数据传递容量提高,则会相应地减少调用次数。(2)应申请与加密数据量等量的共享内存,或是所需数据大小整数倍的共享内存。即:
M=n*Mg
(8)
这样一方面减少了共享内存空间的浪费,另一方面也减少了执行冗余过程的时间。(3)尽可能减少其他环节调用次数,可以考虑在注册和销毁共享内存时,只进行一次注册和销毁,则式(7)中总时延中CA调用执行TA的时间Tc不变,2次注册共享内存时间Ts1和Ts2变成1次注册共享内存时间Ts,2次销毁共享内存时间Tx1和Tx2,变成1次销毁共享内存时间Tx,减少了调用执行次数,提升了程序执行效率,即总执行时间为:
T=n*(Ts+Tc+Tx)
(9)
4.2 配置灵活的中断处理方式
通过问题分析,响应中断请求给程序带来性能降低和执行过程的不确定性,而执行TA时屏蔽中断也面临在REE中其他应用程序面临过长等待而“饿死”的情况。本文采用灵活的处理方式来应对不同应用程序需求。具体包括如下2种中断响应执行方式:
执行方式1:CPU在进入TEE系统并加载安全应用程序TA线程之前屏蔽来自REE的中断请求,在开始执行安全应用程序TA后打开来自REE系统的中断请求。对于来自REE系统的中断请求,CPU暂停执行安全应用程序TA,将运行该安全应用程序TA的线程状态和TEE系统状态进行保存,切换到REE系统执行中断请求的响应,且在执行完毕后,重新恢复TEE系统状态,加载保存的安全应用程序TA线程继续运行安全应用程序TA,待所有安全应用程序TA执行完毕后,切换至REE系统,返回执行用户态下的普通应用程序CA。这种方式对于TA执行过程没有优化,但对于长时间执行,优先级不高的TA程序,执行过程中考虑了REE端应用程序的CPU需求,避免了发生REE程序“饿死”的情况。
执行方式2:CPU在调用安全应用程序TA的整个过程中,屏蔽来自REE的中断请求,直至TA执行完毕后,切换至REE系统,返回执行用户态下的普通应用程序CA,普通应用程序CA从共享内存中读取安全应用程序TA返回的执行结果。即在TA执行过程中去掉响应中断的时间,提高了程序执行效率。该执行方式比较适用短时间执行、高优先级的TA程序,如式(10)所示:
Tc=tq3+ta
(10)
4.3 优化共享内存分配方式
通过上述问题分析,频繁调用TA的应用程序,共享内存分配和销毁面临重复冗余的世界切换和数据拷贝等问题,而不频繁调用TA的应用程序,又不希望长时间占用共享内存资源,因此可以使用2种共享内存分配、回收方式,即一次一用和一次多用。
一次一用是在普通应用程序CA调用安全应用程序TA服务时,不提前分配共享内存,由系统按照程序需求注册分配共享内存,在执行完安全应用程序TA后,系统自动将结果数据从共享内存中拷贝到普通应用程序CA数据区中,之后自动销毁该共享内存。这种方式减少了普通应用程序CA的代码量,用户不需要过多关注共享内存的分配和回收,避免了长时间占用共享内存资源的情况,对于不需要多次调用安全应用程序TA的情况比较有效。
一次多用方式是在调用安全应用程序TA之前,用户根据安全应用程序TA需要,提前注册共享内存,在执行完安全应用程序TA后,用户自行选择是否销毁该共享内存。这种方式减少了调用多次安全应用程序TA中重复注册分配和销毁共享内存的情况,也减少了共享内存中数据多次拷贝的情况,尤其适合在一个普通应用程序CA中,需要多次重复调用安全应用程序TA和大数据量处理的情况。一次多用内存分配使2次调用之间存在信息泄露的可能,因此会导致安全性降低。为了保证共享内存中数据的安全性,在共享内存分配和回收的整个过程中,增加了锁机制,在销毁该共享内存前,为调用TEE和访问共享内存上锁,使得其他程序无法调用TEE程序,也无法访问该共享内存,保证了数据的私密性和安全性。由式(11)可以说明:
T=Ts+n*Tc+Tx
(11)
4.4 减少内存拷贝
通过问题分析,数据通过共享内存相互传递时,面临多次数据拷贝的情况。通过改进调用过程,将数据传递改为指针传递来提升程序性能。具体来说,在CA注册分配共享内存后,将原始数据直接读取到共享内存,在调用执行TA传递参数时,只传递共享内存中数据块的指针,在TEE中执行加密过程时,直接从共享内存中读取数据,加密后也将结果数据直接放入共享内存中,减少了内存数据拷贝次数,提升了程序执行效率,即将tc1、tc2、tc3和tc4改为一次tc。
5 实验验证
实验环境:使用Hikey960开发板,4核Cortex A73 加 4核Cortex A53处理器,4 GB内存,Linux内核为4.13.0版本,OP-TEE为3.3.0版本,配置REE和TEE共享内存大小为2 MB。主机使用Ubuntu16.04系统,对测试过程进行记录和整理。测试是在实际Hikey960开发板中烧录OP-TEE开源项目,考虑到基于TrustZone的应用程序很多,例如身份验证、电子支付等,但运行机制大致相同,本次针对的问题是TrustZone应用程序调用过程的优化,选取其中一种应用程序即可说明问题,同时AES加密程序方便控制数据量大小,因此本文在OP-TEE中实现了AES加密程序,通过对AES加密程序中CA调用TA执行加密过程中消耗CPU周期数进行测试,验证问题分析的正确性和改进方法的有效性。AES加密过程用C语言编写,程序共分为TA和CA 2部分,其中TA在TEE中运行,为实际加密过程,CA在REE中运行,包含对TA的调用接口。借助CPU性能监控单元PMU(Performance Monitor Unit)对AES调用执行过程中消耗的CPU周期数进行详细测试,为了对调用过程进行准确的对比分析,将实验配置为2组:
实验1分别设置从1 KB~1 MB,步进为10 KB的共享内存大小,TA程序对分配的整个共享内存进行加密,按上述运行过程分段测试CPU运行周期数,目的是通过测试在不同共享内存大小情况下,加密过程中各个阶段所消耗的CPU周期数,了解调用过程的性能瓶颈。
实验2分别设置从1 KB~1 MB,步进为10 KB的共享内存大小,统一加密2 012 KB的数据,则设置最大1 MB的共享内存,也需要调用执行2次加密过程,通过测试总的执行加密过程的时间,了解设置不同共享内存大小对加密过程的影响。
每组实验每个参数下执行20次,取总CPU执行周期数最小值为有效值。
5.1 参数设置对加密过程的影响
参数配置主要指分配的共享内存大小,因为共享内存大小直接关系到程序调用次数。参数设置不合理会引起过多世界切换和其他冗余执行过程,对程序性能产生较大影响。
通过实验1的分段测试,了解一次调用过程中REE用户态调用REE端TEE命令接口到TEE用户态执行加密过程、加密结束后返回至REE用户态和整个加密过程所消耗CPU周期数及其占总执行过程的比重。从图3中可以看出,从REE用户态切换至TEE用户态所消耗的CPU周期数约为50 000~90 000,从TEE用户态切换至REE用户态所消耗CPU的周期数约为16 000~40 000,且两者随着分配共享内存大小不同,呈现缓慢上升趋势。而图4说明,在分配不同共享内存大小时,对分配的共享内存进行加密,在开头设置共享内存1 KB情况下,REE用户态向TEE用户态切换所消耗的CPU周期数占整个加密执行过程的35%,TEE用户态向REE用户态切换所消耗的CPU周期数占整个加密执行过程的14%,之后两者比重都呈现指数式下降,最后比重越来越小。因此可以看出,世界切换消耗较多CPU周期数,在整个执行过程占据较大比重,尤其在共享内存设置较小,需要频繁进行世界切换情况下,对程序影响较大。
Figure 3 CPU cycles consumed in world switchs under different shared memory sizes图3 不同共享内存大小下世界切换消耗CPU周期数
Figure 4 World switch time ratio to the total execution time under different shared memory sizes图4 不同共享内存大小下世界切换占总执行时间百分比
通过实验2,测试在不同共享内存设置下,加密固定数据量,参数设置对总的执行过程的影响。从图5中可以看出,随共享内存大小设置不同,总的消耗CPU周期数存在波动。以典型的标记的位置为例进行说明,对于加密2 012 KB数据,当设置共享内存大小为1 001 KB时,需要调用执行3次加密过程,而设置1 011 KB时,则只需要调用执行2次加密过程。后者因为减少了调用执行次数,性能提高了31%。
Figure 5 CPU cycles consumed in 2 012 KB data encrypting operation under different shared memory sizes图5 不同共享内存大小下加密2 012 KB数据消耗的CPU周期数
因此,合理设置参数可以减少不必要的世界切换和其他冗余执行过程,是提升程序执行效率的有效途径。
5.2 中断配置对加密过程的影响
从实验中发现,在分配不同共享内存大小情况下,执行外部中断显著增加了程序运行时间,造成程序调用过程消耗CPU周期数波动性较大,因此响应中断会给程序执行带来不确定性。本文选取并比较其中具有代表性的共享内存为21 KB时,对20次调用执行加密过程进行分析
从图6中可以看出,在20次调用执行过程中,除第3次调用执行外,其他19次调用过程消耗的CPU周期数都在一个较小范围内波动,而第3次执行CPU的周期数明显较多,相比其他19次调用过程消耗的CPU周期数增加了60%以上,这是因为这次执行过程中,REE中程序触发中断请求,导致程序返回REE时执行中断响应,消耗了更多CPU周期数。可以看出,中断响应对程序执行造成很大不确定性,会出现响应中断时间占据较大执行时间的情况,对调用执行过程有较大影响。
通过实验2对屏蔽中断后的程序加密2 012 KB数据进行了测试,分别测试全程屏蔽中断和在TA正常执行后不屏蔽中断2种情形。从图7中可以看出,屏蔽中断可以带来2%~4.5%的性能提升,在加密数据量变大时,屏蔽中断带来的性能提升维持在2.4%左右。
Figure 6 CPU cycles consumed in data encrypting operation under 21 KB shared memory size 图6 共享内存为21 KB时加密过程消耗的CPU周期数
Figure 7 Performance improvement by interrupt mask under different shared memory sizes图7 不同共享内存大小下屏蔽中断带来的性能提升
5.3 共享内存分配方式对执行过程的影响
从图8中可以看出,注册和销毁共享内存所消耗的CPU周期数随共享内存大小增长而快速增长,从刚开始的400左右增长至100 000左右。而从图9中可以看出,注册和销毁共享内存所占整个执行过程的比重从初期的27%指数式下降至9%左右,之后稳定在9%左右。
Figure 8 CPU cycles consumed by registering and destroying under different shared memory sizes图8 不同共享内存大小下注册、销毁共享内存消耗的CPU周期数
通过分析可以得出,注册和销毁共享内存一方面增加了世界切换次数,另一方面增加了数据内存拷贝,在整个执行过程中占有较大比重。对于需要重复执行注册和销毁共享内存的应用程序,则面临更大性能冗余考验。
Figure 9 Registering and destroying time ratio to the total execution time under different shared memory sizes图9 不同共享内存大小下注册、销毁共享内存占总执行时间百分比
通过实验2测试了复用共享内存对程序性能的影响。从图10中可以看出,对于加密2 012 KB数据,复用共享内存调用次数较多,共享内存设置为1 KB的情况下,性能提升比较明显,达到37%,之后也能维持在6%左右。
Figure 10 Performance improvement by reusing under different shared memory sizes图10 不同共享内存大小下内存复用带来的性能提升
5.4 内存拷贝对执行过程的影响
注册和销毁共享内存过程中面临冗余的内存数据拷贝问题,通过实验2对减少内存拷贝进行了性能测试。从图11可知,在分配不同共享内存大小时,加密2 012 KB数据,减少了内存拷贝次数,共享内存设置为1 KB时,性能提升比较明显,达到39%,之后也可以维持在8%左右。因此,减少内存拷贝是提升性能的有效途径之一。
Figure 11 Performance improvement by reducing memory copy under different shared memory sizes图11 不同共享内存大小下减少内存拷贝带来的性能提升
6 结束语
TrustZone技术是一种广泛使用的技术,可为智能设备提供受信任的执行环境。而受信任的执行环境为应用程序的安全性提供了保证,但同时也带来了性能降低的负面影响。本文通过对程序调用执行过程的详细分析,将执行过程中影响程序执行性能的关注点聚焦到世界切换、中断响应、注册销毁共享内存和数据拷贝4个方面。基于相关的问题的分析,有针对性地提出了程序效率提升方法,分别是合理配置参数、灵活配置中断处理方式、优化共享内存分配方式和减少内存数据拷贝。并在Hikey960实际开发板上搭建开源OP-TEE项目,创建了基于TrustZone技术的AES加密程序,利用CPU性能监控单元,对加密过程中所消耗的周期数进行精细测试,并对优化方法进行了实现和测试,定位到TrustZone安全服务调用过程中的性能瓶颈并验证了优化方法的有效性。后续会重点关注TrustZone技术通信过程中的安全性问题。