进入Enclave通常使用EENTER硬件指令,也可能使用ERESUME硬件指令。
ERESUME主要是因为之前Enclave正常执行流程中,发生了AEX(异步Enclave退出),AEX处理完后,可以通过ERESUME恢复Enclave的正常执行流程。
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_entryEENTER的目的分类如下:
index值(EDI、proc)进入Enclave的目的大于等于0或者ECMD_ECALL_PTHREAD正常进入Enclave操作敏感代码数据ECMD_INIT_ENCLAVE
Enclave初始化时候,Enclave内部需要完成部分初始化操作ECMD_ORET
OCALL返回了,重新进入EnclaveECMD_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的错误句柄中。