关于SGX加载的细节

时间:2016-03-23 01:48:59

标签: intel trusted-computing

是否可以将比EPC内存更大的程序加载到安全区?理论上我觉得这是允许的,因为

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

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

  1. 将4K字节加载到EPC页面
  2. 衡量已加载的页面
  3. 逐出载入的页面
  4. 将下一个4K字节加载到与(1)
  5. 中相同的EPC页面

    我在理论上是否正确理解?虽然在实践中,我在加载大型程序时立即收到错误。

2 个答案:

答案 0 :(得分:3)

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

简短回答:不,你现在不能加载比EPC更大的飞地。

  

由于目前缺乏寻呼支持(并且缺乏v2将提供的动态页面分配),这意味着同时加载的所有包围区的组合HeapMaxSize不能超过〜90MB。 [1]

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

  1. 安全区可以通过EAUG请求其他页面 - 这仅在SGXv2中受支持,目前没有硬件可用
  2. 操作系统可以将EPC页面换成常规RAM(EWB / ELD指令),但Windows目前不支持此
  3. 那你为什么不装载比EPC更大的飞地?

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

    因此,您的飞地必须在当前硬件上使用低于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会导致模拟错误

答案 1 :(得分:2)

此处的研究员,与英特尔SGX合作。

我只想补充一点,Linux确实支持上面提到的机制 2),允许页面加密并换成常规DRAM。 这有效意味着你原来的问题。 Linux能够创建任意大小的飞地。然而,在其目前的形式(v1)中,一旦飞地最终确定,尺寸可能不会扩大。

至于这是否是一个好主意,答案肯定是否定的。将扩展区域扩展到EPC的大小以上会导致大量昂贵的页面故障,从而显着降低性能。