如何將結構內的所有資料從未受信任網域複製到受信任的 Intel® Software Guard Extensions (Intel® SGX) 飛地
在飛地定義語言 (EDL) 檔案中將 ecall 表示為:
結構 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會顯示結構從未內聯記憶體到受信任記憶體的反復複本。
請參閱Intel® SGX Linux*的開發人員參考指南 中的結構、Enums 和Unions一節,以瞭解如何將結構元素的深入複製到受信任網域。
注意 | 最新的 Linux* Intel® Software Guard Extensions (Intel® SGX) 開發人員參考指南 位於最新版 Linux 版本* 的檔Intel® Software Guard Extensions節。 |
edger8 工具會在編譯器代碼之前,自動產生在未編譯的網域與受信任網域之間修改資料的代理功能。EDL檔案中的計數和大小參數告訴 edger8 工具代理功能中要複製多少記憶體。