首页 > 解决方案 > 以下代码如何制作大内核锁?

问题描述

MPgetlock_edx:
1:
    movl    (%edx), %eax
    movl    %eax, %ecx
    andl    $CPU_FIELD,%ecx
    cmpl    _cpu_lockid, %ecx
    jne 2f
    incl    %eax
    movl    %eax, (%edx)
    ret
2:
    movl    $FREE_LOCK, %eax
    movl    _cpu_lockid, %ecx
    incl    %ecx
    lock
    cmpxchg %ecx, (%edx)
    jne 1b
    GRAB_HWI
    ret
  1. 为什么上层函数可以实现大内核锁(BKL)?
  2. 'cmpxchg' 是原子的吗?为什么在它之前需要“锁定”?(这部分是Is x86 CMPXCHG atomic 的副本,如果是,为什么需要 LOCK?
  3. 为什么不直接 'movl (%edx), %ecx' 呢?

标签: assemblyx86lockingatomic

解决方案


推荐阅读