文章 ID: 000058511 内容类型: 维护与性能 上次审核日期: 2021 年 08 月 10 日

将大型结构传递到飞地不会在飞地页面高速缓存 (EPC) 中造成寻呼

BUILT IN - ARTICLE INTRO SECOND COMPONENT
总结

如何将结构内的所有数据从不受信任的域复制到受信任的 英特尔® Software Guard Extensions (英特尔® SGX) 飞地

说明

飞地定义语言 (EDL) 中的大块块文件如下:

结构pair_t {
uint32_t键;
uint32_t价值;
};

结构table_t {
结构pair_t* 对;
uint32_t num_pairs;
};

public sgx_status_t ecall_sort_table([in] struct table_t * rel);

table_t 为 1.1 GB,比 128 MB EPC 大得多。飞地中使用的内存比不受信任的应用程序中结构所分配的内存要小得多,而且 EPC 中没有寻呼。

解决方法

上述结构和 ecall 函数定义会导致结构副本的复制。一个复制副本只复制指针地址,而不是指针引用的实际数据。在这种情况下,指针地址被复制到 EPC 或可信域中的飞地的内存空间,但数据仍然保留在不受信任的域。EPC 没有经历寻呼,因为大多数数据仍然处于不受信任的域。

以下是实现复制副本和深度副本的结构定义和声明。要深度将结构数据复制到 EPC,使用由开发人员设置计数和大小来调整 EDL 文件中结构。

结构pair_t {
uint32_t密钥;
uint32_t价值;
};

此结构声明导致配对结构的复制副本

结构table_t {
结构pair_t* 对;
uint32_t num_pairs;
};

此结构声明导致对结构的副本

结构deep_table_t {
[count = 1,大小 = 12] 结构pair_t对;
uint32_t num_pairs;
};

 

可信 {

此函数声明导致 rel 结构的副本

公共sgx_status_t ecall_sort_table([in] 结构table_t* rel);

此函数声明导致 rel 结构的副本

公共sgx_status_t ecall_deep_sort_table([in, count = 1] 结构deep_table_t* rel);
};

编译后,检查enclave_t.c以查看生成的代理函数。该函数sgx_ecall_deep_sort_table结构从不受信任的内存到可信内存的重复深度副本。

其他信息:

请参阅 英特尔® SGX Linux*开发人员参考指南 中的 结构、Enums和 Unions 部分,以完全说明如何将结构元素深度复制到受信任域。

注意最新的 Linux* 英特尔® Software Guard Extensions (英特尔® SGX) 开发人员参考指南 位于最新版本 Linux 发行版*的"文档英特尔® Software Guard Extensions中

edger8 工具在编译代码之前自动生成代理函数,以在不受信任域和可信域之间封送数据。EDL文件中计数和大小参数告诉 edger8 工具在代理函数中复制多少内存。

相关产品

本文适用于 1 产品

本页面上的内容是原始英文内容的人工翻译与计算机翻译的组合。我们提供此内容是为了您的便利并且仅供参考,未必完整或准确。如果本页面的英文版与翻译版之间存在任何冲突,应以英文版为准。 查看此页面的英语版本。