【ARM Cache 入门及渐进六--内存顺序模型】

1.1 内存顺序模型

1.1.1 强顺序模型

强顺序模型(Total Store Order) 是一种靠向程序顺序的顺序模型。所谓Total,就是说,内存(在写操作上)是有一个全局的顺序的(所有人看到的一样的顺序),就好像在内存上的每个Store动作必须有一个排队,一个弄完才轮到另一个,这个顺序和程序顺序直接相关。所有的行为组合只会是所有CPU内存程序顺序的交织,不会发生和程序顺序不一致的地方。x86和SPARK都用了这个内存模型。

这个方式对程序员更友好,但对芯片实现者不友好,因为如果用户没有这个顺序要求,CPU为了TSO的承诺,有执行资源也只能瞪眼看着,这影响效率。

1.1.2 弱内存模型

弱内存模型(WMO,Weak Memory Ordering), 是把是否要求强制顺序这个要求直接交给程序员的方法。换句话说,CPU不去保证这个顺序模型(除非他们在一个CPU上就有依赖),程序员要主动插入内存屏障指令来强化这个“可见性”。也没有一个全局的对所有CPU都是一样的Total Order。

PowerPC,MIPS,ARM都是这种模型,每种弱内存模型的体系架构都有自己的内存屏障指令。

1.1.3 Cache 与顺序模型

可以简单理解 CPU和内存控制器都是通过中间网络连起来(甚至这个总线网络还不是全互联的),它们并没有一个中心控制器,所以CPU发出的读写数据操作,到达其它节点的顺序可能是不一样的。那么如何保证每个CPU都“感觉”大家访问数据的顺序是一样的?

所以一旦你要开始做原子操作了,或者要求每个CPU的行为都要满足那个顺序语义,就要经常做广播和等待对方回应,一旦你做广播,把别人的Cache操作打断,别人的性能立即就掉下来了:一级Cache一个Cycle就可以完成一次读写,DDR可要几十个cycle,一旦某一个cpu发一个广播出来,跟大家说又改了某个内存了,大家的cache无效了,就会拖慢很多进度,当等待所有的CPU回应他们完成了,又会拖慢很多进度

CPU微架构通常靠Cache上的标记来记住谁和自己共享了某个数据的(也就是通过shareability domain),所以,尽量别和别人共享数据,每个CPU放一个自己的版本的数据,让不同CPU的数据在不同的Cacheline上。

1.2 Normal memory

normal memory就是我们平常所说的内存,对该种memory访问时无副作用(side effect),即第n次访问与第n+1次访问没有任何差别。

1.2.1 Non-shareable Normal memory

在这里插入图片描述

1.2.3 Shareble Normal memory

在这里插入图片描述

1.2.4 Normal memory of cache attributes

在这里插入图片描述

1.3 Device memory

在这里插入图片描述
Device Memory实际上是用来描述一类特殊的存储器(或者映射到指定地址空间中的寄存器),这些特殊就特殊在,无论是你读还是写,除了读写本身的功能以外,还会有“副作用”:

  • 很多中断的状态寄存器保存了中断Flag,这些Flag往往是写1清零的,或者是读取寄存器就会自动讲这些Flag清零;
  • 硬件的一些FIFO地址,每次读取的数据可能不一样。
    以上都是 “side effects”

1.3.1 Device memory buffered 属性

device memory 是 non-cacheable的,但是 对于其的写操作可以是buffered,对于这种write buffered的side effect,我们需要通过 Memory Barrier(内存屏障指令)来确保写入正确,一个常见的例子就是对memory controlller的配置,比如在修改某一块内存地址的访问权限之前,需要再写入 memory controller寄存器之前加上 DSB指令,这条指令会保证其前面的内存访问都完成之后,才会执行其后面的memory controller 寄存器额配置。

bufferable 的优点,参见大佬回复:For Cortex-M4, the bufferable attribute is observable in two aspects:

  • performance : bufferable write to a peripheral register is faster than non-bufferable write (if non-bufferable, the processor need to write for the write to complete before next instruction can execute).

  • bus fault : if accessing a invalid peripheral address, you might be able to general a bus fault. A bus error for a bufferable write is asynchronous (imprecise), and for non-bufferable write, it is synchronous (precise). The bus fault status register will have corresponding status flags to indicate if the fault is synchronous or asynchronous.

上面都是基于ARMv7的介绍,ARMv8 device memory 介绍介绍

1.3.2 Device memory 与 speculative accesses

具有device memory 配置属性的内存是不允许推测执行的:
来自Cortx-M7 SPEC

1.2.3 Device memory Coalescing access

Device memory 是不允许内存合并访问的。具体情况待了解!

1.2.4 Device memory Shareable attribute

device memory 既可以配置shareable 又可以配置为 non-shareable。
DDI0403E_B_armv7m_arm.pdf对于 non-shareable 的配置一般只会在单core场景中出现,例如对 watch dog/timer/中断控制器等的配置空间可以为设置为non-shareable device memory属性。因为单核场景也没有其他的master需要访问内部的IP的一些配置空间。

对于系统级别的外设配置空间都是配置为 shareable device memory属性的。

对于shareable的配置可以参考:
DDI0403E_B_armv7m_arm.pdf

1.4 Atomicity of ARM architecture(原子操作)

何为“原子性”?
“原子性” 指的是内存访问的一个特征,也称为原子访问,该内存访问操作要么执行完,要么不被执行,不存在执行一半被打断的可能。也就是该内存访问操作像原子一样不可切割。
ARM中定义了两种原子性:

  • 单拷贝原子性(single-copy atomicity)
  • 多拷贝原子性(multi-copy atomicity)
    为了支持原子访问,AXI中定义了两种操作:独占访问(exclusive access)和锁定访问(locked access)。在AXI4中已经取消对锁定访问的支持。

1.4.1 Single-copy atomicity(单拷贝原子操作)

Core 可以连续多次对同一地址发起 load 操作,要么是读取的是整个老数据,要么读取的是刚写入的新数据,
不可能是老数据和新数据的混合。
同样,对于store 操作,要么是将写入了memory中,要是没写入memory中,不存在写入一半的情况。
在这里插入图片描述
原子访问的大小可以是:字节/半字对齐/字:
在这里插入图片描述
如果对 memory 连续访问的粒度超过了一个word,那么就可能不是原子访问了,就有可能出现被异常打断的情况,所以对于
memory 访问的粒度超过一个word的多字节指令(multiple access instructions)不适合用于软件的同步。

1.4.2 Multi-copy atomicity(多拷贝原子操作)

在一个多处理器系统中,当对一个内存位置的写操作同时满足如下两个条件时该写操作是满足多拷贝原子性的:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

主公讲 ARM

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值