如何将结构内的所有数据从不受信任的域复制到受信任的 英特尔® 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 工具在代理函数中复制多少内存。