
了解采用SGX可信任環(huán)境后對(duì)應(yīng)用和目標(biāo)主機(jī)產(chǎn)生的性能影響有多少。?
(資料圖片僅供參考)
Microsoft Window10 21H2版本主機(jī)一臺(tái),?
處理器:Intel Core(TM)i5-9500F ??CPU@3.00GHZ???
64位操作系統(tǒng),內(nèi)存16GB?
代碼編譯環(huán)境:vs2015專業(yè)版或者Clion2021?
SGX插件相關(guān)版本?
Intel ME版本:ME_SW_1909.12.0.1237?
SDK版本:Intel SGX SDK for Windows v2.12.100.4?
PSW版本:Intel SGX PSW for Windows v2.12.100.4?
小程序:計(jì)算一萬(wàn)以內(nèi)的素?cái)?shù),(循環(huán)10000次)?
程序源碼:?
//?// Created by hudengfeng on 2023/1/9.?//?#include正常情況cpu使用率:20%(均值)?
運(yùn)行程序cpu使用率:70%(均值)?
代碼運(yùn)行結(jié)果(10次)?
11.732s、13.635s、16.017s、12.544s、14.327s?
11.515s、14.301s、12.988s、15.251s、12.677s?
均值:13.499s?
基本原理:?
SGX程序分為兩部分,一部分是app應(yīng)用,也就是不可信區(qū),一部分是enclave應(yīng)用,也就是可信區(qū),非可信區(qū)只能通過(guò) ECALL 函數(shù)調(diào)用可信區(qū)內(nèi)的函數(shù),可信區(qū)只能通過(guò) OCALL 函數(shù)調(diào)用非可信區(qū)的函數(shù),ECALL 函數(shù)和 OCALL 函數(shù)通過(guò) EDL 文件聲明。?
程序目錄結(jié)構(gòu):?
App 目錄內(nèi)為不可信區(qū)域代碼,包括 main 入口、OCALL 函數(shù)內(nèi)具體邏輯代碼等等。?
Enclave 目錄為可信區(qū)域代碼,包括 ECALL 函數(shù)內(nèi)具體邏輯代碼實(shí)現(xiàn)。?
Enclave.lds:EDL(Enclave Description Language) 文件。?
Enclave_private.pem:enclave.so 的簽名私鑰。?
Enclave.config.xml:Enclave 配置文件,如堆棧大小、是否可等。?
Enclave.h & Enclave.cpp:應(yīng)用安全區(qū)代碼實(shí)現(xiàn)。?
Include目錄是不可信代碼和可信代碼共享的頭文件。?
在app程序中通過(guò)ecall函數(shù)調(diào)用enclave程序的calculate函數(shù)來(lái)計(jì)算結(jié)果,然后把計(jì)算的結(jié)果通過(guò)ocall函數(shù)返回給app程序,然后app程序把結(jié)果打印出來(lái)。?
編譯運(yùn)行:?
1.通過(guò) sgx_edger8r 工具在 App/ 目錄下生成不可信代碼(Enclave_u.c 和 Enclave_u.h),這部分生成代碼主要會(huì)調(diào)用 ECALL (sgx_ecall);?
2.編譯不可信部分 Binary: app;?
3.通過(guò)sgx_edger8r 工具在 Enclave/ 目錄下生成可信代碼(Enclave_t.c 和 Enclave_t.h);?
4.編譯可信動(dòng)態(tài)鏈接庫(kù)(enclave.so);?
5.通過(guò)sgx_sing工具簽名可信動(dòng)態(tài)鏈接庫(kù)(enclave.signed.so);?
6.結(jié)束。?
編譯后的代碼目錄結(jié)構(gòu):?
實(shí)驗(yàn)結(jié)果:?
正常情況cpu使用率:20%(均值)?
運(yùn)行程序cpu使用率:80%(均值)?
代碼運(yùn)行結(jié)果(10次)?
17.496s、12.854s、14.327s、15.635s、14.324s?
12.432s、11.543s、15.398s、18.534s、13.264s?
均值:14.580s?
核心程序源碼:?
App.cpp?
#includeEnclave.cpp?
void ecall_calculate_from_enclave(){? for (int j = 0; j < 1000; ++j) {? calculate_prime();? }?}?由以上App.cpp(51-53行)程序可以看出,還是計(jì)算10000以內(nèi)的素?cái)?shù)(10000次),但是Enclave.cpp當(dāng)中只計(jì)算了1000次。app.cpp當(dāng)中有10次循環(huán)調(diào)用ecall函數(shù)?
實(shí)驗(yàn)結(jié)果:?
正常情況cpu使用率:20%(均值)?
運(yùn)行程序cpu使用率:84%(均值)?
代碼運(yùn)行結(jié)果(10次)?
22.065s、24.905s、25.687s、21.522s、18.417s?
21.592s、20.666s、21.845s、21.499s、18.457s?
均值:21.666s?
首先修改編譯器設(shè)置,默認(rèn)堆棧區(qū)大小是1M,如果不想使用堆棧,可在全局區(qū)使用大數(shù)組,前面加上static即可。需要在圖形化界面修改堆棧保留大小這個(gè)字段。單位是bit,這里改成256MB,也就是256*1024*1024*8。也可在CMakeLists.txt添加下面2行,就可以達(dá)到修改堆棧內(nèi)存大小的效果。?
MATH(EXPR stack_size "256*1024*1024")單位是字節(jié)?
set(CMAKE_EXE_LINKER_FLAGS "-Wl,--stack,${stack_size}")?
也可通過(guò)圖形化界面修改,在vs2015在項(xiàng)目的屬性,找到鏈接器的系統(tǒng)這一欄,?
在3.4.1執(zhí)行函數(shù)中新增代碼(5-10行)?
void exe(){? clock_t start, finish;? double duration;? start = clock();? int a[4096][4096] = {0};? int b[4096][4096] = {1};? a[0][0] = 1;? size_t num = sizeof(a);? a[0][1] = num;? b[0][0] = a[0][1];? for (int j = 0; j < 10000; ++j) {? calculate_prime();? }? finish = clock();? duration = (double)(finish - start) / CLOCKS_PER_SEC;? cout<實(shí)驗(yàn)結(jié)果:?
正常情況cpu使用率:20%(均值)?
運(yùn)行代碼程序后cpu使用率:84%(均值)?
代碼運(yùn)行結(jié)果(10次)?
17.744s、16.946s、20.974s、17.409s、17.022s?
20.746s、16.785s、21.114s、18.742s、18.965s?
均值:18.645s?
將上述帶有大數(shù)組的代碼復(fù)制到Enclave.cpp當(dāng)中(寫在循環(huán)外面),?
核心代碼:?
void ecall_calculate_from_enclave(){ ? int a[4096][4096] = {0};? int b[4096][4096] = {1};? a[0][0] = 1;? size_t num = sizeof(a);? a[0][1] = num;? b[0][0] = a[0][1];? for (int j = 0; j < 10000; ++j) {? calculate_prime();? }?}?實(shí)驗(yàn)結(jié)果:?
正常情況cpu使用率:20%(均值)?
運(yùn)行代碼程序后cpu使用率:90%(均值)?
代碼運(yùn)行結(jié)果(10次)?
26.264s、26.043s、24.434s、28.206s、23.204s?
22.236s、26.238s、25.232s、23.364s、24.652s?
均值:24.987s?
通過(guò)上述實(shí)驗(yàn)可以發(fā)現(xiàn)使用SGX安全插件的app應(yīng)用來(lái)計(jì)算10000以內(nèi)的素?cái)?shù)(10000次)用的時(shí)間比不使用插件要多,cpu使用率也要高一些,但是性能損耗在5%到10%之間,性能損耗可以接受。如果頻繁使用ecall函數(shù)或者ocall函數(shù),在可信區(qū)和非可信區(qū)之間進(jìn)行切換,會(huì)有比較明顯的性能消耗,性能損耗在20%以上。當(dāng)epc內(nèi)存過(guò)大也會(huì)明顯影響主機(jī)的性能。性能損耗20%以上。?
標(biāo)簽: 正常情況 實(shí)驗(yàn)結(jié)果 運(yùn)行程序