是否可以将大于 EPC 内存的程序加载到飞地?我觉得理论上这是允许的,因为
- 操作系统可以自由交换页面
EEXTEND
以 256 字节增量测量一个飞地
所以理论上,似乎可以只使用一页 EPC 内存来加载一个大程序:
- 将 4K 字节加载到 EPC 页面
- 测量加载的页面
- 驱逐加载的页面
- 将接下来的 4K 字节加载到与 (1) 中的相同的 EPC 页
我在理论上理解正确吗?虽然在实践中,我在加载大程序时立即出错。
是否可以将大于 EPC 内存的程序加载到飞地?我觉得理论上这是允许的,因为
EEXTEND
以 256 字节增量测量一个飞地所以理论上,似乎可以只使用一页 EPC 内存来加载一个大程序:
我在理论上理解正确吗?虽然在实践中,我在加载大程序时立即出错。
我在英特尔论坛上问过类似的问题。摘要 [1] 很有帮助。
简短的回答:不,此时您不能加载大于 EPC 的飞地。
由于当前缺乏分页支持(以及缺乏 v2 将提供的动态页面分配),这意味着同时加载的所有 enclave 的组合 HeapMaxSize 不能超过所述〜90MB。[1]
长答案:在 SGX 中有两种动态内存管理机制:
那么为什么不能加载比 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 会导致模拟错误
这里的研究员,与英特尔 SGX 合作。
不过,我想补充一点,Linux 确实支持上述机制2),允许对页面进行加密并换出到常规 DRAM。这实际上意味着您的原始问题是肯定的。Linux 能够创建任意大小的飞地。但是,在其当前形式(v1)中,一旦 enclave 最终确定,其大小可能不会扩大。
至于这是否是个好主意,答案肯定是否定的。扩展超出 EPC 大小的飞地会导致大量代价高昂的页面错误发生,从而显着降低性能。