libteec 3
来源:互联网 发布:中文翻译意大利语软件 编辑:程序博客网 时间:2024/06/06 17:31
TEEC_RegisterSharedMemory 用于在TA和CA之前注册一个共享内存
TEEC_Result TEEC_RegisterSharedMemory(TEEC_Context *ctx, TEEC_SharedMemory *shm)
{
int fd;
size_t s;
if (!ctx || !shm)
return TEEC_ERROR_BAD_PARAMETERS;
if (!shm->flags || (shm->flags & ~(TEEC_MEM_INPUT | TEEC_MEM_OUTPUT)))
return TEEC_ERROR_BAD_PARAMETERS;
s = shm->size;
if (!s)
s = 8;
//在teec_shm_alloc 中通过ioctl命令TEE_IOC_SHM_ALLOC来share memory的fd
fd = teec_shm_alloc(ctx->fd, s, &shm->id);
if (fd < 0)
return TEEC_ERROR_OUT_OF_MEMORY;
//对teec_shm_alloc 返回fd的地址做mmap
shm->shadow_buffer = mmap(NULL, s, PROT_READ | PROT_WRITE, MAP_SHARED,
fd, 0);
close(fd);
if (shm->shadow_buffer == (void *)MAP_FAILED) {
shm->id = -1;
return TEEC_ERROR_OUT_OF_MEMORY;
}
shm->alloced_size = s;
shm->registered_fd = -1;
return TEEC_SUCCESS;
}
static int teec_shm_alloc(int fd, size_t size, int *id)
{
int shm_fd;
struct tee_ioctl_shm_alloc_data data;
memset(&data, 0, sizeof(data));
data.size = size;
shm_fd = ioctl(fd, TEE_IOC_SHM_ALLOC, &data);
if (shm_fd < 0)
return -1;
*id = data.id;
return shm_fd;
}
通过TEEC_RegisterSharedMemory 可知要申请sharememory的话,首先要申请一个share fd,然后对这个fd再做mmap就可以。如果TA和CA之间通过共享文件来通信的话,就不需要做mmap了。optee提供的共享文件的注册函数如下:
TEEC_Result TEEC_RegisterSharedMemoryFileDescriptor(TEEC_Context *ctx,
TEEC_SharedMemory *shm,
int fd)
{
struct tee_ioctl_shm_register_fd_data data;
int rfd;
if (!ctx || !shm || fd < 0)
return TEEC_ERROR_BAD_PARAMETERS;
if (!shm->flags || (shm->flags & ~(TEEC_MEM_INPUT | TEEC_MEM_OUTPUT)))
return TEEC_ERROR_BAD_PARAMETERS;
memset(&data, 0, sizeof(data));
data.fd = fd;
rfd = ioctl(ctx->fd, TEE_IOC_SHM_REGISTER_FD, &data);
if (rfd < 0)
return TEEC_ERROR_BAD_PARAMETERS;
shm->buffer = NULL;
shm->shadow_buffer = NULL;
shm->registered_fd = rfd;
shm->id = data.id;
shm->size = data.size;
return TEEC_SUCCESS;
}
注册了sharememory后,要使用的话还是要先通过TEEC_AllocateSharedMemory来申请
TEEC_Result TEEC_AllocateSharedMemory(TEEC_Context *ctx, TEEC_SharedMemory *shm)
{
int fd;
size_t s;
if (!ctx || !shm)
return TEEC_ERROR_BAD_PARAMETERS;
if (!shm->flags || (shm->flags & ~(TEEC_MEM_INPUT | TEEC_MEM_OUTPUT)))
return TEEC_ERROR_BAD_PARAMETERS;
s = shm->size;
if (!s)
s = 8;
fd = teec_shm_alloc(ctx->fd, s, &shm->id);
if (fd < 0)
return TEEC_ERROR_OUT_OF_MEMORY;
shm->buffer = mmap(NULL, s, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
close(fd);
if (shm->buffer == (void *)MAP_FAILED) {
shm->id = -1;
return TEEC_ERROR_OUT_OF_MEMORY;
}
shm->shadow_buffer = NULL;
shm->alloced_size = s;
shm->registered_fd = -1;
return TEEC_SUCCESS;
}
和注册类似,申请也是分为两部,第一通过ioctl 命令TEE_IOC_SHM_ALLOC申请fd,然后通过mmap映射
static int teec_shm_alloc(int fd, size_t size, int *id)
{
int shm_fd;
struct tee_ioctl_shm_alloc_data data;
memset(&data, 0, sizeof(data));
data.size = size;
shm_fd = ioctl(fd, TEE_IOC_SHM_ALLOC, &data);
if (shm_fd < 0)
return -1;
*id = data.id;
return shm_fd;
}
释放sharememory的话,同样分为两部,第一部先做munmap 操作,第二部关掉对应的fd
void TEEC_ReleaseSharedMemory(TEEC_SharedMemory *shm)
{
if (!shm || shm->id == -1)
return;
if (shm->shadow_buffer)
munmap(shm->shadow_buffer, shm->alloced_size);
else if (shm->buffer)
munmap(shm->buffer, shm->alloced_size);
else if (shm->registered_fd >= 0)
close(shm->registered_fd);
shm->id = -1;
shm->shadow_buffer = NULL;
shm->buffer = NULL;
shm->registered_fd = -1;
}
TEEC_Result TEEC_RegisterSharedMemory(TEEC_Context *ctx, TEEC_SharedMemory *shm)
{
int fd;
size_t s;
if (!ctx || !shm)
return TEEC_ERROR_BAD_PARAMETERS;
if (!shm->flags || (shm->flags & ~(TEEC_MEM_INPUT | TEEC_MEM_OUTPUT)))
return TEEC_ERROR_BAD_PARAMETERS;
s = shm->size;
if (!s)
s = 8;
//在teec_shm_alloc 中通过ioctl命令TEE_IOC_SHM_ALLOC来share memory的fd
fd = teec_shm_alloc(ctx->fd, s, &shm->id);
if (fd < 0)
return TEEC_ERROR_OUT_OF_MEMORY;
//对teec_shm_alloc 返回fd的地址做mmap
shm->shadow_buffer = mmap(NULL, s, PROT_READ | PROT_WRITE, MAP_SHARED,
fd, 0);
close(fd);
if (shm->shadow_buffer == (void *)MAP_FAILED) {
shm->id = -1;
return TEEC_ERROR_OUT_OF_MEMORY;
}
shm->alloced_size = s;
shm->registered_fd = -1;
return TEEC_SUCCESS;
}
static int teec_shm_alloc(int fd, size_t size, int *id)
{
int shm_fd;
struct tee_ioctl_shm_alloc_data data;
memset(&data, 0, sizeof(data));
data.size = size;
shm_fd = ioctl(fd, TEE_IOC_SHM_ALLOC, &data);
if (shm_fd < 0)
return -1;
*id = data.id;
return shm_fd;
}
通过TEEC_RegisterSharedMemory 可知要申请sharememory的话,首先要申请一个share fd,然后对这个fd再做mmap就可以。如果TA和CA之间通过共享文件来通信的话,就不需要做mmap了。optee提供的共享文件的注册函数如下:
TEEC_Result TEEC_RegisterSharedMemoryFileDescriptor(TEEC_Context *ctx,
TEEC_SharedMemory *shm,
int fd)
{
struct tee_ioctl_shm_register_fd_data data;
int rfd;
if (!ctx || !shm || fd < 0)
return TEEC_ERROR_BAD_PARAMETERS;
if (!shm->flags || (shm->flags & ~(TEEC_MEM_INPUT | TEEC_MEM_OUTPUT)))
return TEEC_ERROR_BAD_PARAMETERS;
memset(&data, 0, sizeof(data));
data.fd = fd;
rfd = ioctl(ctx->fd, TEE_IOC_SHM_REGISTER_FD, &data);
if (rfd < 0)
return TEEC_ERROR_BAD_PARAMETERS;
shm->buffer = NULL;
shm->shadow_buffer = NULL;
shm->registered_fd = rfd;
shm->id = data.id;
shm->size = data.size;
return TEEC_SUCCESS;
}
注册了sharememory后,要使用的话还是要先通过TEEC_AllocateSharedMemory来申请
TEEC_Result TEEC_AllocateSharedMemory(TEEC_Context *ctx, TEEC_SharedMemory *shm)
{
int fd;
size_t s;
if (!ctx || !shm)
return TEEC_ERROR_BAD_PARAMETERS;
if (!shm->flags || (shm->flags & ~(TEEC_MEM_INPUT | TEEC_MEM_OUTPUT)))
return TEEC_ERROR_BAD_PARAMETERS;
s = shm->size;
if (!s)
s = 8;
fd = teec_shm_alloc(ctx->fd, s, &shm->id);
if (fd < 0)
return TEEC_ERROR_OUT_OF_MEMORY;
shm->buffer = mmap(NULL, s, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
close(fd);
if (shm->buffer == (void *)MAP_FAILED) {
shm->id = -1;
return TEEC_ERROR_OUT_OF_MEMORY;
}
shm->shadow_buffer = NULL;
shm->alloced_size = s;
shm->registered_fd = -1;
return TEEC_SUCCESS;
}
和注册类似,申请也是分为两部,第一通过ioctl 命令TEE_IOC_SHM_ALLOC申请fd,然后通过mmap映射
static int teec_shm_alloc(int fd, size_t size, int *id)
{
int shm_fd;
struct tee_ioctl_shm_alloc_data data;
memset(&data, 0, sizeof(data));
data.size = size;
shm_fd = ioctl(fd, TEE_IOC_SHM_ALLOC, &data);
if (shm_fd < 0)
return -1;
*id = data.id;
return shm_fd;
}
释放sharememory的话,同样分为两部,第一部先做munmap 操作,第二部关掉对应的fd
void TEEC_ReleaseSharedMemory(TEEC_SharedMemory *shm)
{
if (!shm || shm->id == -1)
return;
if (shm->shadow_buffer)
munmap(shm->shadow_buffer, shm->alloced_size);
else if (shm->buffer)
munmap(shm->buffer, shm->alloced_size);
else if (shm->registered_fd >= 0)
close(shm->registered_fd);
shm->id = -1;
shm->shadow_buffer = NULL;
shm->buffer = NULL;
shm->registered_fd = -1;
}
阅读全文
0 0
- libteec 3
- libteec 1
- libteec 2
- 21. OP-TEE中TA与CA执行流程-------libteec介绍
- 26. OP-TEE驱动篇----libteec和tee_supplicant调用驱动流程和重要结构体
- 27. OP-TEE驱动篇----libteec接口在驱动中的实现
- 3
- 3
- 3
- 3
- 3
- (3)
- 3
- 3
- 3
- 3
- 3
- 3
- 标签: javaexceptionstringfilebi
- Fresco最强图片加载框架详解及使用
- GridControl应用点滴之选中数据行事件
- retrofit文件上传和拦截器使用
- Java机器学习库ML之二Feature Selection(特征选择)
- libteec 3
- php7.1+nginx + kohana
- 自定义事件
- JavaScript 正则
- 关于微信支付返回-1的浅谈
- java验证码识别--5
- Java中线程池ExecutorService详细
- paper-image/video segmentation
- 作业(Job)内核对象