目录
目录
ECALL Switch/Ordinary总结
ECALL Switchless总结
OCALL Switch/Ordinary总结
目录
ECALL Ordinary(Switch)和Switchless的入门介绍请看
《ECALL的Swtich和Switchless简介》
想要深究ECALL Ordinary(Switch)调用的细节,请看
《ECALL Switch/Ordinary模式》
对于ECALLSwitchless模式,需要在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页》
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时执行)
内容主要包括:
- 构建并初始化uRTS端的uSwitchless管理器、O/ECALL管理器、信号线管理器、工人线程管理器,初始化t/uWorker工人线程。
- 工人线程自身进行初始化,然后休眠并等待Switchless 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的虚拟地址并执行之。
1、IT大王遵守相关法律法规,由于本站资源全部来源于网络程序/投稿,故资源量太大无法一一准确核实资源侵权的真实性;
2、出于传递信息之目的,故IT大王可能会误刊发损害或影响您的合法权益,请您积极与我们联系处理(所有内容不代表本站观点与立场);
3、因时间、精力有限,我们无法一一核实每一条消息的真实性,但我们会在发布之前尽最大努力来核实这些信息;
4、无论出于何种目的要求本站删除内容,您均需要提供根据国家版权局发布的示范格式
《要求删除或断开链接侵权网络内容的通知》:https://itdw.cn/ziliao/sfgs.pdf,
国家知识产权局《要求删除或断开链接侵权网络内容的通知》填写说明: http://www.ncac.gov.cn/chinacopyright/contents/12227/342400.shtml
未按照国家知识产权局格式通知一律不予处理;请按照此通知格式填写发至本站的邮箱 wl6@163.com