REE侧就两个,CA通过libteec库访问TA,以及TA通过tee_supplicant访问REE侧资源,这两个都是通过OP-TEE驱动,上文看了libteec,这里来看看tee_supplicant。
tee_supplicant与OP-TEE之间的交互模式类似于生产者与消费者的关系。完成上述需求的整个过程包含驱动接收来自OP-TEE的请求、tee_supplicant从驱动中获取OP-TEE的请求并处理、驱动返回请求操作结果给OP-TEE三部分。其整个过程如图9-4所示。
当libteec库调用驱动来与OP-TEE进行数据的交互时,最终会调用optee_do_call_with_arg函数完成安全监控模式调用(smc)的操作,该函数中有一个无限循环,每次触发安全监控模式调用后会从安全世界状态(SWS)中返回的参数res.a0中获取到返回值,以此来判定当前从安全世界状态返回的数据是要执行RPC操作还是直接返回到CA。
如果是来自OP-TEE的RPC请求,则会将请求存放到请求队列req中,然后block住,直到tee_supplicant处理完请求并将req->c标记为完成状态后才会进入下一个loop,重新触发安全监控模式调用,将处理结果返回给OP-TEE。
1 接收OP-TEE的RPC请求(OP-TEE驱动)
当libteec库触发安全监控模式调用后,最终会调用OP-TEE驱动的optee_do_call_with_arg函数,该函数会进入到死循环,第一条语句会采用安全监控模式调用