带锁的 MIPS 同步

MIPS Synchronization with locks

"Computer Organization and Design" 书的幻灯片将此代码片段显示为获取锁的示例:

try: addi $t0,$zero,1 #copy locked value
ll $t1,0($s1) #load linked
sc $t0,0($s1) #store conditional
beq $t0,$zero,try #branch if store fails
#<< lock acquired >>

我的理解是 ll 指令读取内存位置的初始值,并且 sc 只有在 ll 读取的初始值未更改的情况下才将值存储在那里.因此,如果内存位置的初始值是 1 意味着锁已被另一个处理器获取,那么这个过程是否会简单地覆盖该值并假设它以这种方式获取了锁?

我认为您的代码段中缺少条件分支。你应该检查锁是否已经被占用。

即:

try: 
   addi $t0,$zero,1 #copy locked value
retry:
  ll $t1,0($s1) #load linked
  bnez $t1, retry # If lock taken, retry
  sc $t0,0($s1) #store conditional
  beq $t0,$zero,try #branch if store fails
#<< lock acquired >>