🧩 一、RV32A 是什么?

名称 含义 功能
RV32A Atomic Instructions Extension 为多线程/多核系统提供“原子读-改-写”指令,保证内存访问的原子性(不被中断或抢占)

✅ “原子”意思是:整个操作(读、修改、写)在执行期间不可被打断。 这在实现锁(lock)、信号量(semaphore)、自旋锁(spinlock)等并发控制结构时至关重要。


⚙️ 二、RV32A 的关键特征

特性 说明
原子访问 支持对内存中的一个字(word, 4 B)或双字(在 RV64)执行原子读-改-写
同步机制 硬件级别的同步保障,无需额外锁机制
典型应用 多核共享内存、操作系统内核同步、原子计数器、互斥锁实现
依赖扩展 RV32I 基础指令集

🔩 三、两大类原子指令

RV32A 提供两种风格的原子指令:

1️⃣ Load-Reserved / Store-Conditional(LR/SC)型

这种方式更灵活,可实现各种同步算法。

指令 说明 示例
lr.w rd, (rs1) Load Reserved Word 从内存读取 rs1 地址的字到 rd,并建立保留 lr.w t0, (a0)
sc.w rd, rs2, (rs1) Store Conditional Word 若地址仍保留则写入 rs2 到内存,成功返回 0,失败返回非 0 sc.w t1, a1, (a0)

🔸 工作原理:

  1. lr.w 读取地址内容并在硬件中“保留”该地址;
  2. 若在执行 sc.w 期间,该地址未被其他核心修改,则 sc.w 写成功并返回 0;
  3. 否则写失败,返回非 0,可重试。

📘 应用: 实现 自旋锁、自定义原子加法、CAS(Compare-and-Swap) 等。


2️⃣ AMO(Atomic Memory Operation)型

AMO 是“单指令完成”的原子操作,语法形如:

amo<op>.w rd, rs2, (rs1)
指令 含义 操作
amoadd.w 原子加法 mem[rs1] = mem[rs1] + rs2
amoswap.w 原子交换 交换内存与寄存器内容
amoxor.w 原子 XOR 位运算异或
amoand.w 原子 AND 位与
amoor.w 原子 OR 位或
amomin.w 原子取最小值(有符号) mem[rs1] = min(mem[rs1], rs2)
amomax.w 原子取最大值(有符号)
amominu.w 原子取最小值(无符号)
amomaxu.w 原子取最大值(无符号)

🔹 所有 AMO 指令都会:

  1. 从内存加载一个值;
  2. 执行运算;
  3. 把结果写回内存;
  4. 把原始旧值放入 rd

🧠 四、示例:用 AMO 实现原子加法

asm
# 原子地执行 (*a0) += a1
amoadd.w x0, a1, (a0)

解释:


🧱 五、示例:自旋锁 (spinlock) with LR/SC

asm
# a0 = 锁地址
spin_lock:
    lr.w t0, (a0)        # 读取锁值
    bnez t0, spin_lock   # 如果不为0,锁已被占用,继续等待
    li   t1, 1
    sc.w t2, t1, (a0)    # 尝试将1写入锁地址
    bnez t2, spin_lock   # 如果失败(t2 != 0),重试
    ret                  # 获得锁成功

spin_unlock:
    sw x0, 0(a0)         # 写0,释放锁
    ret

🧩 六、小结

类别 指令前缀 功能特点 是否返回旧值
LR/SC lr.w / sc.w 灵活,可构建任意原子序列 lr.w 返回旧值
AMO amo* 单条指令完成原子更新 rd 接收旧值