SGX TCS构建及Switchless模式初始化【源码分析】

Linux SGX仓库:https://github.com/intel/linux-sgx

如下是我的分析。

SGX TCS

SGX环境下,不可信线程进入Enclave需要上下文切换,切换之前需要申请到一个TCS(TCS是一个用于代表和管理Enclave线程的数据结构)。只有进入了Enclave的线程可以执行ECALL代码。根据ECALL的真正执行者是谁,可以将ECALL执行模式分为Switch模式(线程切换上下文进入Enclave执行代码)和Switchless模式(不可信线程将ECALL交由长期驻留Enclave的线程代理执行)。

SGX TCS构建

如下图左侧“TCS构建阶段”,Enclave初始化时会创建一定数量的TCS。值得一提,SGX TCS与ECALL模式无关。TCS是不可信线程进入Enclave的前提,两种ECALL模式下都有线程真正进入Enclave。(Switchless模式下,作为代理人的TWorker线程会进入Enclave)。

ECALL Switchless模式初始化

“TCS构建流程图”右侧“Switchless模式初始化阶段”,描述了Enclave初始化末期,如果开启SGX Switchless 模式,那么主线程会创建若干子线程(TWorker线程前身),子线程们申请TCS后进入Enclave变成了TWorker线程,TWorker线程初始化后进入休眠,直到任务到来。