ARM AArch64指令集中有两条关于缓存维护(cache maintenance)的指令,分别是IC和DC。IC用于指令缓存操作,DC用于数据缓存操作。
IC和DC指令都属于系统指令(system instruction),系统指令还包括AT,BRB,CFP,CPP,DVP和TLBI等。
cache的管理主要有如下3种情况:
无效(invalidate)操作:使整个cache或者某个cacheline失效,这可能会丢弃cache中的更改。其实就是修改valid bit,让cache无效。
清理(clean)操作:把标记为脏的整个cache或者某个cacheline写回下一级cache或者内存中,然后清除cacheline中的dirty bit。这使得cacheline的内容与下级cache或者内存中的数据保持一致。
清零(zero)操作:在某些情况下,用于对cache进行预取和加速。例如,当程序需要使用较大的临时内存时,如果在初始化阶段对这块内存进行写零操作,cache控制器就会主动把这些零数据写入cacheline中。若程序主动使用cache的清零指令,那么将大大减小系统内部总线的带宽。
另外,ARM还正常清理并失效 (clean and invalidate)操作:它会先执行清理操作,然后再使cacheline失效。
对cache的操作可以指定如下不同的范围:
整块cache。
某个虚拟地址。
特定的cacheline或者组(set)和路(way)。
DC和IC指令的格式如下:
DC <operation>, <Xt>IC <operation>, <Xt>
DC和IC指令包含两个参数:一个是操作码;另一个是通用寄存器Xt,用于传递参数,例如虚拟地址等。
操作码可以分成以下4部分:
功能:表示cache维护指令的功能(I、C、CI、Z)。
类型:表示指令操作的范围,例如VA是针对单个虚拟地址的操作,SW表示针对cache中的路和组进行操作,ALL表示针对整个cache。
观察点:表示站在哪个角度对cache进行操作,U表示站在PoU角度,C表示站在PoC角度。
共享:IS表示内部共享属性。
IC指令格式中的U还可以和共享属性IS结合来表示属于同一个内部共享域的一组处理器。例如,“ic ialluis”指令表示使内部共享域中所有处理器的指令cache都失效。
ARMv8架构支持的高速缓存指令如下表所示。
另外,补充介绍一下PoC/PoU/PoP的概念:
PoC(Point of Coherency):在此处,确保所有可以访问内存的观察者都能看到相同的副本,这些观察者是系统中所有可以访问内存的模块,例如CPU、GPU、DMA设备等。在使用CHI总线的系统中,PoC一般是HNF节点。
PoU(Point of Unification):在此处,确保PE的I-cache、D-cache以及MMU(TLB)能够看到相同的副本(具体描述见ARM spec)。对于单核处理器来说,PoU就是系统内存;对于多核处理器,PoU取决于共享域(shareability domain)属性。
PoP(Point of Persistence): 持久节点,它是Memory系统中的一个节点,当系统电源断开时,对Memory的写入会被维持,当电源恢复到Memory中受影响的位置时,写入会被可靠地恢复。
参考:
ARM64体系结构编程与实践
ARM系列 -- 缓存维护指令
173