在ARM架构的多核处理器系统中,缓存维护操作(Cache Maintenance Operations,简称CMO)是确保数据一致性的关键技术。这些操作通过AXI总线协议实现,允许处理器主动管理缓存行的状态,解决多核共享内存访问时的数据一致性问题。
缓存维护操作的核心价值体现在三个方面:
在AXI协议中,CMO通过特定的信号编码实现。例如,CleanSharedPersist事务使用AWSNOOP=0b1010表示,而CleanInvalidPoPA则使用AWCMO=0b100编码。这些编码方案经过精心设计,可以在不增加过多信号线的情况下支持丰富的操作类型。
提示:AXI协议中的CMO事务分为独立操作和写操作组合两种形式。独立操作通过CMO事务类型实现,而组合操作则通过WritePtlCMO或WriteFullCMO与AWCMO信号配合完成。
CleanSharedPersist是AXI5协议中为持久性内存设计的关键操作,其典型时序如图A9.2所示。该操作确保数据不仅被清理到末级缓存(LLC),还进一步持久化到非易失性存储器中。整个流程分为四个关键阶段:
请求发起阶段:
缓存一致性阶段:
持久化阶段:
完成确认:
c复制// 典型的使用场景示例
void persist_data(void* addr, size_t size) {
// 执行缓存维护指令
asm volatile("DC CIVAC, %0" : : "r"(addr) : "memory");
// 内存屏障确保顺序性
asm volatile("DSB SY");
// 等待持久化完成
asm volatile("DC CVAP, %0" : : "r"(addr) : "memory");
}
AXI协议允许在读写通道上传输CMO,但存在重要区别:
| 特性 | 读通道CMO | 写通道CMO |
|---|---|---|
| 支持的操作类型 | 仅CleanSharedPersist | 支持所有PCMO类型 |
| 信号编码 | ARSNOOP=0b1010 | AWCMO=0b010/0b011 |
| 响应机制 | 单一R通道响应 | B通道响应 |
| 持久性控制 | 依赖Persist_CMO属性 | 直接通过AWCMO编码控制 |
当Persist_CMO属性为False时,读通道禁止使用CleanSharedPersist操作。这种设计确保了系统的灵活性,允许实现根据具体需求选择支持的功能集。
Realm Management Extension (RME)引入了物理地址别名点(Point of Physical Aliasing,PoPA)的概念,这是系统中所有Agent都能观察到数据的节点,不受物理地址空间限制。CleanInvalidPoPA是专为RME设计的CMO,其核心功能包括:
CleanInvalidPoPA的信号编码规则:
assembly复制; 典型的安全状态转换序列
MOV x0, #BASE_ADDRESS
MOV x1, #SIZE
LOOP:
DC CIVAP, x0 ; CleanInvalidPoPA操作
ADD x0, x0, #CACHE_LINE_SIZE
SUBS x1, x1, #CACHE_LINE_SIZE
B.GT LOOP
DSB SY ; 内存屏障
RME改变了CMO作用于缓存行的规则,如表A9.15所示:
| 属性 | 非RME模式 | RME模式 |
|---|---|---|
| 地址匹配 | 相同缓存行 | 相同缓存行 |
| 物理地址空间 | 相同 | 相同 |
| 内存属性 | 任何AxCACHE | 任何AxCACHE |
| 共享域 | 相同域 | 任何域 |
这种设计使得在安全域切换时,可以确保彻底清理相关数据,避免信息通过缓存侧信道泄露。当BROADCASTCMOPOPA信号无效时,系统会将CleanInvalidPoPA降级为普通的CleanInvalid操作,这为系统设计提供了灵活性。
对于服务器和高性能计算(HPC)等需要长时间运行的系统,CleanInvalidStorage操作解决了持久性错误检测的关键问题。该操作确保数据被清理到物理存储点(Point of Physical Storage,PoPS),即内存接口之后的所有缓冲区和缓存。
典型的使用场景包括:
操作流程示例:
c复制int check_memory_error(void* addr) {
volatile uint64_t* p = addr;
*p = 0x123456789ABCDEF0; // 写入测试值
// 执行存储点清理
asm volatile("DC CIVAS, %0" : : "r"(addr) : "memory");
asm volatile("DSB SY");
return (*p == 0x123456789ABCDEF0) ? 0 : -1;
}
Storage_CMO属性决定了组件是否支持CleanInvalidStorage操作,其兼容性规则如下:
| Manager支持情况 | Subordinate支持情况 | 兼容性 |
|---|---|---|
| False | False | 兼容 |
| False | True | 兼容 |
| True | False | 不兼容 |
| True | True | 兼容 |
BROADCASTSTORAGE信号允许在复位时控制CleanInvalidStorage的传播行为。当该信号无效时,操作会被转换为普通的CleanInvalid,这为不支持PoPS的旧系统提供了向后兼容性。
处理器缓存维护指令(如ARM的DC指令)需要转换为AXI CMO事务。转换规则考虑以下因素:
典型转换示例:
当使用软件CMO在一致性域和非一致性域间通信时,必须遵循严格的五阶段序列(如图A9.3):
各阶段的访问权限如表A9.20所示,违反该序列会导致不可预测的行为。这种机制常见于CPU与DMA设备、硬件加速器间的数据共享场景。
WriteZero事务是针对全零写入的优化方案,特点包括:
适用场景:
c复制// 传统零值写入 vs WriteZero优化
void zero_memory(void* addr, size_t size) {
// 传统方式
memset(addr, 0, size);
// WriteZero优化方式
for(size_t i=0; i<size; i+=CACHE_LINE_SIZE) {
asm volatile("DC ZVA, %0" : : "r"(addr+i) : "memory");
}
}
WriteDeferrable是为加速器队列操作设计的特殊事务,关键特性:
响应类型扩展:
这种机制特别适合PCIe Gen5的DMWr事务转换,为加速器提供了高效的队列管理接口。
在实际系统设计中,合理使用CMO需要遵循以下原则:
性能优化技巧:
调试常见问题: