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

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

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

二、自旋锁综合使用
   
    下面是一个使用的例子,你可以使用source insight查到它
   
    /* never called when PTRS_PER_PMD > 1 */
   
    void pgd_dtor(void *pgd, kmem_cache_t *cache, unsigned long unused)
   
    {
   
    unsigned long flags; /* can be called from interrupt context */
   
    spin_lock_irqsave(&pgd_lock, flags);  枷锁
   
    pgd_list_del(pgd);
   
    spin_unlock_irqrestore(&pgd_lock, flags); 释放
   
    }
   
    中断枷锁
   
    #define spin_lock_irqsave(lock, flags) _spin_lock_irqsave(lock, flags)
   
    分析
   
    unsigned long __lockfunc _spin_lock_irqsave(spinlock_t *lock)
   
    {
   
    unsigned long flags;
   
    local_irq_save(flags); 将寄存器存入flags,并关中断
   
    preempt_disable();   抢占锁
   
    _raw_spin_lock_flags(lock, flags);  枷锁
   
    return flags;
   
    }
   
    EXPORT_SYMBOL(_spin_lock_irqsave);
   
    继续
   
    /* For spinlocks etc */
   
    #define local_irq_save(x) __asm__ __volatile__("pushfl ; popl %0 ; cli":"=g" (x): /* no input */ :"memory")
   
    将标志寄存器的内容放在内存x中。请查看gcc汇编
   
    继续
   
    static inline void _raw_spin_lock_flags (spinlock_t *lock, unsigned long flags)
   
    {
   
    #ifdef CONFIG_DEBUG_SPINLOCK
   
    if (unlikely(lock->magic != SPINLOCK_MAGIC)) {
   
    printk("eip: %p ", __builtin_return_address(0));
   
    BUG();
   
    }
   
    #endif
   
    __asm__ __volatile__(
   
    spin_lock_string_flags
   
    :"=m" (lock->slock) : "r" (flags) : "memory");
   
    }
返回列表