Secure IPC
Secure IPC 基于会话模式,在客户端和 RoT 服务之间建立连接。 IPC 消息基于请求应答模型
IPC 的设计在客户端和 RoT 服务之间建立共享内存
RoT 服务不能够直接访问客户端内存
Isolation architecture
Secure Partition
Secure Partition excution
每个 Secure Partition 都运行在一个由 SPM 管理的单一线程。
一个 Secure Partition 从一个在 manifest 里面定义的 entry_point 符号开始执行。
初始化完成以后, Secure Partition 线程必须是一个循环,并且在等待输入。
一个 Secure Partition 永远不会退出循环或者从 entry_point 返回。如果这样做会产生一个变成错误。如果 Secure Partition 被中断,该 Secure Partition 会从被打断的位置恢复上下文并继续执行。Secure Partition 的输入都是以信号的形式存在。每个信号代表一个特定的输入源。
信号
信号是发送给 Secure Partition 一个异步的通知,用来通知有一个输入请求处理。每一个 Secure Partition 有32个不同的信号。一个信号由一个32位整型中的一个比特位表示。
信号类型 | 目标 | 何时断言 |
---|---|---|
RoT 服务 | 主要用于 PSA 固件框架中的 IPC 机制 | 一个消息在 RoT 服务排队 |
中断 | 管理 Secure Partition 中的硬件中断 | 一个边界中断行会被断言 |
门铃 doorbell | 用于 Secure Partition 之间的通知机制 | 一个 Secure Partition 会通知这一类型的信号 |
未分配 | 这类信号不会在 Secure Partition 中被使用 | 永不 |
保留 | 这类信号为未来的使用保留 | 永不 |
\ | ||
以下信号会被保留,用于 Secure Partitions | ||
信号 number | 描述 | |
— | — | |
0x00000001U | Reserved | |
0x00000002U | Reserved | |
0x00000004U | Reserved | |
0x00000008U | Reserved | |
剩下的28个通用信号可以被用于的 Secure Partition 的其他输入。同一个信号对于不同的 Secure Partition 可能会有不同的作用。 | ||
在 Secure Partition manifest 中列出了 Secure Partition 用到的所有中断,RoT 服务以及信号名称。 |
调度 Secure Partitions
PSA 固件框架允许多客户端在同一时间请求一个或者多个 RoT 服务或者发送一个或多个中断信号。这时由 SPM 来决定如何去执行这些被请求的 Secure Partitions。
SPM 必须满足以下要求:
- 分发所有的 RoT 服务消息给目标 Secure Partitions
- 执行已有一个或多个信号需要处理的 Secure Partitions
SPM 在满足这些需求上面具有灵活性。这个灵活性允许一个较为简单的 SPM 在资源受限的设备上实现,也可以在一些资源充足的设备上实现一个较为复杂的,具有抢占式调度的 SPM。
SPM 实现不需要支持对 Secure Partitions 的公平调度。
调度规则
SPM 的实现必须满足以下的调度需求:
- 如何 NSPE 是空闲的而且没有 Secure Partition 准备运行,这时 SPM 必须运行一个 Secure Partitons。
- 当一个 Secure Partitions 被抢占,它的上下文必须被保存,以便下次切换回来的时候能够恢复执行。这个上下文可以被硬件保存,也可以被软件保存。
RoT Services
信任根服务( Root of Trust Services,RoT)是实现在 Secure Partition 里面的提供给客户端或者其他 Secure Partition 的服务。它的架构图如下图所示。
SPM 实现需要注意:
客户端 API 不仅可以被 NSPE 中的任务使用,也可以被 Secure Partitions使用。
客户端 API 函数的实现在在不同安全区域会有所不同。
- 在 Non-secure 客户端中使用的客户端 API 需要将请求发送给 SPM。
- 在 Secure Partition 客户端中使用的客户端 API 可以直接使用 SPM 服务。
定义 RoT 服务
一些 RoT 服务的属性必须在 Secure Partition manifest 文件中定义。这些属性包括 识别符,版本,以及授权的访问。
一个 RoT 服务由一个 RoT Service ID(SID)决定。一个 SID 是一个32位的整型,并且在 Secure Partition manifest 中与一个符号名字相关联。
RoT 的 SID 定义类似于 MAC 地址,[32:12]位用于定义 Vender ID。
使用 RoT 服务
IPC 框架下的客户端 API 十分简单,由以下三个主要的函数组成:
- psa_psa_connect() 建立一个 IPC 连接。
- psa_call() 发送请求给一个 IPC 连接。
- psa_close() 终止一个 IPC 连接。
处理 RoT 服务消息
消息类型
SPM 通过分发 IPC 消息给 Secure Partition 来管理来自客户端的连接并且处理其请求。一共有三种消息的类型如下表所示。
|消息类型|消息值|描述|
|—-|—-|—–|
|Connection|PSA_IPC_CONNECT|由 psa_connect() 发送来建立一个新的连接。|
|Request|>=0|由 psa_call() 来发送一个请求,这个值由 caller 提供|
|Disconnection|PSA_IPC_DISCONNECT|由 psa_close() 来结束一个连接。|
处理消息
RoT 服务不能直接访问客户端的参数。输入的参数一般通过psa_read()将输入参数拷贝到 Secure Partition 的私有内存之中,处理结束之后再用psa_write()将响应拷贝到输出的参数。
参数可以是输入或者是输出的,但是不能又是输入又是输出。