在现代多核处理器架构中,缓存一致性协议是确保系统正确运行的关键技术。ARM公司开发的CHI(Coherent Hub Interface)协议作为AMBA 5规范的一部分,为多核SoC设计提供了高效的缓存一致性解决方案。CHI协议通过定义精细的请求类型和状态转换规则,实现了处理器集群中各级缓存之间的数据同步。
CHI协议架构主要包含三类节点:
协议通过事务包(Transaction Packet)在这些节点间传递消息,每个事务包含:
CHI协议定义了7种基本缓存状态,用两个字母缩写表示:
| 状态 | 全称 | 描述 |
|---|---|---|
| UD | Unique Dirty | 唯一且被修改的副本 |
| UC | Unique Clean | 唯一且干净的副本 |
| SD | Shared Dirty | 共享且被修改的副本 |
| SC | Shared Clean | 共享且干净的副本 |
| I | Invalid | 无效状态 |
| UDP | Unique Dirty Pending | 等待确认的唯一脏状态 |
| UCE | Unique Clean Exclusive | 独占的干净副本 |
状态转换遵循MESI协议的扩展规则,但增加了对持久化内存和原子操作的特殊支持。例如,CleanSharedPersist状态表示数据已持久化到非易失性存储,而MakeInvalid操作强制使缓存行无效。
Dataless请求是不携带数据的控制类操作,主要用于缓存状态管理。表B4.9和B4.10展示了HN-F到SN-F以及HN-I到SN-I的Dataless请求属性:
markdown复制| 属性字段 | 说明 |
|----------|------|
| Size | 固定64字节 |
| Excl | 独占访问标志 |
| SnpAttr | 监听属性 |
| MemAttr | 内存类型属性 |
| Order | 排序要求 |
| LikelyShared | 共享可能性提示 |
| ExpCompAck | 需要显式完成确认 |
典型Dataless请求包括:
注意:Dataless请求的初始缓存状态必须符合表B4.11的规定。例如CleanUnique请求允许从UD/UC/SD/SC/I状态发起,但不能从UDP/UCE状态发起。
立即写事务直接将数据从请求节点传输到归属节点,无需先获取数据的所有权。主要子类型包括:
WriteNoSnp系列:
WriteUnique系列:
c复制// 示例:WriteUniqueFull的典型使用场景
void atomic_write(uint64_t *addr, uint64_t val) {
// 1. 确保缓存行处于Invalid状态
clean_invalidate_cache_line(addr);
// 2. 执行WriteUniqueFull
*addr = val; // 生成WriteUniqueFull事务
}
回写事务将一致性数据从缓存移动到下一级缓存或内存,不需要监听其他节点:
| 类型 | 数据状态 | 保留副本 | 适用场景 |
|---|---|---|---|
| WriteBackFull | Dirty | 否 | 常规回写 |
| WriteCleanFull | Dirty | 是 | 写回但保留干净副本 |
| WriteEvictFull | Clean | 否 | 缓存行逐出 |
关键区别:WriteBack会放弃数据所有权,而WriteClean在写回后仍保留可用的干净副本。
原子事务将操作而非数据移动到数据所在位置,显著提升原子操作的性能。CHI支持四种原子事务:
AtomicStore:执行操作并更新内存,不返回旧值
AtomicLoad:执行操作并返回旧值
AtomicSwap:交换内存和寄存器值
AtomicCompare:比较并交换(CAS)
assembly复制; ARMv8 CAS操作与CHI AtomicCompare的对应关系
CAS Xd, Xn, [Xa] ; 架构指令
=> AtomicCompare Xa, Xn(old), Xd(new) ; CHI事务
原子事务的属性控制特别重要:
CHI允许将写请求与缓存维护操作(CMO)组合,减少事务数量。表B4.19展示了合法组合:
| 写类型 | CleanShared | CleanInvalid | MakeInvalid |
|---|---|---|---|
| WriteNoSnpFull | ✓ | ✓ | ✓ |
| WriteUniqueFull | ✓ | ✗ | ✓ |
| WriteBackFull | ✓ | ✓ | ✗ |
典型应用场景:
MemAttr字段控制事务的内存类型行为:
| 编码 | 内存类型 | 特性 |
|---|---|---|
| 0000 | Device-nGnRnE | 严格设备内存 |
| 0101 | Normal Non-cacheable | 普通非缓存 |
| 1101 | Normal Write-Back | 普通回写缓存 |
SnpAttr字段控制监听行为:
CHI为持久化内存设计了特殊操作:
表B4.12和B4.13严格规定了请求完成时的缓存状态:
LikelyShared提示:帮助归属节点预测共享状态,减少监听过滤查询
DWT(Data-Write Transfer):允许数据直接从请求节点传输到从属节点
PrefetchTgt:预取目标事务
协议违反错误:
性能瓶颈:
持久化问题:
使用CHI原子事务实现自旋锁:
c复制void spin_lock(uint32_t *lock) {
while(AtomicSwap(lock, 1) == 1)
; // 忙等待
}
void spin_unlock(uint32_t *lock) {
AtomicStore(lock, 0); // 使用STCLR操作
}
CHI持久化操作在数据库日志中的应用:
c复制void write_transaction_log(LogEntry *entry) {
// 1. 写入日志数据
WriteNoSnpFull(entry);
// 2. 持久化操作
CleanSharedPersist(&entry->header);
// 3. 等待持久化确认
wait_for_persist_ack();
}
CHI支持ARM MTE的内存安全特性:
在调试内存错误时,可以结合CHI协议的缓存状态信息和MTE标签,精确定位越界访问或使用后释放等问题。