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;
}