首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

Linux内核同步机制的自旋锁原理及应用 04

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.解锁
返回列表