调用硬件指令进入Enclave
进入Enclave通常使用EENTER硬件指令,也可能使用ERESUME硬件指令。
ERESUME
ERESUME主要是因为之前Enclave正常执行流程中,发生了AEX(异步Enclave退出),AEX处理完后,可以通过ERESUME恢复Enclave的正常执行流程。
EENTER的进入点
EENTER的进入点是enclave_entry(也就是EnclaveBase+TCS.OENTRY,Enclave文件的元数据中的TCS布局都已经把这些都安排好了。在形成Enclave文件时,由SignTool来完成),这也是我们在lds文件中标记的全局符号。
//位于sdk/trts/linux/trts_pic.S
/*
* ---------------------------------------------------------------------
* Function: enclave_entry
* The entry point of the enclave.
*
* Registers:
* XAX - TCS.CSSA
* XBX - the address of a TCS
* XCX - the address of the instruction following the EENTER
* XDI - the reason of entering the enclave
* XSI - the pointer to the marshalling structure
*/
DECLARE_GLOBAL_FUNC enclave_entry
EENTER
EENTER的目的分类如下:
index值(EDI、proc) | 进入Enclave的目的 |
大于等于0或者ECMD_ECALL_PTHREAD | 正常进入Enclave操作敏感代码数据 |
ECMD_INIT_ENCLAVE | Enclave初始化时候,Enclave内部需要完成部分初始化操作 |
ECMD_ORET | OCALL返回了,重新进入Enclave |
ECMD_MKTCS | Enclave内外联动完成动态TCS的生成 |
ECMD_UNINIT_ENCLAVE | 销毁Enclave时候,进入Enclave完成部分销毁工作 |
ECMD_EXCEPT | AEX后,OS初步处理异常后,进入Enclave,完成异常处理 |
下面这小段代码是为了说明,EENTER的时候具体会根据寄存器值的不同,进行不同的操作流程,也就是不同的进入Enclave的目的。
/*
* ----------------------------------------------------------------------
* Dispatch code according to CSSA and the reason of EENTER
* eax > 0 - exception handler
* edi >= 0 - ecall
* edi == -1 - do_init_enclave
* edi == -2 - oret
* Registers
* No need to use any register during the dispatch
* ----------------------------------------------------------------------
*/
!!注意一个区别!!!
ERESUME会让我们在AEX处理完之后重新进入Enclave。而EENTER中有一个目的是进入Enclave对AEX异常原因使用Enclave异常句柄进行解决。
这里普及以下AEX处理流程。AEX处理可以分为“一进一出”和“二进二出”。
一进一出。Enclave发生AEX,退出Enclave(下图左边这个EXIT步骤)。然后OS进行异常解决。然后返回Enclave进行正常流程(下图RESUME步骤,使用ERESUME硬件指令,注意一个是RESUME过程,一个是我说的ENCLU ERESUME硬件指令)。
二进二出。如图(CoSMIX画的图)。Enclave发生AEX,退出Enclave(下图左边这个EXIT步骤)。然后OS进行初步的异常解决。然后有的异常只有Enclave内部注册的和异常句柄才能解决,那么就要多一次的进入异常句柄完成异常处理(下图ENTER步骤)。Enclave内部异常句柄处理完之后,多一次的退出Enclave,回到OS的异常处理句柄(下图右边这个EXIT步骤)。然后再返回到Enclave进行正常执行流程(下图RESUME步骤)
《CoSMIX: a compiler-based system for secure memory instrumentation and execution in enclaves》顺带提一句,CoSMIX主要是为了解决这种二进二出的开销,因为我们其实可以Enclave内部直接转到异常句柄,不需要退出到OS的错误句柄中。