第三季视频课程ARM64体系结构与编程之cache基础知识(1)
为什么系统软件人员要深入了解cache?
在一个系统中,cache无处不在,对于一个系统编程人员来说,你无法躲藏。下图是一个经典的ARM64系统的架构图,由Corte-A72和Cortex-53组成了大小核架构,每个CPU核心都有L1 cache,每个cluster里共享一个L2 cache,另外还有Mali GPU和DMA外设。
对于系统软件人员,下面几个常常疑惑的问题:
-
cache的内部组织架构是怎么样的?能否画出一个cache的layout图?什么是set,way?
-
直接映射,全关联和组相联之间有什么区别?优缺点是啥?
-
重名问题是怎么发生的?
-
同名问题是怎么发生的?
-
VIPT会不会发生重名问题?
-
什么是inner shareability 和outer shareability?怎么区分?
-
什么是PoU?什么是PoC?
-
什么是cache一致性?业界解决cache一致性都有哪些方法?
-
MESI状态转换图,我看不懂。
-
什么cache伪共享?怎么发生的,如何避免?
-
DMA和cache为啥会有cache一致性问题?
-
网卡通过DMA收数据和发数据,应该怎么操作cache?
-
对于self-modifying code,怎么保证data cache和指令cache的一致性问题?
所以,Cache这个玩意,对我们系统编程人员来说,非常重要。Cache没有理解好,或者没有完全搞透了,对系统编程影响很大,有时候我们在编程的时候,一行代码小小的改动可能会影响整个系统的性能,所以,我是建议系统程序员有必要把cache这玩意好好系统的学一学。
笨系列文章主要源自第三季《arm64体系结构与编程》视频课程,大概会有上下两篇:
上篇:介绍cache相关的背景知识,例如什么是cache,cache的layout结构图,cache的层级,VIPT/PIPT/VIVT,cache的重名和同名问题,cache的策略等。
中篇:主要介绍ARM特有的inner share和outer share的概念,以及神马是PoU和PoC,还有cache指令的格式。为什么会有cache一致性问题?arm公司对cache一致性问题的解决方案的演进。cache一致性问题业界常用的解决方案。
下篇:主要介绍MESI协议,怎么去看MESI协议状态图,DMA和cache之间的cache一致性问题,self-modifying code导致的I-cache和D-cache的一致性问题,cache伪共享等问题。
inner share和outer share
Inner 和outer shareability是arm提出来的概念。很重要的一点,大家先要知道,也就是只有normal memory的内存属性的内存才能设置inner 和outer shareability,device memory是不能设置shareability的。
怎么去区分inner share还是outer share呢,arm手册里讲了,不同的SOC设计有不同的区分方法,不过有一个通用的规则:inner share通常是CPU IP集成的caches,包括CPU IP集成的L1 data cache和L2 cache,而outer share是通过总线连接到cache,比如外接的L3 cache等。
下面这个图,比较直观。这个图,虚线分成了两部分,左边都是inner share,右边都是outershare。左边表示是CPU IP集成的cache,上面的cores集成了L1和L2cache,而下面的core集成了L1 cache,那虚线框出来的都是inner share。我们再来看虚线左边,通过总线外接了L2 cache或者L3 cache,这边都是outer share。
在armv8.6手册里,在B2.7.1章里有一段话对inner share和outer share描述。
在这里的example B2-1里,举了一个例子,说在一个在一个2 cluster的系统