对内核同步机制的一个疑问


我们用GPIO模拟一段硬件时序时,为了避免时序被中断打断,通常会将中断关闭,等操作完成再打开中断。但在看一些参考书籍的时候说用自旋锁会更好,有的自旋锁接口会关闭中断,即spin_lock_irq()接口,这个接口实现如下:

   
  #define spin_lock_irq(lock)  _spin_lock_irq(lock)
  

static inline void __spin_lock_irq(spinlock_t *lock)
{
local_irq_disable();
preempt_disable();
spin_acquire(&lock->dep_map, 0, 0, _RET_IP_);
LOCK_CONTENDED(lock, _raw_spin_trylock, _raw_spin_lock);
}

这里不仅关闭了中断,还关闭了内核的抢占功能,在单核的情况下,该书的作为认为实现我说的这个功能不仅要关闭中断,同样需要关闭抢占,我觉得单核情况下关闭中断了就不会出现抢占的情况了,就用local_irq_disable()就可以了,不知道为什么还要再关闭抢占?

Linux 驱动

luguo 11 years, 11 months ago

内核抢占是以定时器中断为基础的,在每一个定时器中断的处理函数中会去检查是否需要调度,如果把中断关闭了就不会执行定时器的中断函数,也就不会出现抢占的情况,所以在单核的情况下关闭中断就可以了。

mofuu answered 11 years, 11 months ago

Your Answer