RPMB FS流程
首先说软件的层次结构。
代码主要在optee_os/core/tee/tee_rpmb_fs.c里面,主要有两类函数,分别为rpmb_fs_xxx
和tee_rpmb_xxx
,分别对应了软件的两个层次。
下面从参数类型体会一下。
static TEE_Result rpmb_fs_read(struct tee_file_handle *tfh, size_t pos,
void *buf, size_t *len)
{...}
static TEE_Result tee_rpmb_read(uint16_t dev_id, uint32_t addr, uint8_t *data,
uint32_t len, const uint8_t *fek,
const TEE_UUID *uuid)
{...}
在rpmb_fs_read
的参数中,tfh相当于fread的FILE指针,看起来就和fread很像。在tee_rpmb_read
的参数中,addr是RPMB分区的字节地址。很明显前者是较上层的,是用来处理文件的,而后者是底层的,是直接操作RPMB分区中字节的,这些字节参数就是由前者从文件信息转化来的。前者就是给SVC层用的,SVC拿到下面的rpmb_fs_ops
就可以使用RPMB FS了。
const struct tee_file_operations rpmb_fs_ops = {
.open = rpmb_fs_open,
.create = rpmb_fs_create,
.close = rpmb_fs_close,
.read = rpmb_fs_read,
.write = rpmb_fs_write,
.truncate = rpmb_fs_truncate,
.rename = rpmb_fs_rename,
.remove = rpmb_fs_remove,
.opendir = rpmb_fs_opendir,
.closedir = rpmb_fs_closedir,
.readdir = rpmb_fs_readdir,
};
初始化
对于RPMB,这个文件之外并没有专门的触发初始化的动作,初始化是随着第一次使用RPMB FS完成的。
仔细观察可以发现rpmb_fs_xxx
里面都会经过rpmb_fs_setup
函数,tee_rpmb_xxx
里面都会经过tee_rpmb_init
函数。它们就是两个层次的初始化,前者主要是在第一次烧入镜像或者平时,生成或读取RPMB FS文件系统的元数据等相对抽象的信息,后者主要是生成Secure Key(tee_rpmb_key_gen
)。
网友评论