《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时执行)

内容主要包括:

  1. 构建并初始化uRTS端的uSwitchless管理器、O/ECALL管理器、信号线管理器、工人线程管理器,初始化t/uWorker工人线程。
  2. 工人线程自身进行初始化,然后休眠并等待Switchless ECALL任务。
  3. 构建一个唤醒线程。等到主线程需要唤醒所有工人线程的时候,就让唤醒线程代为去唤醒所有工人线程

(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模式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值