| 名称 | 含义 | 功能 |
|---|---|---|
| RV32A | Atomic Instructions Extension | 为多线程/多核系统提供“原子读-改-写”指令,保证内存访问的原子性(不被中断或抢占) |
✅ “原子”意思是:整个操作(读、修改、写)在执行期间不可被打断。 这在实现锁(lock)、信号量(semaphore)、自旋锁(spinlock)等并发控制结构时至关重要。
| 特性 | 说明 |
|---|---|
| 原子访问 | 支持对内存中的一个字(word, 4 B)或双字(在 RV64)执行原子读-改-写 |
| 同步机制 | 硬件级别的同步保障,无需额外锁机制 |
| 典型应用 | 多核共享内存、操作系统内核同步、原子计数器、互斥锁实现 |
| 依赖扩展 | RV32I 基础指令集 |
RV32A 提供两种风格的原子指令:
这种方式更灵活,可实现各种同步算法。
| 指令 | 说明 | 示例 |
|---|---|---|
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) |
🔸 工作原理:
lr.w 读取地址内容并在硬件中“保留”该地址;sc.w 期间,该地址未被其他核心修改,则 sc.w 写成功并返回 0;📘 应用: 实现 自旋锁、自定义原子加法、CAS(Compare-and-Swap) 等。
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 指令都会:
rd。# 原子地执行 (*a0) += a1
amoadd.w x0, a1, (a0)
解释:
# 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 接收旧值 |