Linux内核中的原始代码是:
static inline void __raw_spin_lock_irq(raw_spinlock_t *lock)
{
local_irq_disable();
preempt_disable();
spin_acquire(&lock->dep_map, 0, 0, _RET_IP_);
LOCK_CONTENDED(lock, do_raw_spin_trylock, do_raw_spin_lock);
}
我认为禁用本地 IRQ 后没有任何执行路径可以抢占当前路径。
由于所有常见的硬 IRQ 均被禁用,因此不应发生软中断,也不应出现调度轮的滴答声。我认为目前的道路是安全的。那么为什么会有一个preempt_disable()
?
据我所知,preempt_disable()
调用被添加到相当多的锁定原语中,包括spin_lock_irq
,由 Dave Miller 于 2002 年 12 月 4 日发布,并于 2.5.51 发布。提交消息没有帮助;它只是说“[SPINLOCK]:修复非 SMP nopping spin/rwlock 宏。”
我相信可抢占内核下的正确锁定 http://lxr.linux.no/linux+v3.6.6/Documentation/preempt-locking.txt#L117文档很好地解释了这一点。标题为“使用中断禁用防止抢占”的最后一节开始,
It is possible to prevent a preemption event using local_irq_disable and
local_irq_save. Note, when doing so, you must be very careful ...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)