Linux SGX仓库:https://github.com/intel/linux-sgx
如下是我的分析。
根据ECALL的真正执行者是谁,可以将ECALL执行模式分为Switch模式(线程切换上下文进入Enclave执行代码)和Switchless模式(不可信线程将ECALL交由长期驻留Enclave的线程代理执行)。
ECALL Switch模式调用
如下图所示,不可信线程切换上下文进入Enclave完成ECALL代码的真正执行。
当从不可信世界调用Enclave函数时,会将Enclave函数从虚拟地址转换为物理地址,同时需要提交一个PAGEINFO,说明申请调用Enclave函数对应EP的细节,EPCM会检查这个物理地址对应的虚拟地址是否匹配,检查是否是对应的EnclaveID(细节上是SECS是否匹配),读写执行权限是否匹配,页类型是否匹配,匹配才允许开始执行Enclave函数。
ECALL Switchless模式调用
如下图所示,不可信线程会将Ecall任务放到Ecall任务池中,发信号通知TWorker线程提取任务并执行。