ARM 的 缓存一致性

简介

缓存一致性 关注的是 "同一个数据""高速缓存1""高速缓存2" ..."内存" 中的 一致性 问题

存在 不一致的 这种问题 ,该如何解决.有三种解决方案:
1. 关cache,不用cache
2. 硬件提供cache维护指令	,软件调用指令维护缓存一致性
3. 硬件维护缓存一致性 	,软件不需要任何操作

arm 提供了cache ,自然不会建议 使用者关闭cache 来解决这些问题
arm 采用  23 来解决以下问题

arm mmu 话题 中的 “内存属性(Shareability & Cacheability)” 与 “muti core 和 multi cluster” 的 缓存一致性 强相关
P134
In the Armv8 memory model, the Shareability memory attribute indicates the degree to which hardware must ensure
memory coherency between a set of observers, see Memory types and attributes on page B2-143.
在Armv8内存模型中,可共享性内存属性表示硬件必须确保一组观察者之间的内存一致性的程度,请参阅第B2-143页的内存类型和属性。


The cacheability and shareability memory attributes

Cacheability and shareability are two attributes that describe the memory hierarchy in a multiprocessing system:
可缓存性和可共享性是描述多处理系统中内存层次结构的两个属性:
注意 : shareability 在多核中才有意义 , 在单核中设置为什么值效果都一样


Cacheability 
This attribute defines whether memory locations are allowed to be allocated into a cache or not.
Cacheability is defined independently for Inner and Outer Cacheability locations.
该属性定义是否允许将内存位置分配到缓存中。
可缓存性是为内部和外部可缓存性位置独立定义的。

Shareability
This attribute defines whether memory locations are shareable between different agents in a system.
Marking a memory location as shareable for a particular domain requires hardware to ensure that
the location is coherent for all agents in that domain. Shareability is defined independently for Inner
and Outer Shareability domains.
此属性定义系统中不同代理之间是否可以共享内存位置。

将内存位置标记为特定域的可共享位置需要硬件来确保该位置对于该域中的所有代理都是一致的。

可共享性是为内部和外部可共享性域独立定义的。

For more information about Cacheability and Shareability, see Memory types and attributes on page B2-143.

在这里插入图片描述

共享性
	ARM引入了一个概念,共享域(shareability domains.)包含以下几种:
	Inner shareable,意味着它适用于整个内部可共享域。
		这表示该domain内的处理器之间可以相互share数据。
		一个系统可以有多个inner shareable domains,并且当某个操作影响到其中一个inner shareable domain时,它并不会影响到其它的inner shareable domain。
	Outer shareable,意味着它适用于内部可共享和外部可共享域。
		一个outer shareable domain可以由一个或多个inner shareable domain组成,
		并且当一个操作影响到outer shareable domain时,
		也会影响到其下所有的inner shareable domain。
	Non-shareable,表示相关区域只能给指定的处理器访问。
	Full System,包含全部处理器。
system with 2 clusters: // 范围 等同于 图片中的红框部分
	cluster0 : cpu0(L1cache) cpu1(L1cache) L2cache
	cluster1 : cpu2(L1cache) cpu3(L1cache) L2cache
	L3cache

no-share
	对于cpu0 来说 , no-share 	为 cpu0的L1cache 和 cluster0的L2cache
inner share
	对于 cpu0 来说, inner share 	为 cpu0的L1cache 和 cluster0的L2cache 和 cpu1的L1cache
outer share
	对于 cpu0 来说, outer share 	为 cpu0的L1cache 和 cluster0的L2cache 和 cpu1的L1cache 和 cluster1 的所有cache 和 两个cluster共有的L3cache

Full System
	等同于 outer share

shareability 问题

aarch64

1.
shareability domains 把 cache 分成了 多个域
但是我们用 "shareability" 来设置内存属性
一个是内存,一个是cache ,有什么关系呢?
	
	mmu page table walk的时候 好像会根据 这个  内存属性 "shareability" 来 将其缓存到 对应的 cache域
	shareability是cci读取并做解释的
	应该和 arm 如何 实现 这些 域 有关系

	shareability 的由来
		为了支持数据一致性协议,需要增加硬件很多开销,会降低系统的性能,同时也会增加系统的功耗。
		但是,很多时候并不需要系统中的所有模块之间都保持数据一致性,而只需要在系统中的某些模块之间保证数据一致性就行了。
		因此,需要对系统中的所有模块,根据数据一致性的要求,做出更细粒度的划分。
	
		ARMv8架构将这种划分称作为域(Domain),并且一共划分成了四类
			Non-shareable
			Inner Shareable
			Outer Shareable
			Full System
	
	shareability
		https://blog.csdn.net/magicse7en/article/details/112914275
		https://aijishu.com/a/1060000000207845
		所谓的可共享域,
			就是说在同一个域内的主机,需要把有关一致性(coherency)和栅障(barrier)的事务传递给其它的主机。
			也定义了某段内存位置被(1.修改 2. cache维护指令)时在整个系统中的广播域 
		指当前内存页表项的数据是否可以同步到其它CPU上.
		举个例子: // 这个是 修改数据的 例子, 还有 cache 维护指令例子 和 屏障指令case
			多核CPU访问 "该属性页表项为 inner-share" 的数据
			一旦某个CPU修改了数据,那么系统将 把这一修改广播到 inner-share
			MESI 协议将 自动更新到"inner-share" 范围内的 其他CPU的数据拷贝
			从而实现内存数据一致性
		


2.
MMU translation table walk 时, 遇到 不同的 "shareability"的内存 就会缓存到对应的 "shareability domains"
我在内核中找到 linux 只会用到 inner-share, 为什么?

	
	https://linux-arm-kernel.infradead.narkive.com/RZHvk1cT/question-how-can-we-support-outer-shareable-on-arm64	
	linux是cacheable,inner的
	因为smp共享的可缓存的,都会走l1l2再到l3,arm的cluster内部有一层cci,默认总线的事务不要出去,到下一个层级的
	如果miss l3兜底.这个主要为了节省硬件的总线流量和功耗


3.
shareability  和 PoC/PoU 有什么关系
PoC/PoU 也是限定了范围,看起来和 "shareability domains" 限定的范围 相同,是不是可以 不同?

	简而言之,PoU/PoC定义了指令和命令的所能抵达的缓存或内存,在到达了指定地点后,Inner/Outer Shareable定义了它们被广播的范围。

	https://aijishu.com/a/1060000000112237

4.
PoC/PoU 除了 可以用在 cache维护指令中 限定cache 范围,还可以做什么
	没有其他的了
	定义了指令和命令的所能抵达的缓存或内存

5. shareability 会在哪里被用到
	shareability 的值 会被填充到哪里
		1. 叶子页表中的值
		2. 屏障指令中的参数
	shareability 会被什么时候被用到
		当执行屏障指令时
			2(中的shareability) 能决定 "该屏障指令前后的 (LD/ST)类型指令能被 共享域内的观察者 顺序观察 到"
				// 1(中的shareability)  在这里不起作用
		当执行Load-Acquire和Store-Release指令(LDAR)时
			保证在"Load-Acquire和Store-Release 中间的指令块"运行时不会被 "其他的指令块" 以 乱序 的名义 打断,但是可以被其他缘由(例如中断)打断
			https://blog.csdn.net/epubit17/article/details/125039703
			1(中的shareability) 能决定 "该指令的顺序能被 共享域内的观察者 顺序观察 到" // ???
			
		当执行cache维护指令时
			1(中的shareability) 能决定 该维护指令在 抵达最远(根据PoC和PoU决定)的缓存/内存后,"在该共享域(广播域) 同时 做相同的指令操作"
		

		当执行 Load-Exclusive 和 Store-Exclusive(LDXR) 指令时
			1(中的shareability) 能决定 "广播域的 数据 被 MESI协议 维护到 一致 "
			For shareable Normal memory, 
			the Load-Exclusive and Store-Exclusive synchronization primitives take account of 
			the possibility of accesses by more than one observer in the same Shareability domain.

6. cache维护指令中的 shareability 
	
7. 屏障指令中的 shareability 
	站在系统中 "指定域"的观察者来看,在这条屏障指令之前 "指定存储器访问操作"一定比在这条指令之后的"指定存储器访问操作",先被感知到。
	这个域由什么决定
		1. 访存指令地址所在页表中的		shareability值? // 好像在这里不起作用
		2. 屏障指令(DSB/DMB)中的  shareability参数 // ISB > DSB > DMB
8. 访存指令中的 shareability 
	LDAR和STLR指令也有作用的共享域,只不过没有明确在指令中表示出来。
	这两条指令的共享域就是它们操作的内存的共享域。
	比如,如果LDAR指令读取内存的地址是属于内部共享域的,那么这条指令锁提供的屏障也只是作用于这个内部共享域。
	还有一点,如果LDAR指令出现在STLR指令之后,处理器也会保证LDAR指令一定不会被重排序到STLR指令之前。

arch cache PoC PoU 话题中的PoC和PoU
"muti core 和 multi cluster" 的缓存等级 // PoC + PoU 的关注内容
可以控制 是否缓存 			// Cacheability 的关注内容
可以控制 缓存是否失效 		// cache 维护指令 + PoC + PoU 的关注内容
可以控制 缓存 到哪一级别吗? 	// Shareability + PoC + PoU 的关注内容

single core的 缓存一致性问题

DMA 和 高速缓存 一致性问题
问题描述
解决方案
自修改代码问题
问题描述
指令高速缓存和数据高速缓存不一致
数据高速缓存为新代码,指令高速缓存为老代码. 导致无法执行新代码
解决方案
2. 硬件提供指令,软件维护缓存一致性

软件调用高速缓存维护指令 : dc ic 
修改页表
问题描述
tlb 保存的数据过时,导致索引到错的物理地址
解决方案
2. 硬件提供指令,软件维护缓存一致性
刷新tlb

multi core 新增问题

cpu0 和 cpu1 一致性问题
问题描述
cpu0    读 了内存地址A的值 , 缓存到 cpu0 的 l1 cache , 并修改了 该值 // 造成了内存地址A的两个副本
之后
cpu1    要读内存地址A的值 , 从哪里读


解决方案
3. 硬件维护缓存一致性,软件不需要任何操作

什么硬件:
	基于 MESI 协议 的 SCU(Snoop control unit)

multi cluster 新增问题

cluster0 和 cluster1 一致性问题
问题描述
cluster0    读 了内存地址A的值 , 缓存到 cluster0    的 l1 cache , 并修改了 该值 // 造成了内存地址A的两个副本
之后
cluster1    要读内存地址A的值 , 从哪里读


解决方案
3. 硬件维护缓存一致性,软件不需要任何操作

什么硬件:
	多cluster:基于 (AMBA4)ACE 协议 的 CCI控制器
	众cluster:基于 (AMBA5)CHI 协议 的 CCN控制器
	众cluster:基于 (AMBA5)CHI 协议 的 CMN控制器
  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
AMBA (Advanced Microcontroller Bus Architecture) 是 ARM 公司提出的一种片上总线架构,它可以用于连接处理器、存储器、外设和其他系统组件。AMBA 协议提供了一种用于 CPU 和其他系统组件之间的通信方式,其中包括一些机制来实现缓存一致性。 AMBA 协议对缓存一致性的实现方式主要有两种:ACE (AXI Coherency Extensions) 和 CHI (Coherent Hub Interface)。 1. ACE:ACE 是一种 AXI (Advanced eXtensible Interface) 总线协议的扩展,它增加了一些机制来实现缓存一致性。ACE 协议支持多个处理器和 DMA 控制器之间的缓存一致性,从而提高了系统性能。 ACE 协议的主要特点包括: - 支持多个处理器和 DMA 控制器之间的缓存一致性; - 支持多种缓存一致性协议,包括 MESI、MOESI 和 MOESIF 等; - 支持多级缓存; - 支持数据和指令的缓存一致性。 2. CHI:CHI 是 ARM 公司推出的一种新的片上总线架构,它是 AMBA 协议的下一代版本。CHI 协议在 ACE 的基础上进行了进一步的优化和改进,从而提高了系统的性能和可扩展性。 CHI 协议的主要特点包括: - 支持多个处理器和 DMA 控制器之间的缓存一致性; - 支持多种缓存一致性协议,包括 MOESI 和 MOESIF 等; - 支持多级缓存; - 支持数据和指令的缓存一致性; - 支持高带宽和低延迟的数据传输; - 支持虚拟化和安全性。 综上所述,AMBA 协议通过 ACE 和 CHI 两种协议来实现缓存一致性,提高了系统的性能和可扩展性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值