1. 两种类型原子操作
内存原子操作
加载保留/条件存储
原子操作:
AMO 指令对内存中的操作数执行一个原子操作,并将目标寄存器设置为操作前的内存
值。原子表示内存读写之间的过程不会被打断,内存值也不会被其它处理器修改。
并将目标寄存器设置为操作前的内存值。 这句话啥意思
为什么要提供两种原子操作指令?
因为程序员假设 处理器已经提供了 比较交换的功能: 比较一个寄存器中的值和另一个寄存器中的内存地址指向的值,如果它们相等,将第三个寄存器中的值和内存中的值进行交换。
那么这个功能,需要 3 个源寄存器和 1 个目标寄存器。源操作数从两个增加到三个,会使得整数数据通路、控制逻辑和指令格式都变得复杂许多。
2. LR指令
LR 指令格式及其变种如下:
lr.{w/d}.{aqrl} rd, (rs1) 对比下图的 rs1, rd,为什么是5位?
lr 指令是从内存地址 rs1 中加载内容到 rd 寄存器。然后在 rs1 对应地址上设置保留标记(reservation set)。其中 w/d 分别对应 32 位/64 位版本。
实际的用法
lr.w a3,(a0) 就是把 a0 给到 a3
aqrl 什么意思
3. SC 指令格式及其变种如下
sc.{w/d}.{aqrl} rd, rs2, (rs1)
c 指令在把 rs2 值写到 rs1 地址之前,会先判断 rs1 内存地址是否有设置保留标记,如果设置了,则把 rs2 值正常写入到 rs1 内存地址里,并把 rd 寄存器设置成 0,表示保存成功。如果 rs1 内存地址没有设置保留标记,则不保存,并把 rd 寄存器设置成 1 表示保存失败。不管成功还是失败,sc 指令都会把当前 hart 保留的所有保留标记全部清除。其中 w/d 分别对应 32 位/64 位版本。
aqrl 什么意思,应该是内存访问顺序有关的。aq 是 acquire 的缩写,rl 是 release 的缩写。RISC-V 的内存访问模式并不是完全按照指令的顺序访问,所以LR/SC 和 AMO 指令通过这两个后缀来添加额外的内存顺序限制。