目录
有时候,软件很有必要去clean或者invalidate 缓存,这种情况通常是:
- 外部内存的内容已经被改变,而cache中还是以前的数据,所以很有必要移除cache中陈旧的数据。
- MMU相关的活动,比如:
- 改变了内存的访问权限
- 改变了缓存策略(WB、WT等)
- 改变了虚拟地址(VA)到物理地址(PA)的映射关系
- 需要同步指令缓存(I-Cache)和数据缓存(D-Cache)
需要注意的是,ARMv8-A架构中并没有提供可以invalidate 整个cache的指令,如果软件层面必须invalidate 整个cache,必须考虑cache的几何结构,即逐个Set/Way的方式来遍历cache,进行invalidate操作。此外,处理器在reset或者初始化后,其cache将会自动被invalidate,除非控制其DBGL1RSTDISABLE 或者 L2RSTDISABLE两个pin脚。
Cache相关的操作
清除操作-invalidate-使数据失效
invalidate操作主要是针对 cache line中的valid bit(有效位)进行操作。通过对有效位进行清零,从而使cache line中的数据失效,达到清除数据的目的。比如在上电或者重置操作后,cache中的内容是未定义的,此时它的valid bit为0。
清理操作-clean-使数据同步
clean操作主要针对cache line 中的 dirty bit(脏位)
某个cache line中的dirty bit为1,说明该line中的数据与内存中的数据不一致,我们就可以对该cache line描述为变“脏”了。
清除cache或cache line意味着将标记为“脏”的cache line内容写入下一级缓存或主内存,并清除cache line中的脏位。这使得当前的cache line中的数据与下一级缓存,或主存中的的内容相同。此操作仅适用于写回策略(WB)的数据缓存(data-cache)。
清空操作-zero-清空数据
这将使缓存中的内存块归零,而无需首先从外域读取其内容。这仅适用于数据缓存。
对于上述操作,可以选择具体操作的对象:
清理清除操作对象
ALL,所有
清理清楚的对象可以是整个的cache,但这不适用于数据缓存(DC)和统一缓存(unified cache)。
MVA或VA,虚拟地址
清理清除与虚拟地址相关的cache line。
Set or Way,通过Set和way的编号
通过set和way的编号定位到具体的cache line,从而进行清除清理操作。
指令格式
<cache> <operation>{, <Xt>}
对于VA操作,这些指令接收一个保存有虚拟地址的64位寄存器,对此地址没有对齐限制。
对于set/way操作,指令接收包含Set/Way/Level参数的64位寄存器,它的低32位遵从ARMv7架构的格式。
所有指令缓存维护指令都可以按照相对于其他指令缓存维护指令、数据缓存维护指令以及加载和存储的任何顺序执行,除非在指令之间执行DSB。
指定地址的数据缓存操作(DC ZVA除外)只有在指定相同地址时才能保证以相对的程序顺序执行。指定地址的操作按照相对于所有未指定地址的维护操作的程序顺序执行。
前两条指令按顺序执行,因为它们引用相同的地址。但是,最终指令可能会相对于前面的操作重新排序,因为它引用了不同的地址。
注意事项
AArch32的DCIMVAC指令以及AArch64的DC IVAC虽然是对一个虚拟地址VA进行invalidate操作,但是如果该地址上的数据在整个cluster里是dirty的,那么会自动在invalidate之前进行clean操作。
DCISW 和DCCSW,DC ISW 以及DC CSW指令,对set/way操作时,都会进行clean和invalidate操作。HCR.SWIO 以及HCR_EL2.SWIO的值对其无影响