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