文章 ID: 000058511 內容類型: 維護與效能 最近查看日期: 2021 年 08 月 10 日

將大型結構傳遞給飛地不會在飛地頁面快取記憶體 (EPC) 中造成分頁

BUILT IN - ARTICLE INTRO SECOND COMPONENT
摘要

如何將結構內的所有資料從未受信任網域複製到受信任的 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 工具代理功能中要複製多少記憶體。

相關產品

本文章適用於 1 產品

這個頁面的內容綜合了英文原始內容的人工翻譯譯文與機器翻譯譯文。本內容是基於一般資訊目的,方便您參考而提供,不應視同完整或準確的內容。如果這個頁面的英文版與譯文之間發生任何牴觸,將受英文版規範及管轄。 查看這個頁面的英文版。