libteec 3

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值