《SGX ECALL》汇总
?
目錄
相關(guān)文檔
ECALL Switch/Ordinary總結(jié)
ECALL Switchless總結(jié)
OCALL Switch/Ordinary總結(jié)
OCALL Switchless總結(jié)
相關(guān)文檔
ECALL Ordinary(Switch)和Switchless的入門介紹請看
《ECALL的Swtich和Switchless簡介》
想要深究ECALL Ordinary(Switch)調(diào)用的細(xì)節(jié),請看
《ECALL Switch/Ordinary模式》
對于ECALL?Switchless模式,需要在SGX初始化時候完成uRTS端的SGX Switchless初始化。簡介請看
《SGX TCS構(gòu)建及Switchless初始化簡介》
想要知道uRTS端的SGX Switchless初始化更多細(xì)節(jié),請看
《SGX初始化中,uRTS端的Switchless模式的初始化》
想要深究ECALL Switchless調(diào)用以及tRTS端的Switchless模式的初始化的細(xì)節(jié),請看
《ECALL Swtichless調(diào)用及tRTS端Swtichless初始化》
Enclave內(nèi)部使用OCALL并重返Enclave內(nèi)部的過程,請看
《Enclave OCALL或退出》
其他相關(guān)的還有
《進(jìn)入Enclave的目的歸類》、《構(gòu)建動態(tài)TCS頁》、《OCALL Switchless模式》
ECALL Switch/Ordinary總結(jié)
這種方式時SGX最初支持也是最直接的ECALL方式,切換上下文進(jìn)入Enclave,但是這種切換上下文(EENTER【ENCLU.0x02】)的開銷非常大,幾千個Cycle,可以查看《Eleos: ExitLess OS services for SGX enclaves》,后來相關(guān)學(xué)者及Intel就推出了Switchless方案。
這個總結(jié)主要講ECALL Switch/Ordinary
線程想要執(zhí)行ECALL,那么就帶上ECALL索引值并申請一個TCS(TCS相當(dāng)于線程進(jìn)入tRTS的許可證或者工作證),然后將uRTS的上下文保存到SSA中,通過EENTER硬件指令切換上下文進(jìn)入tRTS,第一次進(jìn)入tRTS時的上下文來自于一個預(yù)置的模板,并且進(jìn)入到tRTS的enclave_entry地址,之后按照ECALL索引值查ECALL表得到ECALL的虛擬地址并執(zhí)行之。需要補(bǔ)充的是,剛進(jìn)入tRTS時,線程需要確保線程棧保護(hù)機(jī)制開啟、線程數(shù)據(jù)已經(jīng)初始化過。
如果進(jìn)入Enclave是因為:進(jìn)入到tRTS完成SGX初始化的部分工作;OCALL返回重新進(jìn)入到Enclave內(nèi)部;進(jìn)入tRTS動態(tài)構(gòu)建TCS;重新進(jìn)入tRTS為了處理異常(《進(jìn)入Enclave的目的歸類》)。那么就需要調(diào)用各自的處理函數(shù)來解決這些個特殊目的。
對于OCALL返回重新進(jìn)入到Enclave內(nèi)部,線程會使用之前OCALL時保存到tRTS的SSA進(jìn)行上下文的恢復(fù)。對于AEX,是通過ERESUME硬件指令重新進(jìn)入Enclave。
《SGXv2.8起Enclave內(nèi)新增pthread庫》從linux-sgx v2.8開始,SGX支持在tRTS創(chuàng)建pthread線程,這個會要求在tRTS內(nèi)部開辟線程空間,然后OCALL到uRTS創(chuàng)建pthread線程并分配TCS給這個pthread線程。創(chuàng)建pthread線程者會重新回到tRTS中(OCALL返回),新創(chuàng)建的pthread線程會切換上下文進(jìn)入到tRTS。
ECALL Switchless總結(jié)
SGX初始化末期的時候,根據(jù)用戶選擇,可以對ECALL Switchless進(jìn)行初始化。此時主要完成的任務(wù)是uRTS端的ECALL Switchless初始化。(SGXv2.8調(diào)整后,tRTS端初始化Switchless的操作被放到了第一次Swtichless ECALL時執(zhí)行)
內(nèi)容主要包括:
(SGXv2.8調(diào)整后,tRTS端初始化Switchless的操作被放到了第一次Swtichless ECALL時執(zhí)行)
當(dāng)發(fā)生第一個Switchless ECALL時,主線程需要切換上下文進(jìn)入Enclave,并在tRTS端對ECALL Switchless進(jìn)行初始化,主要是為了讓tRTS內(nèi)部也保管一份uSwtichless管理器,并往tRTS內(nèi)部傳入OCALL表。然后喚醒所有工人線程,其中tWorker切換上下文進(jìn)入tRTS,并且在tRTS初始化ECALL管理器、信號線和ECALL表,等待著信號置位并處理ECALL任務(wù)。
調(diào)用ECALL Switchless者,會開始構(gòu)建ECALL任務(wù)并發(fā)送信號(將信號線某個空閑的Bit置位),此時ECALL任務(wù)的狀態(tài)從【SL_INIT】變成【SL_SUBMITTED】,然后將ECALL任務(wù)放到ECALL管理器開辟的任務(wù)池中,并循環(huán)等待tWorker線程接收【SL_ACCEPTED】及處理完【SL_DONE】ECALL任務(wù)。
tWorker工人線程這邊,第一次進(jìn)入Enclave時,會在tRTS端初始化ECALL管理器、信號線管理器和ECALL表。然后tWorker工人線程就循環(huán)等待信號置位。當(dāng)接收到信號時,它就將ECALL任務(wù)取出,并將ECALL任務(wù)狀態(tài)設(shè)置為【SL_ACCEPTED】。然后tWorker工人線程根據(jù)ECALL任務(wù)中的索引值查ECALL表并執(zhí)行對應(yīng)ECALL,執(zhí)行完后將ECALL任務(wù)狀態(tài)設(shè)置為【SL_DONE】。
OCALL Switch/Ordinary總結(jié)
這個OCALL Switch/Ordinary和ECALL Switch/Ordinary非常相像,就是方向反了。
將tRTS的上下文保存到SSA,然后使用EEXIT【ENCLU.0x04】回到uRTS并從之前進(jìn)入tRTS時保存的SSA中上下文信息來恢復(fù)uRTS的上下文。EEXIT【ENCLU.0x04】的返回點是當(dāng)時EENTER【ENCLU.0x02】的下一條指令。然后用OCALL索引值查OCALL表獲得OCALL的虛擬地址并執(zhí)行之。
OCALL Switchless總結(jié)
類似ECALL Switchless,可以參考《OCALL Switchless模式》
總結(jié)
以上是生活随笔為你收集整理的《SGX ECALL》汇总的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【云驻共创】 JAVA常用的开发工具有哪
- 下一篇: 在网页中使用个性字体