天天看點

RISC-V原子指令LR/SC

LR/SC 指令

LR 指令是 Load Reserved 的縮寫,讀取保留;SC 指令是 Store Conditional 的縮寫,條件存儲。

LR 指令格式及其變種如下:

lr.{w/d}.{aqrl} rd, (rs1)

lr 指令是從記憶體位址 rs1 中加載内容到 rd 寄存器。然後在 rs1 對應位址上設定保留标記(reservation set)。其中 w/d 分别對應 32 位/64 位版本。

SC 指令格式及其變種如下:

sc.{w/d}.{aqrl} rd, rs2, (rs1)

sc 指令在把 rs2 值寫到 rs1 位址之前,會先判斷 rs1 記憶體位址是否有設定保留标記,如果設定了,則把 rs2 值正常寫入到 rs1 記憶體位址裡,并把 rd 寄存器設定成 0,表示儲存成功。如果 rs1 記憶體位址沒有設定保留标記,則不儲存,并把 rd 寄存器設定成 1 表示儲存失敗。不管成功還是失敗,sc 指令都會把目前 hart 保留的所有保留标記全部清除。其中 w/d 分别對應 32 位/64 位版本。

記憶體通路順序(Memory Order)

RISC-V 和 ARM 類似,記憶體模型都是弱記憶體模型(relax memory model),這意味着,在不加額外限制的情況下,記憶體通路指令并不會完全按照指令順序執行。RISC-V 有一個 FENCE 指令,可以用來顯式添加記憶體順序限制。為了提高效率,RISC-V 為每個原子指令都預留 aq/rl 兩個比特位,進而可以很友善在原子指令上施加額外的記憶體順序限制。原子指令是用來在不同 hart 之間做同步用的,而記憶體通路順序強調的是同一個 hart 内的執行順序。

在上面介紹 LR/SC 和 AMO 指令時,每個指令後面都帶有一個 "aqrl" 的可選字尾。aq 是 acquire 的縮寫,rl 是 release 的縮寫。LR/SC 和 AMO 指令就是通過這兩個字尾來添加額外的記憶體順序限制。具體定義如下:

雖然 RISC-V 為每個原子指令都預留了 aq/rl 比特位,但對于一些特定指令,aq/rl 不能随便設定。比如 lr.d.rl 和 sc.d.aq 指令是沒有實際意義的,RISC-V 并沒有直接禁止這種用法,但這種指令沒有預期的原子通路效果。

RISC-V原子指令LR/SC

繼續閱讀