4. ARM多核架构概览

理解MESI协议在ARM平台上的移植适配,第一步不是看协议状态机,而是先看清ARM多核处理器的物理与逻辑骨架:核心如何组成集群、集群如何通过互连总线连接、缓存一致性请求走哪条接口、各级缓存之间是什么包含或非包含关系。只有把这张“地图”建立起来,后面讨论ACE/CHI通道、监听过滤、状态迁移时,才能知道每个信号究竟落在哪个硬件对象上。

一、Cortex-A多核集群:DSU与共享L2

在现代Cortex-A系列(如A55、A76、A78、X系列)中,多个核心通常不是直接挂在总线上,而是先组成一个DynamIQ Shared Unit(DSU)集群。DSU内部包含集群共享的L2缓存、监听过滤器(Snoop Filter)、以及连接各核心L1的互连逻辑。每个核心拥有私有的L1指令缓存与L1数据缓存,L1D是MESI状态实际驻留的第一层;L2由集群内所有核心共享,通常也参与一致性维护,但它的状态语义与L1并不完全等同。

这种“私有L1 + 共享L2 + 集群级监听”的结构,决定了MESI在ARM上的第一个适配要点:一致性域(Coherency Domain)的边界。一个核心发出的读写请求,先由DSU判断是否命中其他核心的L1,再决定是否访问L2或更外层内存。若把一致性域误判为“整个SoC”,就会在监听过滤和状态迁移上引入不必要的开销。

二、CCI/CCN互连总线:集群之间的桥梁

当SoC中存在多个DSU集群、GPU、DMA或PCIe设备时,需要更外层的互连总线来维持一致性。ARM生态中常见两类:

  • CCI(Cache Coherent Interconnect):如CCI-400、CCI-500,面向中小规模多集群,支持ACE接口,负责集群间监听转发与一致性维护。
  • CCN(Cache Coherent Network):如CCN-512、CMN-600/700,面向服务器与高端移动平台,采用网状拓扑,支持CHI协议,具备更强的可扩展性与QoS能力。

CCI/CCN的核心职责不是“传数据”这么简单,而是一致性秩序的仲裁者:它接收来自各ACE/CHI端口的请求,查询监听过滤器,向可能持有副本的缓存发出Snoop,收集响应后决定数据来源与最终状态。MESI移植时,互连总线的监听过滤能力直接决定“是否需要广播式监听”,也决定状态迁移能否被高效压缩。

ARM多核缓存层次与互连总线示意 DSU Cluster 0 Core 0 L1D / L1I Core 1 L1D / L1I Core 2 L1D / L1I 共享 L2 Cache Snoop Filter DSU Cluster 1 Core 3 L1D / L1I Core 4 L1D / L1I Core 5 L1D / L1I 共享 L2 Cache Snoop Filter CCI / CCN 互连总线 ACE / CHI 接口 · 监听转发 · 一致性仲裁 系统内存 / DDR 最终一致性落点 蓝:Cluster 0 一致性域 绿:Cluster 1 一致性域

三、ACE与CHI:两种一致性协议接口

ACE(AXI Coherency Extensions)是在AXI基础上扩展出的一致性接口,定义了五条通道:AR、AW、W、R,以及额外的AC(Address Coherency)与CR(Coherency Response)通道。ACE的监听事务通过AC通道发起,响应通过CR通道返回,适合CCI-400/500这类互连。CHI(Coherent Hub Interface)则是更现代的分层协议,采用请求节点(RN)、归属节点(HN)、从节点(SN)的角色划分,支持更细粒度的状态与更高效的网状互连,常见于CMN-600/700。

对MESI移植而言,ACE与CHI的差异会直接影响实现方式:ACE更接近“信号级”的通道交互,状态迁移需要显式处理AC/CR握手;CHI则把一致性语义封装在事务类型中,如ReadShared、ReadUnique、CleanUnique、MakeUnique等,移植时更多是事务到MESI状态的映射,而不是逐根信号去拼时序。

四、缓存层次结构与MESI状态落点

ARM典型缓存层次为:L1D(私有,MESI状态主要驻留)→ L2(集群共享,通常为包含或非包含)→ L3/系统缓存(可选)→ DDR。需要特别注意的是,ARM中L1与L2的关系并不总是严格包含(inclusive)。在非包含结构中,L1中的Modified行可能并不在L2中体现,监听过滤器必须记录L1的持有者,否则会出现“监听遗漏”导致的一致性错误。

层次/组件 典型对象 一致性角色 MESI适配关注点
L1D 各Cortex-A核心私有 状态驻留、发起读写 M/E/S/I四态实际存储位置
L2 DSU共享 集群内监听、数据回填 是否包含L1、监听过滤器粒度
CCI/CCN 互连总线 跨集群监听与仲裁 ACE/CHI事务映射、Snoop Filter
系统内存 DDR 最终数据落点 写回与CleanUnique的终点

五、案例场景:一次跨集群ReadShared的路径

假设Core 0要读取一个当前被Core 4以Modified状态持有的缓存行。请求路径如下:

  1. Core 0的L1D未命中,向DSU Cluster 0发起读请求。
  2. Cluster 0的监听过滤器未发现本地副本,请求经ACE/CHI送往CCI/CCN。
  3. CCI/CCN查询全局监听过滤器,定位到Cluster 1的Core 4持有Modified副本。
  4. 向Core 4发出Snoop,Core 4将数据写回并降级为Shared,同时返回数据。
  5. 数据经互连返回Core 0,Core 0填入L1D并置为Shared。

这条路径中,MESI的S状态在Core 0与Core 4同时存在,而内存中的数据可能是旧的。若移植时误把“内存有数据”当作最新,就会在后续写操作中丢失Core 4的修改。因此,监听响应中的状态与数据有效性判断是移植的核心校验点。

常见误区:把CCI/CCN当成普通总线,认为“只要连上就能一致”。实际上,CCI/CCN的监听过滤器容量、端口一致性域划分、ACE/CHI事务类型支持范围都会限制MESI状态的可见性。若在非包含L2结构下关闭或缩小监听过滤器,Modified行可能无法被正确Snoop,导致静默数据损坏。

移植建议:先确认目标SoC的缓存包含关系与互连协议版本,再决定MESI状态机是“以L1为中心”还是“以监听过滤器为中心”实现。对ACE平台,重点验证AC/CR通道握手;对CHI平台,重点验证ReadShared/ReadUnique/CleanUnique等事务到MESI状态的映射表。

典型ACE监听事务关键通道:
AC  : Snoop Address  —— 发起监听地址
CR  : Snoop Response —— 返回监听响应与数据
AR/AW/W/R : 常规读写数据通道

CHI典型事务(映射MESI):
ReadShared   -> S
ReadUnique   -> E / M
CleanUnique  -> M(清理其他副本)
MakeUnique   -> M(无数据返回的独占)

把上述结构、接口与层次关系梳理清楚后,MESI在ARM上的移植就不再是“照搬x86状态机”,而是围绕DSU、CCI/CCN、ACE/CHI和缓存包含关系做针对性适配。下一阶段的状态迁移设计,必须建立在本节这张硬件地图之上。