Board logo

标题: Linux内核同步机制的自旋锁原理及应用 04 [打印本页]

作者: samwalton    时间: 2013-8-29 15:12     标题: Linux内核同步机制的自旋锁原理及应用 04

继续
   
    #define spin_lock_string_flags
   
    " 1: "
   
    "lock ; decb %0 "    ;lock总线锁住,原子操作
   
    "jns 4f "
   
    "2: "
   
    "testl $0x200, %1 "
   
    "jz 3f "
   
    "sti "
   
    "3: "
   
    "rep;nop "
   
    "cmpb $0, %0 "
   
    "jle 3b "
   
    "cli "
   
    "jmp 1b "
   
    "4: "
   
    理解一下大概意思,就可以了。当lock-1后大于等于0就可以关中断继续执行了,否则nop空操作。Nop期间,cpu可以执行其他任务的代码。
   
    解锁
   
    #define spin_unlock_irqrestore(lock, flags) _spin_unlock_irqrestore(lock, flags)
   
    void __lockfunc _spin_unlock_irqrestore(spinlock_t *lock, unsigned long flags)
   
    {
   
    _raw_spin_unlock(lock);
   
    local_irq_restore(flags);
   
    preempt_enable();
   
    }
   
    static inline void _raw_spin_unlock(spinlock_t *lock)
   
    {
   
    #ifdef CONFIG_DEBUG_SPINLOCK
   
    BUG_ON(lock->magic != SPINLOCK_MAGIC);
   
    BUG_ON(!spin_is_locked(lock));
   
    #endif
   
    __asm__ __volatile__(
   
    spin_unlock_string
   
    );
   
    }
   
    Raw赤裸的解锁,表示最低沉的解锁原理。
   
    #define spin_unlock_string
   
    "xchgb %b0, %1"
   
    :"=q" (oldval), "=m" (lock->slock)
   
    :"0" (oldval) : "memory"
   
    加1.解锁




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0