ARM DTI-TBU协议是ARMv8架构中用于处理地址翻译的核心机制,它定义了翻译请求、响应和故障处理的完整流程。作为现代SoC设计中的关键组件,DTI-TBU协议在虚拟化环境和安全敏感系统中扮演着重要角色。
在计算机体系结构中,内存管理单元(MMU)通过地址翻译机制实现虚拟地址到物理地址的转换。ARM的DTI-TBU协议对这一过程进行了标准化定义,特别是在多级翻译和缓存管理方面提供了精细控制。该协议主要应用于ARM的System MMU(SMMU)实现中,用于管理设备发起的DMA操作的内存访问权限和地址翻译。
DTI-TBU协议的核心特点包括:
DTI_TBU_TRANS_FAULT消息是协议中用于处理翻译故障的核心机制。当翻译请求因权限检查失败或其他原因无法完成时,DTI从设备会发送此消息给主设备。
消息格式的关键字段包括:
code复制0 7 15 23 31
| SLV_MSG_TYPE | TRANSLATION_ID |
| CONT | FAULT_TYPE | DO_NOT_CACHE |
| Reserved |
FAULT_TYPE字段(位[18:17])决定了主设备如何处理故障,支持四种模式:
NonAbort(00):非中止故障
Abort(01):中止故障
StreamDisabled(10):流禁用
GlobalDisabled(11):全局禁用
重要约束:当翻译请求中的ATST=1时,FAULT_TYPE不能设为GlobalDisabled;当REQ.PERM[1:0]为SPEC时,不能设为Abort。
对于不同类型的故障,处理流程如下:
NonAbort处理:
Abort处理:
StreamDisabled处理:
GlobalDisabled处理:
翻译故障通常在以下情况下触发:
权限不匹配:
安全状态冲突:
无效地址或配置:
权限检查的上下文计算涉及多个因素:
c复制effective_InD = ((RESP.INSTCFG == "Use incoming") && REQ.InD)
|| (RESP.INSTCFG == "Instruction");
effective_PnU = ((RESP.PRIVCFG == "Use incoming") && REQ.PnU)
|| (RESP.PRIVCFG == "Privileged");
effective_NS = RESP.NSOVR ? RESP.NS : REQ.NS;
DTI-TBU协议通过多个字段实现精细的缓存控制:
DO_NOT_CACHE位(位12):
CONT字段(位[16:13]):
缓存一致性规则:
缓存失效主要发生在以下情况:
显式无效化命令:
安全状态变更:
故障处理时:
协议定义了丰富的无效化操作:
| 操作编码 | 类型 | 作用范围 |
|---|---|---|
| 0x80 | TLBI_S_EL1_ALL | 安全EL1全部TLB |
| 0xA0 | TLBI_NS_EL1_ALL | 非安全EL1全部TLB |
| 0x00 | CFGI_S_ALL | 安全配置缓存 |
| 0x20 | CFGI_NS_ALL | 非安全配置缓存 |
| 0x06 | INV_ALL | 全局无效化 |
翻译响应中的事务属性通过多步计算得出:
默认分配提示:
内存类型覆盖:
分配提示修改:
共享性修改:
属性组合:
一致性检查:
MemAttr字段的编码规范:
| 编码 | 内存类型 | 内部缓存性 | 外部缓存性 |
|---|---|---|---|
| 0b0000 | Device-nGnRnE | - | - |
| 0b0101 | Normal | Non-cacheable | Non-cacheable |
| 0b1011 | Normal | Write-Back | Write-Through |
| 0b1111 | Normal | Write-Back | Write-Back |
使用场景:
缓存行为:
约束条件:
推测性读事务的故障处理有别于常规事务:
总是终止于中止:
不影响软件状态:
权限检查延迟:
完整的无效化流程分为三个阶段:
无效化请求阶段:
同步请求阶段:
同步确认阶段:
为避免死锁,协议规定:
不等待未完成翻译:
无效化操作独立性:
合理设置CONT字段:
缓存策略选择:
推测翻译使用:
故障处理配置:
隔离保证:
权限检查:
故障诊断:
缓存问题排查:
事务属性验证: