2017-11-03 139 views
0

閱讀大量的文件後,我做的第一簡單飛地功能:SGX飛地:在哪裏,做遊行的實際功能去和它如何被編譯

enclave { 
    //Include files 

    //Import other edl files 

    //Data structure declarations to be used as parameters of the 
    //function prototypes in edl 

    trusted { 
      public function myFirstMethod([in] int *a, [in] int *b,[out] int *sum); 
    }; 

    untrusted { 
    }; 
}; 

然後在慶典我運行edger8r:

sgx_edger8r enclave.edl 

然後生成以下文件,你可以在架構看:

Generated files

所以我假設之上的某個地方的enclave_t.c我發現的唯一引用是這個函數:

static sgx_status_t SGX_CDECL sgx_myFirstMethod(void* pms) 
{ 
    CHECK_REF_POINTER(pms, sizeof(ms_myFirstMethod_t)); 
    ms_myFirstMethod_t* ms = SGX_CAST(ms_myFirstMethod_t*, pms); 
    sgx_status_t status = SGX_SUCCESS; 
    int* _tmp_a = ms->ms_a; 
    size_t _len_a = sizeof(*_tmp_a); 
    int* _in_a = NULL; 
    int* _tmp_b = ms->ms_b; 
    size_t _len_b = sizeof(*_tmp_b); 
    int* _in_b = NULL; 

    CHECK_UNIQUE_POINTER(_tmp_a, _len_a); 
    CHECK_UNIQUE_POINTER(_tmp_b, _len_b); 

    if (_tmp_a != NULL) { 
     _in_a = (int*)malloc(_len_a); 
     if (_in_a == NULL) { 
      status = SGX_ERROR_OUT_OF_MEMORY; 
      goto err; 
     } 

     memcpy(_in_a, _tmp_a, _len_a); 
    } 
    if (_tmp_b != NULL) { 
     _in_b = (int*)malloc(_len_b); 
     if (_in_b == NULL) { 
      status = SGX_ERROR_OUT_OF_MEMORY; 
      goto err; 
     } 

     memcpy(_in_b, _tmp_b, _len_b); 
    } 
    ms->ms_retval = myFirstMethod(_in_a, _in_b); 
err: 
    if (_in_a) free(_in_a); 
    if (_in_b) free(_in_b); 

    return status; 
} 

特別是在

ms->ms_retval = myFirstMethod(_in_a, _in_b); 

但是,在把myFirstMethod?另外,我將如何將我的飛地作爲應用程序的一部分編譯爲靜態庫。

由於FAS因爲我搜索是theese鏈接教程:

都提到Visual Studio中沒有原生運行在GNU/Linux的所以我有點難以遵循。

編輯1:

而且找我看到的https://github.com/01org/linux-sgx爲紐帶提到,我可以編譯在模擬模式:

make SGX_MODE=SIM 

我成功我已經安裝了driversdk。我想在模擬模式下編譯,而不是真正的。

回答

1

自動生成的輸出具有兼容的硬件edger8r只是提供飛地與不信任的外部世界之間的接口。他們不應該包含你的實現。

您應該在另一個源文件中定義myFirstMethod,如enclave.cenclave.cpp,並將其與項目的其餘部分進行鏈接。函數的簽名與您在edl中聲明的內容完全相同,除了用於edger8r使用的指針限定符外。

它會是這樣的:

enclave.cpp:

void myFirstMethod(int *a, int *b, int *sum) 
{ 
    *sum = *a + *b; 
}