技术定义: switchless是一种通过共享内存减少REE与TEE上下文切换及数据拷贝次数,优化REE与TEE交互性能的技术。
典型应用场景: 传统应用做机密计算改造拆分成非安全侧CA与安全侧TA后
支持硬件平台:
基于secGear API开发应用的具体流程请参考HelloWorld开发流程
以switchless样例源码为例详细介绍switchless开发步骤。
如下定义了ecall函数get_string_switchless。
enclave {
include "secgear_urts.h"
from "secgear_tstdc.edl" import *;
from "secgear_tswitchless.edl" import *;
trusted {
public int get_string_switchless([out, size=32]char *buf) transition_using_threads;
};
};
switchless函数需添加'transition_using_threads'标识。
开发者在非安全侧需要完成如下步骤:
// 创建enclave
res = cc_enclave_create(real_p, AUTO_ENCLAVE_TYPE, 0, SECGEAR_DEBUG_FLAG, &features, 1, context);
...
// 创建共享内存
char *shared_buf = (char *)cc_malloc_shared_memory(context, BUF_LEN);
...
// 调用ecall函数,对应安全侧函数在enclave/enclave.c中
res = get_string_switchless(context, &retval, shared_buf);
...
// 释放共享内存
res = cc_free_shared_memory(context, shared_buf);
...
// 销毁enclave
res = cc_enclave_destroy(context);
异步switchless调用,在调用ecall函数处变化有如下2点:
// 调用异步ecall函数,对应安全侧函数在enclave/enclave.c中
res = get_string_switchless_async(context, &task_id, &retval, shared_buf);
...
// 根据第一步返回的task_id, 查询异步调用结果
ret = cc_sl_get_async_result(context, task_id, &retval);
...
调用cc_enclave_create时,需传入switcheless特性对应参数“ENCLAVE_FEATURE_SWITCHLESS”,才能正常使用switchless特性。
参考 switchless host/CMakeLists.txt文件
switchless样例的编译工程已经集成codegen的调用,如下。
if(CC_SGX)
set(AUTO_FILES ${CMAKE_CURRENT_BINARY_DIR}/${PREFIX}_u.h ${CMAKE_CURRENT_BINARY_DIR}/${PREFIX}_u.c)
add_custom_command(OUTPUT ${AUTO_FILES}
DEPENDS ${CURRENT_ROOT_PATH}/${EDL_FILE}
COMMAND ${CODEGEN} --${CODETYPE}
--untrusted ${CURRENT_ROOT_PATH}/${EDL_FILE}
--search-path /usr/include/secGear
--search-path ${SDK_PATH}/include)
endif()
开发者在安全侧需要完成:
test_t.h:该头文件为自动生成代码工具codegen通过edl文件生成的头文件,该头文件命名为edl文件名加"_t"。
参考 switchless enclave/CMakeLists.txt文件
使用SIGN_TOOL对编译出的.so文件进行签名。
接口 | 接口说明 |
---|---|
cc_malloc_shared_memory() | 创建安全环境与非安全环境可同时访问的共享内存。 参数: enclave,安全环境上下文句柄。因不同平台共享内存模型不同,同时保持接口跨平台的一致性,该参数仅在ARM平台被使用,SGX平台该入参会被忽略。 size,共享内存大小。 返回值: NULL:共享内存申请失败。 其他:共享内存首地址 |
cc_free_shared_memory() | 释放共享内存。 参数: enclave,安全环境上下文句柄。因不同平台共享内存模型不同,同时保持接口跨平台的一致性,该参数仅在ARM平台被使用(该参数必须与调用cc_malloc_shared_memory接口时传入的enclave保持一致),SGX平台该入参会被忽略。 ptr:cc_malloc_shared_memory接口返回的共享内存地址。 返回值: CC_ERROR_BAD_PARAMETERS,入参非法。 CC_ERROR_INVALID_HANDLE, 无效enclave或者传入的enclave与ptr所对应的enclave不匹配(仅在ARM平台生效,SGX平台会忽略enclave,故不会对enclave进行检查)。 CC_ERROR_NOT_IMPLEMENTED,该接口未实现。 CC_ERROR_SHARED_MEMORY_START_ADDR_INVALID, ptr不是cc_malloc_shared_memory接口返回的共享内存地址(仅在ARM平台生效)。 CC_ERROR_OUT_OF_MEMORY,内存不足(仅在ARM平台生效)。 CC_FAIL,一般性错误。 CC_SUCCESS,成功。 |
cc_sl_get_async_result() | 检查异步调用结果并释放异步调用资源(当前仅支持ARM)。 参数: enclave: 安全环境上下文句柄。 task_id: 异步调用任务编号。 retval: 用于接收返回值的缓冲区。 返回值: CC_SUCCESS,异步调用成功。 CC_ERROR_SWITCHLESS_ASYNC_TASK_UNFINISHED, 异步调用处理中。 CC_ERROR_SWITCHLESS_INVALID_TASK_ID,非法的task_id。 其他,一般性错误。 |
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。