目录
一,MOESI状态释义
二,MOESI状态转换
1, Invalid after Reset
2, Invalid => Exclusive
3, Exclusive => Modified
4.2 Modified => Invalid , Invalid => Modified
6,Clean 和Invalidate操作对MOESI状态的影响
6.1 对 Owned状态进行clean & Invalidate
三,注意事项
ARMv8架构使用 MOESI 协议来维护在多个core之间的数据一致性,MOESI 协议描述了 L1 Data Cache中的一个共享的cache line的状态可以是:
Data Cache Unit (DCU)会将cache line的 MOESI状态信息保存在tag RAM和 dirty RAM中。
下图为MOESI协议的状态转换图。
接下来,本文将结合一个状态转换用例来解释具体的MOESI状态转换。
假设当前系统有四个core,每个core有自己独立的data cache,在系统上电后,所有core的cache line都为 invalid状态:
然后core0 试图读取 内存中地址为 0x44013F00上的数据,core0 的cache中,与该地址相关的cache line的状态将由Invalid 转为 VE,其中V 为Valid,表明该cacheline中的数据有效。E为Exclusive, 表明该数据只在core0中。
之后,core0试图对该地址写入一个新值,该cache line的状态将由VE会变成VDM,其中V为,valid,D为Dirty,表示数据为脏,当前cache line中的数据与主存中的不一致。M 为Modified,表明该cache line中的数据是Unique且Dirty的。
接下来,让core 1,core2,core3对该地址进行读取操作,core0的状态将会从VDM 转为 VDO,其他三个core的cache line将由Invalid 转为 VS, 其中O表示Owned, S表示Shared,O状态与S状态为对应关系。此外,从下图中,也可知,core1,core2,core3读取到的数据是core0 cache中的备份,而不是真正内存中的值。
如果让core1写入一个新数据,core0中的数据没有被写回DDR中,发生了data corruption,core0中之前保存的数据消失了,cache line的状态变为invalid。而core1的状态将由Invalid 变成Modified,同时也是dirty的。
接4.1的步骤, 如果core1 试图对该地址写入一个新值,core0的状态将由Owned 变为 Invalid,core2和core3中该cache line的状态将会由Shared 变为 Invalid,而core1的状态将由Shared 变为 Modified(VDM)。此外,由于使用的是write back策略,所以当前的写入操作仅写入到了cache中,主存中的内容仍未改变。
在本示例中,出现了两个core先后对同一个内存地址进行读写操作, core0写入的值(蓝色)由于没有被写回到主存中,之后core1又对该地址写入一个新值(绿色),就把core0写入的值给覆盖了。
如下图所示,core0的相关cache line之前处于 VDO状态,对其进行clean&invalidate操作后,core0的状态变为Invalid,其他三个core的状态依旧为 VS,并且core0 cache中的数据已写回到主存中。
如下图所示,core1的相关cache line之前处于 VS状态,对其进行clean&invalidate操作后,core1的状态变为Invalid,其他l两个core的状态依旧为 VS,并且core1 cache中的数据已写回到主存中。但是core0的相关cache line依旧处于 VDO状态。此时主存中的data和cache 中的data已同步,但是core0的cache line仍为dirty 状态,这是由于Clean & invalidate操作是软件主动进行的,干扰了硬件层上数据同步的正常操作流程导致的。
硬件层上数据一致性的维护 需要先使能CPU扩展控制寄存器(CPU Extended Control Register) 的SMPEN bit,该寄存器提供了一些额外的处理器配置和控制选项。其中SMPEN位:
CPUECTLR[6]:SMPEN,在当前cluster中,使能硬件对在多个core中的数据一致性管理,为0时,将会禁止在多个core中的数据一致性维护功能,这也是 reset value。为1时,使能数据一致性功能。所以即便是在只有一个core的系统中,也建议在enable 缓存前先将SMPEN置为1,否则缓存里的数据将不会与其他core同步,将可能发生data corruption。
参考文章:
DDI0500J_cortex_a53_trm.pdf