日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

TEEC_Context和TEEC_InitializeContext介绍

發布時間:2025/3/21 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 TEEC_Context和TEEC_InitializeContext介绍 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

思考:
TEEC_InitializeContext做了哪些事情?
TEEC_Context是干什么用的?
Userspace的TEEC_Context、Kernel Space的tee_context的區別?

本質(最佳理解): Represents a connection between a client application and a TEE

1、從UserSpace角度來看Context

本質 :在調用TEEC_InitializeContext時,上層返回一個ctx結構體,該結構體中有三個元素,其中fd是open返回的文件描述符,另外兩個元素有上層hardcoding. filename/fd和kernel層的inode—device綁定. 在Kernel層,也有一個Kernel層的ctx結構體(與Userspace的不一樣),該結構體會在Kernel層填充。TEEC_InitializeContext函數調用,在Kernel層就結束,不會進入TEE.

TEEC_InitializeContext返回一個TEEC_Context結構體,該結構體有三個元素:

  • fd : Userpace通過open調用Kernel返回的文件描述符(如下圖所示,fd和Kernel層的tee_device綁定起來)
  • reg_mem
  • memref_null
(optee_client/public/tee_client_api.h)/*** struct TEEC_Context - Represents a connection between a client application* and a TEE.*/ typedef struct {/* Implementation defined */int fd;bool reg_mem;bool memref_null; } TEEC_Context; (optee_client/libteec/src/tee_client_api.c) TEEC_Result TEEC_InitializeContext(const char *name, TEEC_Context *ctx) {char devname[PATH_MAX] = { 0 };int fd = 0;size_t n = 0;if (!ctx)return TEEC_ERROR_BAD_PARAMETERS;for (n = 0; n < TEEC_MAX_DEV_SEQ; n++) {uint32_t gen_caps = 0;snprintf(devname, sizeof(devname), "/dev/tee%zu", n);fd = teec_open_dev(devname, name, &gen_caps);if (fd >= 0) {ctx->fd = fd;ctx->reg_mem = gen_caps & TEE_GEN_CAP_REG_MEM;ctx->memref_null = gen_caps & TEE_GEN_CAP_MEMREF_NULL;return TEEC_SUCCESS;}}return TEEC_ERROR_ITEM_NOT_FOUND; }static int teec_open_dev(const char *devname, const char *capabilities,uint32_t *gen_caps) {int fd = 0;struct tee_ioctl_version_data vers;memset(&vers, 0, sizeof(vers));fd = open(devname, O_RDWR);if (fd < 0)return -1;if (ioctl(fd, TEE_IOC_VERSION, &vers)) {EMSG("TEE_IOC_VERSION failed");goto err;}/* We can only handle GP TEEs */if (!(vers.gen_caps & TEE_GEN_CAP_GP))goto err;if (capabilities) {if (strcmp(capabilities, "optee-tz") == 0) {if (vers.impl_id != TEE_IMPL_ID_OPTEE)goto err;if (!(vers.impl_caps & TEE_OPTEE_CAP_TZ))goto err;} else {/* Unrecognized capability requested */goto err;}}*gen_caps = vers.gen_caps;return fd;err:close(fd);return -1;}

Userspace調用KernelSpace的open device流程:

2、Kernel Space中的tee_context

在teedev_open講tee_device填充到teedev. 其它元素在后續使用時填充

struct tee_context {struct tee_device *teedev;void *data;struct kref refcount;bool releasing;bool supp_nowait;bool cap_memref_null; }; static struct tee_context *teedev_open(struct tee_device *teedev) {int rc;struct tee_context *ctx;if (!tee_device_get(teedev))return ERR_PTR(-EINVAL);ctx = kzalloc(sizeof(*ctx), GFP_KERNEL);if (!ctx) {rc = -ENOMEM;goto err;}kref_init(&ctx->refcount);ctx->teedev = teedev;rc = teedev->desc->ops->open(ctx);if (rc)goto err;return ctx; err:kfree(ctx);tee_device_put(teedev);return ERR_PTR(rc);}

3、代碼使用示例

TEEC_Context teec_ctx;
TEEC_Session session = { .ctx = 0 };

1、TEEC_InitializeContext(_device, &teec_ctx); // 初始化一個Context,表示此Application和TEE的連接

2、TEEC_OpenSession(&teec_ctx, session, uuid, TEEC_LOGIN_PUBLIC, NULL, op, ret_orig); // open session,表示此Application和TA的連接

3、TEEC_InvokeCommand(session, TA_ZHOUHEHE_CMD_1, &op, &ret_orig);

4、TEEC_CloseSession(session);

5、TEEC_FinalizeContext(&teec_ctx); // 終止Context

總結

以上是生活随笔為你收集整理的TEEC_Context和TEEC_InitializeContext介绍的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。