有关 SGX 加载的详细信息

A detail about SGX loading

是否可以将大于 EPC 内存的程序加载到 enclave 中?我觉得理论上是允许的,因为

所以理论上,似乎可以只使用一页 EPC 内存来加载一个大程序:

  1. 将 4K 字节加载到 EPC 页面
  2. 测量加载的页面
  3. 驱逐加载的页面
  4. 将接下来的 4K 字节加载到与 (1) 中相同的 EPC 页面

理论上我理解正确吗?虽然在实践中,我在加载大程序时立即出错

我在英特尔论坛上问过类似的问题。摘要 [1] 很有帮助。

简短回答:不,您此时不能加载大于 EPC 的 enclave。

Due to the current lack of paging support (and lack of dynamic page allocation that v2 will provide) this means that the combined HeapMaxSize of all enclaves loaded at the same time cannot exceed said ~90MB. [1]

长答案:在 SGX 中有两种动态内存管理机制:

  1. enclave 可以通过 EAUG 请求额外的页面 - 这仅在 SGXv2 中受支持,目前没有可用的硬件
  2. OS 可以将 EPC 页面换出到常规 RAM(EWB/ELD 指令),但 Windows 目前不支持此功能

那么为什么不能加载大于 EPC 的 enclave?

  • 当前系统上的 EPC 大小限制为大约 90MB
  • Windows目前不支持换出这些页面
  • 飞地在 SGXv1 硬件上执行 (EINIT) 之前必须请求它希望使用的所有页面
  • 所有飞地的大小不得超过 EPC 大小
  • 英特尔为其管理 enclave(引用、配置、加载 enclave)保留一些 EPC space

因此您的 enclave 在当前硬件上必须使用远低于 90MB 的堆大小。我试验过 SDK 仿真,发现它允许堆最大大小约为 1GiB [2]。未来的 OS 版本有望支持 EPC 页面交换,从而允许更大的静态飞地大小。未来的 SGX 硬件将允许动态页面分配,允许动态飞地大小。

[1] https://software.intel.com/en-us/forums/intel-isa-extensions/topic/607004#comment-1857071

[2] 1GiB - 64KiB - TCSnum * 128KiB,其中 TCSnum 是线程数。超过此 HeapMaxSize 会导致 模拟错误

这里是研究员,正在使用 Intel SGX。

我只想补充一点 Linux,但是,确实支持上述机制 2),允许页面被加密并换出到常规 DRAM。 这实际上意味着 对您的原始问题。 Linux 能够创建任意大小的飞地。然而,在其当前形式 (v1) 中,一旦飞地最终确定,其大小可能不会扩展。

至于这是否是个好主意,答案肯定是否定的。将 enclave 扩展到超过 EPC 的大小会导致发生大量代价高昂的页面错误,从而显着降低性能。