RISC-V中的acquire和release

打印 上一主题 下一主题

主题 572|帖子 572|积分 1720

RISC-V中,有两类原子操作指令:
⚫ 内存原子操作(AMO)
⚫ 加载保存/条件存储(load reserved / store conditional)
此处我们先看下LR和SC指令;
引入的缘故原由

       编程语言的开辟者会假定体系结构提供了原子的比较-互换(compare-and-swap)操作:
       比较一个寄存器中的值和另一个寄存器中的内存地址指向的值,如果它们相称,将第三个寄 存器中的值和内存中的值举行互换。
       这是一条通用的同步原语,其它的同步操作可以以它为 基础来完成;
       LR/SC的引入,就是为了实现这个操作;
具体规格

部分内容转载自:RISC-V 原子指令介绍 - 泰晓科技 (tinylab.org)
lr.{w/d}.{aqrl} rd, (rs1)
r 指令是从内存地址 rs1 中加载内容到 rd 寄存器。然后在 rs1 对应地址上设置保存标志(reservation set)。其中 w/d 分别对应 32 位/64 位版本。
sc.{w/d}.{aqrl} rd, rs2, (rs1)


  • sc 指令在把 rs2 值写到 rs1 地址之前,会先判断 rs1 内存地址是否有设置保存标志
  • 如果设置了,则把 rs2 值正常写入到 rs1 内存地址里,并把 rd 寄存器设置成 0,表示保存成功。如果 rs1 内存地址没有设置保存标志,则不保存,并把 rd 寄存器设置成 1 表示保存失败。
  • 不管成功照旧失败,sc 指令都会把当前 hart 保存的全部保存标志全部清除。其中 w/d 分别对应 32 位/64 位版本。
     

注意事项:


  • RISC-V 的 Spec 中只规定了 sc 指令如果失败了,会往 rd 寄存器中写入非零值,并不肯定是 1;
  • 对于 lr/sc 指令,要求 rs1 寄存器中的地址是按宽度对齐的,比如 lr.w 要求 4 字节对齐,sc.d 要求 8 字节对齐。否则会触发非对齐异常。
  • RISC-V 对 LR 和 SC 之间的指令是有限定的:

    • LR 和 SC 之间最大只能包含 16 个指令;
    • 这些指令只能利用基础整数指令集(指令集 “I”,不包含内存访问指令,跳转指令,fence 和 system 指令;
    • 如果违反了这些限定,LR/SC 指令的效果是不受束缚的,大概在一些芯片实现上能保证原子性,在别的一些芯片实现上不能保证。

  • SC指令不肯定执行成功,只有满意背面这四个条件,它才能执行成功:

    • LR和SC指令成对地访问相同的地址。
    • LR和SC指令之间没有任何其它的写操作(来自任何一个hart)访问同样的地址。-
    • LR和SC指令之间没有任何中断与异常发生。-
    • LR和SC指令之间没有执行MRET指令。

Memory order

部分参考:RISC-V原子指令LR/SC_riscv lr sc-CSDN博客


  • RISC-V 和 ARM 类似,内存模型都是弱内存模型(relax memory model),这意味着,在不加额外限定的环境下,内存访问指令并不会完全按照指令顺序执行。
  • RISC-V 有一个 FENCE 指令,可以用来显式添加内存顺序限定。
  • 为了提高服从,RISC-V 为每个原子指令都预留 aq/rl 两个比特位,从而可以很方便在原子指令上施加额外的内存顺序限定。
  • 原子指令是用来在不同 hart 之间做同步用的,而内存访问顺序夸大的是同一个 hart 内的执行顺序。
  • LR/SC 和 AMO 指令就是通过这两个后缀来添加额外的内存顺序限定
  • 每个指令的这两个bit的组合代表的含义如下:



     

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

王國慶

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表