5

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

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

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

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

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

4

2 回答 2

4

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

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

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

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

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

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

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

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

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

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

于 2016-03-23T10:11:53.373 回答
2

这里的研究员,与英特尔 SGX 合作。

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

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

于 2018-05-29T10:29:44.560 回答