2

测量运行时间是性能评估的一个重要方面。现在我想评估 SGX enclave(可信执行环境)内的几个代码的性能,我注意到英特尔 SGX 提供了一个名为“sgx_get_trusted_time()”的 API,供开发人员从可信来源获取当前时间。但是,我在这里遇到了麻烦:

1) 使用 'sgx_get_trusted_time()' 之前需要 'sgx_create_pse_session()',但我总是收到错误 'SGX_ERROR_SERVICE_UNAVAILABLE'。我已正确安装并配置了 SGX SDK 和 PSW(否则我无法使用远程认证服务)。我还尝试为开发平台(Win10 + ThinkPad x270 + CORE i5)更新管理引擎,但没有成功;

2) API 以秒为单位返回时间,这在性能评估方面远非精确,尤其是在两次 API 调用之间经过的时间很短的情况下。

我怎样才能解决第一个问题,以及更精确地测量飞地内经过的时间的任何解决方案?感谢任何建议或提示。

4

1 回答 1

0

测量飞地内的执行时间可能有点棘手。我可以考虑两种解决方案,每种解决方案都有自己的优缺点,具体取决于您的应用程序的性质。

使用ECALLOCALL测量不受信任代码中的执行时间。

在运行您希望评估其性能的函数(通过测量其执行时间)之前,请在不受信任的代码上启动计时器。

计时器可以启动:

  1. 在不受信任的代码调用受信任代码中的主函数之前(您可以测量其执行时间)。在不受信任的代码上启动计时器,调用受信任的函数(ECALL),当ECALL函数完成执行时,在不受信任的代码上停止计时器。
  2. 当不受信任的代码正在运行时。使用受信任代码调用的OCALL启动计时器,并通过受信任代码调用的另一个OCALL停止计时器。不受信任的调用应处理这些OCALL并相应地启动/停止计时器。

根据您想要测量其执行时间的可信代码的哪一部分(函数或多个函数),上述解决方案之一应该可以工作。要记住的另一件事是,您可以在不受信任的代码中使用向量来跟踪多个函数的执行时间。一旦您的代码完成执行,您就可以打印矢量项,甚至可以对它们执行一些计算。

如果您执行过多的ECALLOCALL,它们的成本可能会有点高。您可以单独测量ECALLOCALL时间并将它们从总体执行时间中减去,或者您可以检查下面的解决方案。

使用 HotCalls 测量不受信任代码中的执行时间。

HotCall提供了与 enclave 的更快接口。这项工作由 Ofir Weisse 在Regaining Lost Cycles with HotCalls: A Fast Interface for SGX Secure Enclaves中发表。

该代码可以在 Ofir 的存储库中找到。在他的示例代码中,他确实测量了执行时间;因此,他的示例代码对您的情况非常有用。

于 2020-07-09T00:05:13.853 回答