有关 SGX 加载的详细信息

qwe*_*iop 5 intel trusted-computing

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

  • 操作系统可以自由交换页面
  • EEXTEND 以 256 字节增量测量飞地

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

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

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

小智 4

我在英特尔论坛上问了类似的问题。总结[1]很有帮助。

简短的回答:不,您目前无法加载大于 EPC 的飞地。

由于当前缺乏分页支持(并且缺乏 v2 将提供的动态页面分配),这意味着同时加载的所有 enclave 的 HeapMaxSize 总和不能超过上述的 ~90MB。[1]

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

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

那么为什么不能加载比 EPC 更大的 enclave呢?

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

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

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

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