TPM(Trusted Platform Module)服务中的CRB(Command-Response Buffer)接口是一种基于内存映射的命令交互机制,它遵循TCG(Trusted Computing Group)的PTP(PC Client Platform TPM Profile)规范。这种设计允许客户端通过直接读写内存区域来与TPM服务进行高效通信,避免了频繁的系统调用开销。
在物理内存中,CRB接口被划分为五个独立的区域(Locality 0-4),每个区域对应不同的安全等级和访问权限。根据TCG PTP规范要求:
实际部署时,系统固件需要确保:
c复制// 典型的内存映射配置示例
#define CRB_LOCALITY_0_BASE 0xFD000000
#define CRB_LOCALITY_1_BASE 0xFD000400
#define CRB_LOCALITY_2_BASE 0xFD000800
#define CRB_LOCALITY_3_BASE 0xFD000C00
#define CRB_LOCALITY_4_BASE 0xFE800000 // 单独的安全内存区域
每个Locality的CRB结构包含三个关键部分:
Locality控制寄存器:管理区域访问权限和状态
LocalityState:当前区域状态(空闲/请求/激活)AccessGrant:访问授权标志位RequestPending:请求挂起状态CRB控制区:命令处理控制
CMD_SIZE:命令数据大小CMD_ADDR:命令缓冲区地址RESP_ADDR:响应缓冲区地址START_BIT:启动处理标志数据缓冲区:实际存储TPM命令和响应的区域
特别注意:Locality 4的控制字段定义与其他区域不同,这是由于其专用于DRTM(动态信任根测量)等高安全操作。
当客户端需要发送TPM命令时,必须遵循严格的访问协议:
请求访问权限
RequestAccess位assembly复制; 示例:设置Locality 2的访问请求
MOV x0, #0xFD000800 ; Locality 2基址
LDR w1, [x0, #LOC_CTRL] ; 读取当前控制值
ORR w1, w1, #0x02 ; 设置RequestAccess位
STR w1, [x0, #LOC_CTRL] ; 写回寄存器
准备命令数据
触发命令处理
MSG_SEND_DIRECT_REQ调用Start方法等待完成
TPM服务在收到Start通知后:
关键点:TPM服务必须保持CRB状态的一致性,即使前一个客户端恶意修改了CRB内容,服务也应能恢复有效状态。
客户端使用FF-A通知需要完成以下步骤:
查询功能支持
get_feature_info函数检查通知功能c复制// 功能查询示例
struct ffa_value ret = ffa_call(TPM_FID_GET_FEATURE_INFO,
FEATURE_ID_NOTIFICATION,
0, 0);
if (ret.w4 != TPM_STATUS_OK) {
// 不支持通知功能
}
绑定通知ID
FFA_NOTIFICATION_BIND分配通知ID注册TPM服务
register_for_notification配置中断控制
完整的通知交互包含以下阶段:
FFA_NOTIFICATION_SETfinish_notified完成处理mermaid复制sequenceDiagram
participant Client
participant TPM Service
Client->>TPM Service: Start Request (FFA_MSG_SEND_DIRECT_REQ)
TPM Service->>Client: Immediate Response
TPM Service->>TPM Service: Process Command
TPM Service->>Client: FFA_NOTIFICATION_SET
Client->>TPM Service: finish_notified
TPM Service->>Client: Final Status
动态信任根测量(DRTM)事件通过Locality 4触发,代表系统进入可信状态。其处理流程具有以下特点:
独占性访问:
系统级影响:
严格时序要求:
典型DRTM序列示例:
TPM服务的TCB(Trusted Computing Base)包含:
| 组件 | 信任要求 |
|---|---|
| FF-A Partition Manager | 必须完全可信 |
| EL3固件 | 必须完全可信 |
| TPM设备/模拟器 | 必须隔离访问 |
| CRB内存区域 | 根据Locality分级保护 |
模式1:物理TPM设备
模式2:固件TPM模拟
Start调用失败
通知未接收
DRTM执行错误
对于耗时操作,推荐采用:
python复制def async_command_processing():
# 客户端设置
setup_crb_command()
send_start_request()
# 异步等待
while True:
if check_notification():
handle_response()
break
elif timeout():
handle_error()
break
通过组合多个操作为一个原子请求:
对于频繁访问的数据:
在实际部署中,我们发现合理配置CRB内存属性(如设置nGnRnE)可以提升15%-20%的吞吐量。同时,将Locality 0-3配置在相邻内存区域能减少TLB缺失率。