tation of caches beyond the PoC that have no effect on the coherency between memory system agents.
**PoC: 是对于不同的Master看到的一致性的内存; 例如对于cores,DSP,DMA他们一致性的内存就是main memory,所以main memory是PoC这个点。
10.3 PoU和PoC的区别
??最大的一个区别就是PoC是系统一个概念,和系统配置相关,它包含了系统所有有能力访问内存的设备,包括cpu,gpu,dma等,这些都称为observer,观察者( 全局缓存一致性角度)。而PoU是个局部的概念( 处理器缓存一致性角度)。
??系统配置的不同可能会影响PoU的范围,我们举个例子,在Cortex-A53可以配置L2 cache和没有L2 cache,可能会影响PoU的范围,为什么会这样,因为我们支持PoU有一个重要的观察点 - PoU for inner share,而inner share的划分和 这个cache是不是 CPU IP集成有关。
比如下面这个图,左边,没有集成L2 cache,那么这时候POU等于了POC,而且也没有其他的master。右边那个图,CORE里集成了L2 cache,那么core,L1 cache和L2 cache构成了PoU for inner share,而master a和master b和系统内存构成了PoC。
11. Cache维护指令
Armv8里定义的Cache的管理的操作有三种:
访问类型 |
延迟 |
无效(Invalidate) |
整个高速缓存或者某个高速缓存行。高速缓存上的数据会被丢弃。 |
清除(Clean) |
整个高速缓存或者某个高速缓存行。相应的高速缓存行会被标记为脏,数据会写回到下一级高速缓存中或者主存储器中。 |
清零(Zero)操作 |
在某些情况下,对高速缓存进行清零操作起到一个预取和加速的功效,比如当程序需要使用一大块临时内存,在初始化阶段对这个内存进行清零操作,这时高速缓存控制器会主动把这些零数据写入高速缓存行中。若程序主动使用高速缓存的清零操作,那么将大大减少系统内部总线的带宽。 |
对高速缓存的操作可以指定不同的范围:
- 整块高速缓存。
- 某个虚拟地址。
- 特定的高速缓存行或者组和路。
12. Cache指令格式
参见:
13. cache一致性
??由于缓存存在于cpu与内存中间,所以任何外设对内存的修改并不能保证cache中也得到同样的更新,同样处理器对缓存中内容的修改也不能保证内存中的数据 得到更新。这种缓存中数据与内存中数据的不同步和不一致现象将可能导致使用DMA 传输数据时 或 处理器运行自修改代码时产生错误。
出现不一致的原因有三个:共享可写的数据、进程迁移和I/O传输。
??cache一致性关注的是同一个数据在多个高速缓存和内存中的一致性问题,解决多处理机Cache一致性问题提出了两种解决办法:侦听一致性协议和基于目录的一致性协议。由于多数SMP(对称多处理机)结构是采用总线互连的,侦听一致性协议是基于侦听总线事务来保持Cache一致性的协议,所以多数产品采用侦听协议。
??基于总线互连的SMP是通过高速共享总线将若干个商用的微处理器(包括高速缓存)与共享存储器连接起来,因此,可以利用总线来实现高速缓存一致性。总线上的每个设备都能侦听到总线上出现的事务,当一个处理器向存储系统发出一个读/写请求时,它的本地高速缓存控制器将检查自己的状态,并采取相应的动作。所有的高速缓冲器都侦听总线上出现的事务,一旦发现与自己有关的事务,就执行相应的动作来保证高速缓存的一致性。
侦听一致性协议是利用总线的一下两个特点来实现一致性的:
- 一是总线上的所有事务对所有的高速缓存控制器都是可见的。
- 二是总线上所有事务以相同的次序内所有的高速缓存控制器可见。
关于总线监听协议,作者暂时也没搞懂,有兴趣的可以参考:Linux内存管理:ARM64体系结构与编程之cache(3):cache一致性协议(MESI、MOESI)、cache伪共享。
14. linux查看Cache信息的方式
14.1 Linux下查看CPU Cache级数,每级大小
1. 第一种方法:
dmesg | grep cache
[ 0.000000] Detected VIPT I-cache on CPU0
[ 0.000000] Dentry cache hash table entries: 131072(order: 8,1048576 bytes)
[ 0.000000] Inode-cache hash table entries: 65536(order: 524288 bytes)
[ 0.000283] Mount-cache hash table entries: 2048(order: 16384 bytes)
[ 0.000290] Mountponit-cache hash table entries: 2048(order: 16384 bytes)
[ 0.040049] Detected VIPT I-cache on CPU1
[ 0.052061] Detected VIPT I-cache on CPU2
[ 0.064080] Detected VIPT I-cache on CPU3
2. 第二种方法:
# ls /sys/devices/system/cpu/cpu0/cache/index
index0/ index1/ index2/
其中index0和index1分别是L1 Cache的DCache和ICache。
(1) 一级cache, Data cache
# cat /sys/devices/system/cpu/cpu0/cache/index0/level
1
# cat /sys/devices/system/cpu/cpu0/cache/index0/type
Data
# cat /sys/devices/system/cpu/cpu0/cache/index0/size
32K
(2) 一级cache, Instruction cache
[root@gc15 ~]# cat /sys/devices/system/cpu/cpu0/cache/index1/level
1
# cat /sys/devices/system/cpu/cpu0/cache/index1/type
Instruction
# cat /sys/devices/system/cpu/cpu0/cache/index1/size
32K
(3) index2为L2cache的信息,同物理CPU共享的
# cat /sys/devices/system/cpu/cpu0/cache/index2/level
2
# cat /sys/devices/system/cpu/cpu0/cache/index3/type
Unified
# cat /sys/devices/system/cpu/cpu0/cache/index2/size
1024K
14.2 查看Cache的关联方式
在 /sys/devices/system/cpu/中查看相应的文件夹
(1) 如查看cpu0的一级缓存中有多少路(Cache被平均分成了几份)
$cat /sys/devices/system/cp