楊保絢,董 攀,張利軍,丁 滟
(1.國防科技大學計算機學院,湖南 長沙 410073;2.中國人民解放軍32228部隊24分隊,福建 福州 350101)
隨著信息技術(shù)的快速發(fā)展,智能設備已經(jīng)廣泛應用在軍事、工農(nóng)業(yè)和生產(chǎn)生活的方方面面,幾乎無處不在,改變著人們的生產(chǎn)生活方式[1]。以物聯(lián)網(wǎng)(IoT)設備為例,根據(jù)國際數(shù)據(jù)公司IDC(International Data Corporation)的最新預測估計,到2025年,將有416億臺聯(lián)網(wǎng)的IoT設備,產(chǎn)生79.4 ZB的數(shù)據(jù)[2]。然而伴隨智能設備的快速發(fā)展,安全性受到廣泛重視,如何在不利的環(huán)境中,保護敏感數(shù)據(jù)及其處理過程成為研究重點。作為ARM平臺上的可信執(zhí)行環(huán)境TEE(Trusted Execution Environment)擴展支持,TrustZone技術(shù)將軟硬件資源劃分為安全世界和非安全世界(即TEE和REE(Rich Execution Environment)),安全世界為應用程序提供了可信執(zhí)行環(huán)境,通常用于存儲、處理用戶敏感信息和提供安全服務,2個世界之間通過硬件方式實現(xiàn)隔離,保證了安全世界中運行程序的安全性。TrustZone技術(shù)[3]已廣泛應用于各種智能設備的安全防護,例如數(shù)據(jù)加解密、指紋登錄、DRM版權(quán)和電子支付等等,目前國產(chǎn)處理器如飛騰和華為鯤鵬等都集成了TrustZone技術(shù)。TrustZone的軟件開發(fā)一般符合GlobalPlatform[4]組織所制定的TEE標準規(guī)范,應用程序劃分為TA和CA 2部分,其中TA運行在安全世界,包含敏感的數(shù)據(jù)存儲和運行過程等內(nèi)容,而CA運行在普通世界,通過調(diào)用相關(guān)接口請求TA程序。為了實現(xiàn)兩者之間的消息和數(shù)據(jù)傳遞,如圖1所示,一般采用數(shù)據(jù)鏈路和消息鏈路2條途徑。消息鏈路是通過兩者世界切換來實現(xiàn)消息傳遞,數(shù)據(jù)鏈路借助TEE可訪問REE內(nèi)存的特點,通過共享REE部分內(nèi)存來傳遞數(shù)據(jù)。數(shù)據(jù)鏈路通過消息鏈路世界切換進行消息通知。
Figure 1 TrustZone application example圖1 TrustZone應用程序示例
較之前單操作系統(tǒng)程序的運行過程,基于TrustZone技術(shù)的應用程序結(jié)構(gòu)發(fā)生了變化,代碼進行了劃分,增加了2個世界間的通信過程。本文基于TrustZone的安全應用運行過程詳細分析,將性能提升的問題定位到以下4個方面:(1)世界切換導致性能降低。在通信過程中消息鏈路是依靠世界切換完成,世界切換需要經(jīng)歷復雜的狀態(tài)保存和恢復過程,頻繁、冗余的世界切換必然導致程序運行性能的降低。(2)中斷處理方式對程序性能的影響。現(xiàn)代計算機設計是多用途多任務的,CPU在TEE執(zhí)行TA程序時,響應其他應用程序的中斷會經(jīng)歷狀態(tài)保存、世界切換和等待中斷執(zhí)行等過程,導致程序效率降低;而屏蔽外部中斷,其他應用程序?qū)⒚媾RCPU長時等待而出現(xiàn)“餓死”的情況。(3)注冊銷毀共享內(nèi)存對程序的影響。數(shù)據(jù)鏈路依靠共享內(nèi)存完成數(shù)據(jù)交換,對于需多次重復調(diào)用執(zhí)行TA服務的應用程序,重復地注冊和銷毀共享內(nèi)存,會引起額外的通信開銷,造成運行性能降低。而單次或臨時調(diào)用執(zhí)行TA服務的應用程序,不應該長時間占用內(nèi)存資源,否則會造成其他應用程序無資源可用。(4)數(shù)據(jù)內(nèi)存拷貝對程序性能的影響。傳遞數(shù)據(jù)時,CA程序?qū)⒃紨?shù)據(jù)讀取到CA數(shù)據(jù)區(qū),在調(diào)用執(zhí)行TA時,將所需數(shù)據(jù)拷貝進共享內(nèi)存,之后將共享內(nèi)存數(shù)據(jù)拷貝進TA數(shù)據(jù)區(qū)。整個過程中面臨多次數(shù)據(jù)內(nèi)存拷貝的情況,降低了程序性能。
基于以上問題分析,本文認為TrustZone 的安全應用運行過程應符合以下原則:(1)盡可能減少世界切換次數(shù);(2)充分考慮中斷處理方式對程序運行的影響;(3)合理分配共享內(nèi)存;(4)減少數(shù)據(jù)的內(nèi)存拷貝次數(shù)。因此,本文提出以下TrustZone的安全應用性能優(yōu)化改進方法:(1)合理配置參數(shù),盡可能地減少不必要的調(diào)用和冗余執(zhí)行;(2)配置靈活的中斷處理方式,充分考慮不同應用程序執(zhí)行過程的需求,在TA執(zhí)行過程中分別提供屏蔽和不屏蔽中斷請求2種中斷處理方式;(3)優(yōu)化共享內(nèi)存分配方式,提供“一次一用”和“一次多用”內(nèi)存分配方式;(4)減少內(nèi)存拷貝,改用指針進行數(shù)據(jù)傳遞。
為了驗證問題分析和優(yōu)化方向的正確性,本文借助于TrustZone技術(shù)的開源項目OP-TEE,搭建典型的安全應用程序,在實際開發(fā)板中對應用程序調(diào)用過程分段進行測試,分別提出4個優(yōu)化方向并進行測試。定量分析了世界切換、中斷、共享內(nèi)存分配和數(shù)據(jù)拷貝對整個程序運行過程的影響。實驗表明:(1)世界切換會影響程序執(zhí)行效率,如果參數(shù)設置不合理,世界切換階段消耗的CPU周期數(shù)最大占整個執(zhí)行過程的49%,嚴重影響了程序執(zhí)行效率。通過合理設置參數(shù),減少世界切換、不必要過程調(diào)用和冗余執(zhí)行,最大可以實現(xiàn)31%的性能提升。(2)響應外部中斷,會造成程序執(zhí)行過程的不確定性,將會導致性能降低60%。屏蔽外部中斷,最大可以實現(xiàn)4.5%的性能提升。(3)注冊和銷毀共享內(nèi)存包含內(nèi)存分配與回收,以及內(nèi)存數(shù)據(jù)的拷貝,在沒有內(nèi)存復用的情況下,注冊、銷毀共享內(nèi)存階段消耗的CPU周期數(shù)最大占整個執(zhí)行過程的27%,制約了程序性能提升。對于大計算量服務,內(nèi)存復用最大可以實現(xiàn)37%的性能提升。(4)減少內(nèi)存數(shù)據(jù)拷貝最大可以實現(xiàn)39%的性能提升。因此,本文的主要貢獻包括以下方面:
(1) 對基于TrustZone技術(shù)的應用程序調(diào)用過程進行了深入分析,將制約程序性能提升的問題定位到世界切換方式、中斷、共享內(nèi)存管理和數(shù)據(jù)內(nèi)存拷貝4個方面。
(2) 針對問題分析,分別從合理配置參數(shù)、配置靈活的中斷處理方式、優(yōu)化共享內(nèi)存分配方式和減少內(nèi)存拷貝4個方面提出TrustZone應用程序性能優(yōu)化改進方向。
(3) 在實際開發(fā)板上實現(xiàn)調(diào)用過程和優(yōu)化改進,定量驗證了問題分析和優(yōu)化改進方向的正確性。
TEE是一個與主機操作系統(tǒng)相互安全隔離的可信執(zhí)行環(huán)境,在此環(huán)境中,安全敏感的應用程序可以與主機操作系統(tǒng)隔離地執(zhí)行。鑒于主機系統(tǒng)和受信任的執(zhí)行環(huán)境可能由不同制造商開發(fā),為了實現(xiàn)相互操作,制造商已經(jīng)在推進TEE標準化工作。在2009年,開放移動終端平臺OMTP(Open Mobile Terminal Platform)為此邁出了第一步,它規(guī)定了TEE標準,該標準定義了與TEE應該支持的功能相關(guān)的一系列安全要求[5]。GlobalPlatform組織通過定義標準API使TEE標準更加全面細致:定義了受信任的應用程序可以依賴的內(nèi)部API(例如TEE內(nèi)部API),以及主機操作系統(tǒng)軟件可以用來與由其維護的TEE應用程序進行交互的通信接口。
典型的基于TrustZone技術(shù)的TEE內(nèi)核系統(tǒng)主要有3種類型:(1)專有且封閉源代碼可信的內(nèi)核。三星Knox[6]是此類系統(tǒng)中最具代表性的項目。Knox是一個國防級移動安全平臺,旨在為企業(yè)數(shù)據(jù)保護提供有力的保障。(2)小型可信內(nèi)核系統(tǒng)。包括OP-TEE(Open Portable Trusted Execution Environment)[7,8]、TLK(Trusted Little Kernel)[9]和Open-TEE(Open virtual Trusted Execution Environment)[10]等小型TEE運行時系統(tǒng)。除了TLK之外,這些系統(tǒng)的優(yōu)點是可以作為開放源代碼項目公開提供給研究團體使用。(3)其他非常規(guī)可信內(nèi)核。相比于前兩類都只能在安全世界中構(gòu)建可執(zhí)行環(huán)境,而TrustICE[11]技術(shù)可以支持在正常世界中創(chuàng)建隔離計算環(huán)境ICE(Isolated Computing Environments)。其中OP-TEE完整地實現(xiàn)了一個可信執(zhí)行環(huán)境,符合GlobalPlatform標準。項目包括下列幾個組件:安全世界操作系統(tǒng)(OP-TEE OS)、安全世界客戶端(OP-TEE client)、完整的構(gòu)建工具鏈、測試工具和其他工具。
具體的TrustZone應用程序性能優(yōu)化的相關(guān)研究不太多,下面以虛擬機和雙操作系統(tǒng)性能優(yōu)化為參考:
(1)虛擬機系統(tǒng)性能優(yōu)化研究。XenSocket[12]在2個VM(Virtual Machine)之間提供了基于共享內(nèi)存的單向共存通道,該通道是為大型分布式流處理系統(tǒng)中的應用程序設計的,并通過繞過TCP/IP網(wǎng)絡協(xié)議棧進行本地通信來提高性能。XenLoop[13]為基于Xen內(nèi)存共享工具的共存VM提供了快速的VM間共享內(nèi)存通道,從而以較少的特權(quán)域干預即可進行VM間的網(wǎng)絡通信。Pinto等人[14]提出了通過在KVM中共享主機-客戶內(nèi)存來實現(xiàn)零拷貝共享內(nèi)存機制。LTZVisor(Lightweight TrustZone-assisted hypervisor)[15]是一種輕量級的TrustZone輔助虛擬機管理程序,通過該管理程序,可以實現(xiàn)虛擬機間通信和管理。
(2)雙操作系統(tǒng)性能優(yōu)化研究。Sangorrín等人[16]針對實時雙操作系統(tǒng)存在的不必要的數(shù)據(jù)拷貝和上下文切換問題,提出了一種新的雙OS通信方法,該方法在不影響實時操作系統(tǒng)可靠性的情況下,通過減少不必要的通信開銷來提升系統(tǒng)性能。TZDKS(TrustZone-based Dual-Kernel System)[17]提出了基于TrustZone的雙系統(tǒng)隔離方案,在任務切換、內(nèi)存訪問、中斷處理和設備訪問等方面兼顧安全性的同時提升了效率。在RTRG-RPC(Real-Time RTOS-GPOS Remote Procedure Call)[18]中建立了一種可預測時間且安全的RPC(Remote Procedure Call)機制。在詳細分析實時雙操作系統(tǒng)RPC每個階段的時間延遲的基礎上,通過軟件生成中斷消息轉(zhuǎn)換、中斷處理程序RPC服務和優(yōu)先級交換等方法,實現(xiàn)了實時通信過程。
根據(jù)GlobalPlatform組織所制定的TEE標準規(guī)范,基于TrustZone技術(shù)的應用程序劃分為TA和CA 2部分。應用程序之間一般通過數(shù)據(jù)鏈路和消息鏈路2條途徑進行消息和數(shù)據(jù)傳遞,其中數(shù)據(jù)鏈路通過注冊共享內(nèi)存?zhèn)鬟f數(shù)據(jù),消息鏈路通過世界切換傳遞消息。如圖2所示,程序之間會經(jīng)歷如下調(diào)用過程:首先CA與TA建立連接,CA調(diào)用注冊共享內(nèi)存接口,由TEE內(nèi)核分配共享內(nèi)存;之后CA將數(shù)據(jù)傳遞給共享內(nèi)存,并調(diào)用執(zhí)行命令接口,TA收到調(diào)用請求并執(zhí)行,執(zhí)行結(jié)束后將結(jié)果保存至共享內(nèi)存并返回CA;最終銷毀共享內(nèi)存,銷毀連接,完成一次調(diào)用。而CA和TA之間建立和銷毀連接是調(diào)用執(zhí)行必不可少的步驟,對于調(diào)用執(zhí)行影響不大,因此本文重點考慮在兩者之間建立連接后,CA調(diào)用執(zhí)行TA服務對程序性能的影響。同時考慮到OP-TEE是基于TrustZone技術(shù)的開源項目,也遵循GlobalPlatform標準,CA和TA之間調(diào)用過程也符合上述規(guī)范,具有TrustZone技術(shù)通信過程的普遍代表性,因此本文使用OP-TEE作為TrustZone安全服務調(diào)用過程分析對象。
Figure 2 Service request process from CA to TA圖2 CA調(diào)用執(zhí)行TA過程
在程序執(zhí)行過程中,對CA調(diào)用執(zhí)行TA過程進行數(shù)學建模,考慮到程序執(zhí)行過程中需要經(jīng)歷多次TA調(diào)用過程,調(diào)用次數(shù)跟傳遞數(shù)據(jù)和注冊分配的共享內(nèi)存大小有關(guān),記Mg是注冊分配的共享內(nèi)存大小,M是需要傳遞的數(shù)據(jù)大小,n是程序執(zhí)行過程中CA調(diào)用執(zhí)行TA的次數(shù)。三者之間滿足:
(1)
對具體調(diào)用過程進行分解,在調(diào)用命令前需要分別為輸入和輸出數(shù)據(jù)注冊共享內(nèi)存和數(shù)據(jù)拷貝,會經(jīng)歷世界切換和數(shù)據(jù)拷貝,記tq為執(zhí)行世界切換時間,tc為數(shù)據(jù)拷貝時間,2次注冊共享內(nèi)存和數(shù)據(jù)拷貝過程執(zhí)行時間分別為Ts1和Ts2,則有:
Ts1=tq1+tc1
(2)
Ts2=tq2+tc2
(3)
注冊共享內(nèi)存并完成數(shù)據(jù)拷貝后,CA調(diào)用執(zhí)行TA程序,會經(jīng)歷世界切換、執(zhí)行外部中斷和執(zhí)行TA程序。記CA調(diào)用執(zhí)行TA程序時間為Tc。在TA執(zhí)行外部中斷的時間記為ti,TA具體執(zhí)行時間記為ta,則有:
Tc=tq3+ti+ta
(4)
CA調(diào)用執(zhí)行TA程序后,需要數(shù)據(jù)拷貝并銷毀共享內(nèi)存,記Tx1和Tx2分別是第1、2次銷毀共享內(nèi)存執(zhí)行時間。則有:
Tx1=tq4+tc3
(5)
Tx2=tq5+tc4
(6)
因此,程序調(diào)用執(zhí)行TA總時延T滿足:
T=n*(Ts1+Ts2+Tc+Tx1+Tx2)
(7)
從上述分析中可以看出,為了保證程序執(zhí)行過程的安全性,與程序在單操作系統(tǒng)中的運行過程相比,基于TrustZone技術(shù)的應用程序額外增加了注冊和銷毀共享內(nèi)存、數(shù)據(jù)拷貝、中斷執(zhí)行和世界切換等額外過程,從公式上看,為了提高服務調(diào)用的性能,需要盡可能地保證ta的執(zhí)行時間,減少Ts1、Ts2、Tx1、Tx2、tq和ti等非TA執(zhí)行時間,也要降低調(diào)用TA的執(zhí)行次數(shù)n,減少世界切換次數(shù)。
具體分析得出影響效率提高的因素有以下幾個方面:
(1)普通世界和安全世界切換帶來的性能降低。
根據(jù)對通信過程的分析,消息鏈路貫穿于注冊和銷毀共享內(nèi)存、調(diào)用執(zhí)行TA和執(zhí)行中斷響應等全過程,而消息鏈路依靠世界切換來完成。在CA調(diào)用執(zhí)行TA時會經(jīng)歷如下過程:REE用戶態(tài)CA程序調(diào)用REE端TEE命令接口,進入REE內(nèi)核態(tài),REE內(nèi)核態(tài)調(diào)用SMC(Secure Monitor Call)進入Monitor模式,Monitor模式保存當前REE狀態(tài)和運行程序狀態(tài),加載TEE狀態(tài),進入TEE內(nèi)核態(tài)。TEE內(nèi)核態(tài)分配線程,加載線程,線程轉(zhuǎn)入TEE用戶態(tài),TEE用戶態(tài)執(zhí)行TA程序。
因此,世界切換會經(jīng)歷復雜的狀態(tài)保存和加載過程,尤其對于多次調(diào)用執(zhí)行TA的程序則面臨多次世界切換,是程序性能提升不可忽略的影響因素。
(2)中斷對程序的影響
在TrustZone技術(shù)中,建議配置FIQ(Fast Interrupt reQuest)由安全世界進行響應,IRQ(Interrupt ReQuest)由普通世界進行響應,在OP-TEE中,采用了此方式。在TEE執(zhí)行TA程序時,收到來自REE的IRQ中斷請求后會經(jīng)歷如下執(zhí)行過程:首先保存當前運行TA程序的狀態(tài),之后保存當前TEE狀態(tài),調(diào)用SMC命令,加載REE狀態(tài),引起世界的切換;之后在REE中由REE中斷處理程序響應中斷請求,執(zhí)行完后,返回至TEE,加載之前運行的程序狀態(tài)繼續(xù)執(zhí)行。因此,在執(zhí)行TA程序過程中響應中斷請求,會引起額外的世界切換、狀態(tài)保存恢復和執(zhí)行中斷程序,TA程序無法有效利用CPU資源,造成干擾,增加了服務執(zhí)行時間的不確定性。
但與此同時,為了安全性的考慮,在TEE執(zhí)行TA程序時,只是在當前CPU核執(zhí)行,不允許核間調(diào)度。而當前CPU執(zhí)行都是面向多進程多任務的,在執(zhí)行過程中如果屏蔽來自REE的中斷請求,對于大計算量服務,長時間占用CPU資源,執(zhí)行TA程序,也會面臨REE程序長時間等待而“餓死”的情況。因此,應該合理配置中斷響應方式,滿足多種程序需求。
(3)注冊銷毀共享內(nèi)存對程序的影響。
出于安全性的考慮,在TrustZone中TEE可以訪問REE中的資源,而REE不能訪問TEE中的資源。注冊和銷毀共享內(nèi)存都是CA在調(diào)用REE中的相應接口,在TEE中的執(zhí)行分配和回收,注冊和銷毀共享內(nèi)存會引起世界切換。尤其對于需要頻繁多次調(diào)用TEE服務的應用程序,多次頻繁注冊和銷毀共享內(nèi)存,勢必引起較多冗余的世界切換等過程,造成程序性能的下降,可以通過共享內(nèi)存復用,減少冗余的注冊和銷毀共享內(nèi)存調(diào)用次數(shù),有效緩解該問題。
但也應該考慮,對于只需臨時調(diào)用執(zhí)行TA服務,和較長時間范圍內(nèi)單次調(diào)用執(zhí)行TA服務的應用程序,如果內(nèi)存復用,該程序長時間占用共享內(nèi)存資源,會造成其他程序無法得到有效資源。因此,需要結(jié)合程序調(diào)用過程的需求,采用靈活的共享內(nèi)存分配策略。
(4)數(shù)據(jù)交換帶來的性能開銷。
2個世界之間的數(shù)據(jù)交換依靠數(shù)據(jù)鏈路完成,而數(shù)據(jù)鏈路是以共享內(nèi)存為載體。以CA向TA傳遞數(shù)據(jù)為例,會經(jīng)歷以下過程:從REE系統(tǒng)中讀取原始數(shù)據(jù)至CA程序數(shù)據(jù)區(qū);在CA調(diào)用執(zhí)行TA時,會將原始數(shù)據(jù)從CA程序數(shù)據(jù)區(qū)拷貝到共享內(nèi)存,之后通過Monitor模式切換到TEE,調(diào)用執(zhí)行TA程序,TA執(zhí)行完畢后又會將結(jié)果數(shù)據(jù)拷貝到共享內(nèi)存,再通過Monitor模式切換回REE繼續(xù)執(zhí)行CA程序,最后CA程序?qū)墓蚕韮?nèi)存中拷貝將結(jié)果數(shù)據(jù)至CA程序數(shù)據(jù)區(qū),完成整個數(shù)據(jù)的傳遞。
傳遞數(shù)據(jù)過程中會面臨多次數(shù)據(jù)拷貝,內(nèi)存數(shù)據(jù)拷貝的過程必然帶來額外的程序開銷,且拷貝數(shù)據(jù)量越大程序開銷越多,程序執(zhí)行效率越低。
針對上述問題分析,本文認為基于TrustZone 應用程序調(diào)用過程應符合4點原則:(1)盡可能減少世界切換次數(shù);(2)充分考慮中斷處理方式對程序運行的影響;(3)合理分配共享內(nèi)存;(4)減少數(shù)據(jù)的內(nèi)存拷貝次數(shù)。根據(jù)上述原則,本文提出基于TrustZone應用程序性能優(yōu)化方法,分別是:通過合理配置參數(shù),減少不必要的過程調(diào)用;配置靈活的中斷處理方式;優(yōu)化共享內(nèi)存分配方式;減少內(nèi)存拷貝。
參數(shù)設置不合理,將引入不必要的狀態(tài)切換,或冗余過程調(diào)用和執(zhí)行,給程序性能帶來影響。在參數(shù)配置時,應盡可能減少調(diào)用次數(shù),從式(1)表示的程序調(diào)用執(zhí)行TA的次數(shù)看,主要從以下3方面減少調(diào)用次數(shù):(1)增加Mg的值,在需要傳遞的數(shù)據(jù)相同的情況下,申請共享內(nèi)存的大少增加,數(shù)據(jù)傳遞容量提高,則會相應地減少調(diào)用次數(shù)。(2)應申請與加密數(shù)據(jù)量等量的共享內(nèi)存,或是所需數(shù)據(jù)大小整數(shù)倍的共享內(nèi)存。即:
M=n*Mg
(8)
這樣一方面減少了共享內(nèi)存空間的浪費,另一方面也減少了執(zhí)行冗余過程的時間。(3)盡可能減少其他環(huán)節(jié)調(diào)用次數(shù),可以考慮在注冊和銷毀共享內(nèi)存時,只進行一次注冊和銷毀,則式(7)中總時延中CA調(diào)用執(zhí)行TA的時間Tc不變,2次注冊共享內(nèi)存時間Ts1和Ts2變成1次注冊共享內(nèi)存時間Ts,2次銷毀共享內(nèi)存時間Tx1和Tx2,變成1次銷毀共享內(nèi)存時間Tx,減少了調(diào)用執(zhí)行次數(shù),提升了程序執(zhí)行效率,即總執(zhí)行時間為:
T=n*(Ts+Tc+Tx)
(9)
通過問題分析,響應中斷請求給程序帶來性能降低和執(zhí)行過程的不確定性,而執(zhí)行TA時屏蔽中斷也面臨在REE中其他應用程序面臨過長等待而“餓死”的情況。本文采用靈活的處理方式來應對不同應用程序需求。具體包括如下2種中斷響應執(zhí)行方式:
執(zhí)行方式1:CPU在進入TEE系統(tǒng)并加載安全應用程序TA線程之前屏蔽來自REE的中斷請求,在開始執(zhí)行安全應用程序TA后打開來自REE系統(tǒng)的中斷請求。對于來自REE系統(tǒng)的中斷請求,CPU暫停執(zhí)行安全應用程序TA,將運行該安全應用程序TA的線程狀態(tài)和TEE系統(tǒng)狀態(tài)進行保存,切換到REE系統(tǒng)執(zhí)行中斷請求的響應,且在執(zhí)行完畢后,重新恢復TEE系統(tǒng)狀態(tài),加載保存的安全應用程序TA線程繼續(xù)運行安全應用程序TA,待所有安全應用程序TA執(zhí)行完畢后,切換至REE系統(tǒng),返回執(zhí)行用戶態(tài)下的普通應用程序CA。這種方式對于TA執(zhí)行過程沒有優(yōu)化,但對于長時間執(zhí)行,優(yōu)先級不高的TA程序,執(zhí)行過程中考慮了REE端應用程序的CPU需求,避免了發(fā)生REE程序“餓死”的情況。
執(zhí)行方式2:CPU在調(diào)用安全應用程序TA的整個過程中,屏蔽來自REE的中斷請求,直至TA執(zhí)行完畢后,切換至REE系統(tǒng),返回執(zhí)行用戶態(tài)下的普通應用程序CA,普通應用程序CA從共享內(nèi)存中讀取安全應用程序TA返回的執(zhí)行結(jié)果。即在TA執(zhí)行過程中去掉響應中斷的時間,提高了程序執(zhí)行效率。該執(zhí)行方式比較適用短時間執(zhí)行、高優(yōu)先級的TA程序,如式(10)所示:
Tc=tq3+ta
(10)
通過上述問題分析,頻繁調(diào)用TA的應用程序,共享內(nèi)存分配和銷毀面臨重復冗余的世界切換和數(shù)據(jù)拷貝等問題,而不頻繁調(diào)用TA的應用程序,又不希望長時間占用共享內(nèi)存資源,因此可以使用2種共享內(nèi)存分配、回收方式,即一次一用和一次多用。
一次一用是在普通應用程序CA調(diào)用安全應用程序TA服務時,不提前分配共享內(nèi)存,由系統(tǒng)按照程序需求注冊分配共享內(nèi)存,在執(zhí)行完安全應用程序TA后,系統(tǒng)自動將結(jié)果數(shù)據(jù)從共享內(nèi)存中拷貝到普通應用程序CA數(shù)據(jù)區(qū)中,之后自動銷毀該共享內(nèi)存。這種方式減少了普通應用程序CA的代碼量,用戶不需要過多關(guān)注共享內(nèi)存的分配和回收,避免了長時間占用共享內(nèi)存資源的情況,對于不需要多次調(diào)用安全應用程序TA的情況比較有效。
一次多用方式是在調(diào)用安全應用程序TA之前,用戶根據(jù)安全應用程序TA需要,提前注冊共享內(nèi)存,在執(zhí)行完安全應用程序TA后,用戶自行選擇是否銷毀該共享內(nèi)存。這種方式減少了調(diào)用多次安全應用程序TA中重復注冊分配和銷毀共享內(nèi)存的情況,也減少了共享內(nèi)存中數(shù)據(jù)多次拷貝的情況,尤其適合在一個普通應用程序CA中,需要多次重復調(diào)用安全應用程序TA和大數(shù)據(jù)量處理的情況。一次多用內(nèi)存分配使2次調(diào)用之間存在信息泄露的可能,因此會導致安全性降低。為了保證共享內(nèi)存中數(shù)據(jù)的安全性,在共享內(nèi)存分配和回收的整個過程中,增加了鎖機制,在銷毀該共享內(nèi)存前,為調(diào)用TEE和訪問共享內(nèi)存上鎖,使得其他程序無法調(diào)用TEE程序,也無法訪問該共享內(nèi)存,保證了數(shù)據(jù)的私密性和安全性。由式(11)可以說明:
T=Ts+n*Tc+Tx
(11)
通過問題分析,數(shù)據(jù)通過共享內(nèi)存相互傳遞時,面臨多次數(shù)據(jù)拷貝的情況。通過改進調(diào)用過程,將數(shù)據(jù)傳遞改為指針傳遞來提升程序性能。具體來說,在CA注冊分配共享內(nèi)存后,將原始數(shù)據(jù)直接讀取到共享內(nèi)存,在調(diào)用執(zhí)行TA傳遞參數(shù)時,只傳遞共享內(nèi)存中數(shù)據(jù)塊的指針,在TEE中執(zhí)行加密過程時,直接從共享內(nèi)存中讀取數(shù)據(jù),加密后也將結(jié)果數(shù)據(jù)直接放入共享內(nèi)存中,減少了內(nèi)存數(shù)據(jù)拷貝次數(shù),提升了程序執(zhí)行效率,即將tc1、tc2、tc3和tc4改為一次tc。
實驗環(huán)境:使用Hikey960開發(fā)板,4核Cortex A73 加 4核Cortex A53處理器,4 GB內(nèi)存,Linux內(nèi)核為4.13.0版本,OP-TEE為3.3.0版本,配置REE和TEE共享內(nèi)存大小為2 MB。主機使用Ubuntu16.04系統(tǒng),對測試過程進行記錄和整理。測試是在實際Hikey960開發(fā)板中燒錄OP-TEE開源項目,考慮到基于TrustZone的應用程序很多,例如身份驗證、電子支付等,但運行機制大致相同,本次針對的問題是TrustZone應用程序調(diào)用過程的優(yōu)化,選取其中一種應用程序即可說明問題,同時AES加密程序方便控制數(shù)據(jù)量大小,因此本文在OP-TEE中實現(xiàn)了AES加密程序,通過對AES加密程序中CA調(diào)用TA執(zhí)行加密過程中消耗CPU周期數(shù)進行測試,驗證問題分析的正確性和改進方法的有效性。AES加密過程用C語言編寫,程序共分為TA和CA 2部分,其中TA在TEE中運行,為實際加密過程,CA在REE中運行,包含對TA的調(diào)用接口。借助CPU性能監(jiān)控單元PMU(Performance Monitor Unit)對AES調(diào)用執(zhí)行過程中消耗的CPU周期數(shù)進行詳細測試,為了對調(diào)用過程進行準確的對比分析,將實驗配置為2組:
實驗1分別設置從1 KB~1 MB,步進為10 KB的共享內(nèi)存大小,TA程序?qū)Ψ峙涞恼麄€共享內(nèi)存進行加密,按上述運行過程分段測試CPU運行周期數(shù),目的是通過測試在不同共享內(nèi)存大小情況下,加密過程中各個階段所消耗的CPU周期數(shù),了解調(diào)用過程的性能瓶頸。
實驗2分別設置從1 KB~1 MB,步進為10 KB的共享內(nèi)存大小,統(tǒng)一加密2 012 KB的數(shù)據(jù),則設置最大1 MB的共享內(nèi)存,也需要調(diào)用執(zhí)行2次加密過程,通過測試總的執(zhí)行加密過程的時間,了解設置不同共享內(nèi)存大小對加密過程的影響。
每組實驗每個參數(shù)下執(zhí)行20次,取總CPU執(zhí)行周期數(shù)最小值為有效值。
參數(shù)配置主要指分配的共享內(nèi)存大小,因為共享內(nèi)存大小直接關(guān)系到程序調(diào)用次數(shù)。參數(shù)設置不合理會引起過多世界切換和其他冗余執(zhí)行過程,對程序性能產(chǎn)生較大影響。
通過實驗1的分段測試,了解一次調(diào)用過程中REE用戶態(tài)調(diào)用REE端TEE命令接口到TEE用戶態(tài)執(zhí)行加密過程、加密結(jié)束后返回至REE用戶態(tài)和整個加密過程所消耗CPU周期數(shù)及其占總執(zhí)行過程的比重。從圖3中可以看出,從REE用戶態(tài)切換至TEE用戶態(tài)所消耗的CPU周期數(shù)約為50 000~90 000,從TEE用戶態(tài)切換至REE用戶態(tài)所消耗CPU的周期數(shù)約為16 000~40 000,且兩者隨著分配共享內(nèi)存大小不同,呈現(xiàn)緩慢上升趨勢。而圖4說明,在分配不同共享內(nèi)存大小時,對分配的共享內(nèi)存進行加密,在開頭設置共享內(nèi)存1 KB情況下,REE用戶態(tài)向TEE用戶態(tài)切換所消耗的CPU周期數(shù)占整個加密執(zhí)行過程的35%,TEE用戶態(tài)向REE用戶態(tài)切換所消耗的CPU周期數(shù)占整個加密執(zhí)行過程的14%,之后兩者比重都呈現(xiàn)指數(shù)式下降,最后比重越來越小。因此可以看出,世界切換消耗較多CPU周期數(shù),在整個執(zhí)行過程占據(jù)較大比重,尤其在共享內(nèi)存設置較小,需要頻繁進行世界切換情況下,對程序影響較大。
Figure 3 CPU cycles consumed in world switchs under different shared memory sizes圖3 不同共享內(nèi)存大小下世界切換消耗CPU周期數(shù)
Figure 4 World switch time ratio to the total execution time under different shared memory sizes圖4 不同共享內(nèi)存大小下世界切換占總執(zhí)行時間百分比
通過實驗2,測試在不同共享內(nèi)存設置下,加密固定數(shù)據(jù)量,參數(shù)設置對總的執(zhí)行過程的影響。從圖5中可以看出,隨共享內(nèi)存大小設置不同,總的消耗CPU周期數(shù)存在波動。以典型的標記的位置為例進行說明,對于加密2 012 KB數(shù)據(jù),當設置共享內(nèi)存大小為1 001 KB時,需要調(diào)用執(zhí)行3次加密過程,而設置1 011 KB時,則只需要調(diào)用執(zhí)行2次加密過程。后者因為減少了調(diào)用執(zhí)行次數(shù),性能提高了31%。
Figure 5 CPU cycles consumed in 2 012 KB data encrypting operation under different shared memory sizes圖5 不同共享內(nèi)存大小下加密2 012 KB數(shù)據(jù)消耗的CPU周期數(shù)
因此,合理設置參數(shù)可以減少不必要的世界切換和其他冗余執(zhí)行過程,是提升程序執(zhí)行效率的有效途徑。
從實驗中發(fā)現(xiàn),在分配不同共享內(nèi)存大小情況下,執(zhí)行外部中斷顯著增加了程序運行時間,造成程序調(diào)用過程消耗CPU周期數(shù)波動性較大,因此響應中斷會給程序執(zhí)行帶來不確定性。本文選取并比較其中具有代表性的共享內(nèi)存為21 KB時,對20次調(diào)用執(zhí)行加密過程進行分析
從圖6中可以看出,在20次調(diào)用執(zhí)行過程中,除第3次調(diào)用執(zhí)行外,其他19次調(diào)用過程消耗的CPU周期數(shù)都在一個較小范圍內(nèi)波動,而第3次執(zhí)行CPU的周期數(shù)明顯較多,相比其他19次調(diào)用過程消耗的CPU周期數(shù)增加了60%以上,這是因為這次執(zhí)行過程中,REE中程序觸發(fā)中斷請求,導致程序返回REE時執(zhí)行中斷響應,消耗了更多CPU周期數(shù)??梢钥闯?,中斷響應對程序執(zhí)行造成很大不確定性,會出現(xiàn)響應中斷時間占據(jù)較大執(zhí)行時間的情況,對調(diào)用執(zhí)行過程有較大影響。
通過實驗2對屏蔽中斷后的程序加密2 012 KB數(shù)據(jù)進行了測試,分別測試全程屏蔽中斷和在TA正常執(zhí)行后不屏蔽中斷2種情形。從圖7中可以看出,屏蔽中斷可以帶來2%~4.5%的性能提升,在加密數(shù)據(jù)量變大時,屏蔽中斷帶來的性能提升維持在2.4%左右。
Figure 6 CPU cycles consumed in data encrypting operation under 21 KB shared memory size 圖6 共享內(nèi)存為21 KB時加密過程消耗的CPU周期數(shù)
Figure 7 Performance improvement by interrupt mask under different shared memory sizes圖7 不同共享內(nèi)存大小下屏蔽中斷帶來的性能提升
從圖8中可以看出,注冊和銷毀共享內(nèi)存所消耗的CPU周期數(shù)隨共享內(nèi)存大小增長而快速增長,從剛開始的400左右增長至100 000左右。而從圖9中可以看出,注冊和銷毀共享內(nèi)存所占整個執(zhí)行過程的比重從初期的27%指數(shù)式下降至9%左右,之后穩(wěn)定在9%左右。
Figure 8 CPU cycles consumed by registering and destroying under different shared memory sizes圖8 不同共享內(nèi)存大小下注冊、銷毀共享內(nèi)存消耗的CPU周期數(shù)
通過分析可以得出,注冊和銷毀共享內(nèi)存一方面增加了世界切換次數(shù),另一方面增加了數(shù)據(jù)內(nèi)存拷貝,在整個執(zhí)行過程中占有較大比重。對于需要重復執(zhí)行注冊和銷毀共享內(nèi)存的應用程序,則面臨更大性能冗余考驗。
Figure 9 Registering and destroying time ratio to the total execution time under different shared memory sizes圖9 不同共享內(nèi)存大小下注冊、銷毀共享內(nèi)存占總執(zhí)行時間百分比
通過實驗2測試了復用共享內(nèi)存對程序性能的影響。從圖10中可以看出,對于加密2 012 KB數(shù)據(jù),復用共享內(nèi)存調(diào)用次數(shù)較多,共享內(nèi)存設置為1 KB的情況下,性能提升比較明顯,達到37%,之后也能維持在6%左右。
Figure 10 Performance improvement by reusing under different shared memory sizes圖10 不同共享內(nèi)存大小下內(nèi)存復用帶來的性能提升
注冊和銷毀共享內(nèi)存過程中面臨冗余的內(nèi)存數(shù)據(jù)拷貝問題,通過實驗2對減少內(nèi)存拷貝進行了性能測試。從圖11可知,在分配不同共享內(nèi)存大小時,加密2 012 KB數(shù)據(jù),減少了內(nèi)存拷貝次數(shù),共享內(nèi)存設置為1 KB時,性能提升比較明顯,達到39%,之后也可以維持在8%左右。因此,減少內(nèi)存拷貝是提升性能的有效途徑之一。
Figure 11 Performance improvement by reducing memory copy under different shared memory sizes圖11 不同共享內(nèi)存大小下減少內(nèi)存拷貝帶來的性能提升
TrustZone技術(shù)是一種廣泛使用的技術(shù),可為智能設備提供受信任的執(zhí)行環(huán)境。而受信任的執(zhí)行環(huán)境為應用程序的安全性提供了保證,但同時也帶來了性能降低的負面影響。本文通過對程序調(diào)用執(zhí)行過程的詳細分析,將執(zhí)行過程中影響程序執(zhí)行性能的關(guān)注點聚焦到世界切換、中斷響應、注冊銷毀共享內(nèi)存和數(shù)據(jù)拷貝4個方面?;谙嚓P(guān)的問題的分析,有針對性地提出了程序效率提升方法,分別是合理配置參數(shù)、靈活配置中斷處理方式、優(yōu)化共享內(nèi)存分配方式和減少內(nèi)存數(shù)據(jù)拷貝。并在Hikey960實際開發(fā)板上搭建開源OP-TEE項目,創(chuàng)建了基于TrustZone技術(shù)的AES加密程序,利用CPU性能監(jiān)控單元,對加密過程中所消耗的周期數(shù)進行精細測試,并對優(yōu)化方法進行了實現(xiàn)和測試,定位到TrustZone安全服務調(diào)用過程中的性能瓶頸并驗證了優(yōu)化方法的有效性。后續(xù)會重點關(guān)注TrustZone技術(shù)通信過程中的安全性問題。