Fiasco是micro kernel,基于其上,一般使用L4作为用户开发环境。n年前,曾想将Fiasco移植为Security OS,TA可以使用L4丰富的开发环境。此篇手稿就是当时的实现需求分析。
TEE-Fiasco实现需求分析
前提:在尽可能复用Op-Tee的client API和Linux Driver的前提下,对L4提的实现需求。
1. 多核模型
- TEE:UP
- REE:SMP
2种发起安全请求方法:
- IPI 中断
- affinity thread
2. S和Ns的切换
NS:
- Irq –>NS
- Fiq–>monitor
S:
- Irq–>S
- Fiq–>S
Monitor:
- 只负责S与NS的切换。
S:Irq
- 将irq抽象为rpc处理的返回结果,由REE处理irq中断后切回TEE。
NS:Fiq
- 在monitor Fiq处理中置Fiq标志,然后切换至S,由S:Fiq中断处理。处理完后作为rpc的结果返回。
小结:即在切换点处, TEE–〉REE方向的数据被抽象为:
- TEE RPC
- TEE处理完REE后RPC Result
同样,REE–〉TEE的数据类似。
3. Rpc
Rpc类似于Client API在TEE的proxy,解析request,处理完后返回结果。
对每一个request,Rpc将相关的调用和参数转换为L4格式,将request转换为L4 IPC,发送给Session server。
由Session Server具体执行请求操作,涉及到load TA,Task的创建,TA回调函数的解析等。
4. Session Server
需要支持多Session并存,Session有各自的state,包括Session的context和task的context。
Session Mem-space: Session Server Mem-space + TA Mem-space
Session Obj-space: Session Server Obj-space + TA Obj-space
Session mem管理:
- 为TA的code/data/stack/heap/params等分配mem空间;
- 维护TA Mem-space: 由于TA的回调需要运行于不同的TASK中,所以需要记录TA Mem-space,以便可以切换至不同的TASK;
- TA Mem-space的回收;
Session Obj管理:
- Session Obj创建:当Client API或TA发起OpenSession请求时;
- Session Obj查询:根据Session Handler或TA UUID,可查询到已经创建的Session Obj;
- Session Obj释放:当Client API或TA发起CLoseSession请求时;
Client:
- Linux kernel;
- REE的common模块;
- REE的Client APP(UUID);
Session Obj涉及的内容:
- TA context,1个session只能对应1个TA;
- 如果是TA->TA的Session,则需记录关联的Client->TA的Session;
- Client相关的信息;
- Session Cancellation相关信息;
5. TA 管理
TA类型:
- Static TA:静态被编译进TEE镜像中;
- User TA:独立编译,后期动态加载;
由于static TA有很强的平台相关性,而User TA则需要考虑到兼容性,所有2者可以有不同的文件结构。
TA加载:
- TA文件的读取:将TA文件从文件系统中读取至mem;
TA加载;
- 可以利用 L4的libloader,重载其相关函数;
- 得到TA的 data-space,由Session维护;
- 解析elf得到TA回调函数指针;
- 将entry地点指向invoke所请求的回调;
- 或者完全实现自己的加载器。
- 可以利用 L4的libloader,重载其相关函数;
TA进程的创建:
libloader在加载完TA后,会创建Task/Thread,以及必须的capability,创建好Env之后,运行新的Task/Thread。- 利用Ned Lua脚本加载TA,其实是利用”rom/l4re”为TA创建Env,然后利用Ldr::Elf_loader加载TA。如果需要使用Lua,则需要修改l4re模块。
TA context:
- 对于multi instance TA,1个TA可以被多个Session同时打开,需要记录打开TA的所有Session Obj;
- TA的code/data/stack/heap的Dataspace,以便可以将TA映射到多个Task mem-space中;
- TA文件头部分指针;
- 如果TA是由REE读取至mem,则记录TA在normal world的物理地址;
- 如果是static TA,则记录其文件头部分指针;
TA格式:
- 如使用OP-Tee所用的TA格式,则需要修改TA的编译环境以及增加user TA lib库,用于解析TA和实现GP的TA interface功能。
6. Session Server & Client
L4的Server&client机制是利用Ipc-gate obj在server和client之间传递IPC消息。当Ned利用Lua加载server/client时,会自动创建”named Ipc-gate” obj,并将之压入双方的Env。
Server运行后,将Server obj 和named Ipc-gate绑定,从而后期发送给server thread的IPC可以重新路由至Server obj。 Client则利用named Ipc-gate向Server Obj发送IPC消息。
Session Client包含:Rpc,TA。则需要在加载此类模块时需要创建Session Ipc-gate,或者由加载器创建;当用Ned加载时,则由Lua创建。