自旋锁汇编分析

806 阅读1分钟
; Intel sytax intel汇编语法 intel 80386兼容处理器 windows内核API

; 自旋锁:反复检查锁变量是否可用
; 获取自旋锁的线程,会一直保持该所,直至显示释放自旋锁
; 避免了进程上下文调度开销

; locked变量,1加锁,0解锁
locked:
    dd  0

; 加锁:
; 将操作数1赋值给寄存器eax
; 交换locked变量和eax值
; 使用eax寄存器测试它自己,除此之外,如果eax寄存器值是0将会设置处理器zf,如果eax是0,这个锁会解锁然后我们就锁住他了;如果eax是1,则我们不能获得锁
; jnz不等于时转移命令,跳转到mov指令如果zf没有被设置;若果锁已锁定,我们需要旋转它直到它解锁
; ret取到了锁,回到被调用方法继续执行
spin_lock:
    mov eax, 1
    xchg eax, [locked]
    test eax, eax
    jnz spin_lock
    ret

; 解锁
; 设置eax寄存器的值为0
; 交换eax和locked的值。标志当前未锁定状态
; 释放锁
spin_unlock:
    mov eax, 0
    xchg eax, [locked]
    ret



; 参考:标志寄存器 https://baike.baidu.com/item/%E6%A0%87%E5%BF%97%E5%AF%84%E5%AD%98%E5%99%A8
; 参考:汇编指令 https://baike.baidu.com/item/%E6%B1%87%E7%BC%96%E6%8C%87%E4%BB%A4
; 参考:自旋锁 https://zh.wikipedia.org/wiki/%E8%87%AA%E6%97%8B%E9%94%81