1、前言
RISC-V的RVWMO模型主要包含了preserved program order、load value axiom、atomicity axiom、progress axiom和I/O Ordering。今天主要记录下preserved program order(保留程序顺序)中的Overlapping-Address Orderings(重叠地址排序)。
2、重叠地址排序
a操作在程序顺序中先于b操作,a和b都访问常规主存,不包含I/O区域,如果存在以下任何一个条件,那么a操作和b操作在全局内存顺序中的顺序也不会变。
b是store,且a和b访问重叠的内存地址。
a和b是load,x是a和b同时读取的字节,且在a和b程序顺序之间没有store操作访问x,a和b放回x的值由不同的内存操作写入。
a是由AMO或SC指令生成的,b是一个load,b返回由a写入的值。
关于第一点,load或store操作永远不能与后面访问重叠内存位置的store操作进行重排序。从微体系架构的角度来看,一般来说,如果投机是无效的,则很难或不可能撤回投机重排序的store操作,因此模型直接不允许这种行为。不过另一方面,store可以forward数据给后面的load操作,这种情况通常发生在store的数据暂时存放在store buffer里,之后load命中store buffer,就直接load数据走了。
关于第二点,其实就是要求同一个hart中,younger的load返回的值不能比同地址older load返回的值更老。这通常被称为“CoRR”(Coherence for Read-Read pairs),或者SC模型(sequential consistency)的要求一部分, RVWMO需要强制执行CoRR排序。如下代码所示,不管程序如何执行,(f)返回的值肯定比(d)的新。
关于第三点,其实就是AMO或成功的SC必须要全局可见后,才能将值返回给后续的load操作。
这三个原则也适用于内存访问之间只有部分重叠的情况,而且基地址也不一定相同的。例如,当使用不同大小的操作访问同一个地址区间时,就可以发生这种情况。当使用非对齐的内存访问时,重叠地址的规则可以独立地应用于每个地址的内存访问。