螺旋锁和cli一起使用

Kar*_*uru 2 rtos interrupt linux-kernel spinlock

我最近从http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.34.1.tar.bz2下载了linux源代码.我在linux-2.6.34.1\Documentation文件夹中的spinlocks.txt文件中遇到了以下段落.

"这确实意味着如果你有一些代码可以做到

cli();
.. critical section ..
sti();
Run Code Online (Sandbox Code Playgroud)

和另一个序列

spin_lock_irqsave(flags);
.. critical section ..
spin_unlock_irqrestore(flags);
Run Code Online (Sandbox Code Playgroud)

然后它们不是互斥的,关键区域可以在两个不同的CPU上同时发生.这本身很好,但关键区域最好对不同的东西至关重要(即它们不能相互踩踏)."

如果某些代码使用cli()/ sti()并且相同代码的其他部分使用spin_lock_irqsave(flags)/ spin_unlock_irqrestore(flags),它们如何影响?

Nik*_*sov 7

这里的关键部分是"在两个不同的CPU上 ".一些背景:

  • 历史上,在单处理器(UP)系统上,唯一的并发源是硬件中断.这足以cli/sti围绕关键部分,以防止IRQ处理程序弄乱的东西了.
  • 然后是巨型锁设计,其中内核将在单个CPU上有效运行,并且一次只有一个进程可以在内核中(这就是巨型锁的用途).同样,禁用中断足以保护内核不受其影响.
  • 在完整的SMP系统上,多个线程可以在内核中同时处于活动状态,并且中断可以传递到几乎任何CPU,仅仅禁用单个处理器上的中断,或者仅获取单个锁定就不够了.两者都是必需的:禁用中断可以保护同一CPU上的 IRQ处理程序,保持锁可以防止其他线程进入不同CPU上的相同关键部分.这就是为什么spin_lock_irqsave()spin_unlock_irqrestore()被发明.