八、访存顺序(Memory Ordering)

前言

这部分的内容比较抽象,很多内容我无法理解,都是直接翻译过来的。虽然难,但是不可不看,如果遇到无法理解的都直接跳过,那后面都无法学习下去了。觉得无法理解是因为目前的知识还很欠缺,到后面具备了这些方面的认知再理解这些内容就会好很多了,这里先走马观花过一遍即可,有个大致的印象,后面用到可以回过头来重新理解并修订。觉得翻译有问题的,可以参考原文。

在比较老的ARM架构实现中,指令的执行顺序是严格按照代码编写的顺序来的,一条指令执行完成后才会执行下一条指令。比较新的ARM架构在指令执行顺序和访存操作方面进行了一些优化:为了减小内核执行指令的速度与外设访问速度差异带来的影响,在架构里面引入了缓存(Caches)和写缓冲区(Write Buffers)。它们的引入带来的一个影响是访存的顺序可能会被改变,实际对外设的访问顺序可能跟内核执行访存指令的顺序不一致,举个例子说明:
访存顺序举例
左边是内核执行指令的顺序,右边是指令实际的执行情况。第一条指令使用STR指令将R12寄存器的值写入到内存中,它实际上将写内存操作写到了write buffer里面。后面两条指令是读数据指令,这两条指令都会先于write buffer将数据写入到内存之前完成。第二条指令从内存中读取数据,未命中Cache,所以它会到内存中去读取数据。第三条指令也从内存中读取数据,但是命中Cache,它可以立即得到数据。对于CPU来说,它执行指令的顺序是1 2 3;但是对内存来说,它接收到的访存请求却是2 1。

当然有时候需要让实际的访存顺序按照我们指令的编写顺序去严格执行,比如说修改CP15寄存器,或者拷贝内存里面的代码这样的一些操作,处理器需要等待对应的操作完成。

对于那些超高性能的处理器,往往它们支持数据预测访问,指令多发射,缓存同步协议和乱序执行的特性,这些特性更可能引起访存顺序的改变。在单核的CPU上,硬件会处理好这些问题,它会考虑访问数据之间的关系,保证访存操作的结果正确。但是,假如CPU有多个核,它们通过共享内存交换数据,考虑访存顺序就变得特别重要,你可能需要特别关心多线程访问共享内存时的同步问题。

ARMv7-A架构的处理器采用的是弱顺序存储模型,该模型允许重排序访存操作,实际的访存顺序不用严格遵守加载(LDR)和存储(STR)指令的执行顺序。对Normal Memory的读写操作可以由硬件重排序,这种重新排序只受数据依赖性和显式内存屏障指令的约束。如果需要更强有力的排序规则,需要在该内存块的转换表入口里面设置相应的属性来告知处理器核。为处理器核强制设置排序规则会限制硬件优化的效果,导致性能下降,功耗增加。

ARM存储顺序模型

Cortex-A系列处理器采用用的是弱顺序存储模型,访存操作可以被重新排序。ARM架构定义了3种互斥的存储类型:严格顺序(Strongly-ordered)类型,设备(Device)类型,常规(Normal)类型,所有的存储区域都必须设置为其中一种存储类型。下表列出了两个访存操作A1 A2访问不同存储类型的存储区域时的实际访存序(A1先于A2发出):
不同存储类型区域的访存序
可以看到,对于Normal类型的存储区域,访存操作可以被重排序。如果都是访问的Device类型或Strongly-Ordered类型的存储区域,则严格按照指令顺序访存。

Strongly-Ordered和Device存储类型

对Strongly-Ordered和Device类型存储区域的访问遵循相同的存储序模型,规则如下:

  • 访问的次数和数据量大小保持原状,访问操作是原子的,不会被中途打断。
  • 读写访问都会对系统产生影响(无法理解),访问不经过缓存,不允许预测访问。
  • 不允许非对齐访问。
  • 对于Device类型的存储区域,访问到达存储区的顺序保证跟访存的指令顺序一致,这种保证仅适用于访问同一个外设或同一块存储区域(比如访问同一Device类型页的几个地址,它们的访问顺序是被保证的)。
  • 在ARMv7架构里,对Normal存储区域和Strongly-Ordered/Device存储区域的访问顺序可以调整。

Strongly-Ordered和Device存储类型的区别仅有以下两点:

  • 对于Strongly-Ordered存储区域的写操作,只有当写操作真正到达外设或存储设备后,才算完成。
  • 对于Device存储区域的写操作,可以在写操作真正达到外设或存储设备前提前完成。

系统外

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值