Skip to main content
 首页 » 编程设计

linux-kernel之spin_lock_irqsave和spin_lock_irq

2024年11月01日34傻小

在SMP机器上,我们必须使用spin_lock_irqsave而不是来自中断上下文的spin_lock_irq

为什么我们要保存标志(包含IF)?

是否有另一个中断例程可以中断我们?

请您参考如下方法:

我是内核的新手,但是从我从罗伯特·洛夫(Robert Love)的书“Linux Kernel Development”(Linux内核开发)中了解到的情况来看,如果在代码开始锁定之前已在处理器上禁用了中断,则在调用spin_unlock_irq时,您将以错误的方式释放锁定。如果保存标志并与标志一起释放,则spin_lock_irqsave函数将使中断返回其先前状态。
spin_lock_irqsave的示例

spinlock_t mLock = SPIN_LOCK_UNLOCK; 
unsigned long flags; 
 
spin_lock_irqsave(&mLock, flags); // save the state, if locked already it is saved in flags 
// Critical section 
spin_unlock_irqrestore(&mLock, flags); // return to the formally state specified in flags 

带有 spin_lock_irq的示例(不带irqsave):
spinlock_t mLock = SPIN_LOCK_UNLOCK; 
unsigned long flags; 
 
spin_lock_irq(&mLock); // Does not know if already locked 
// Critical section 
spin_unlock_irq(&mLock); // Could result in an error unlock...