在Linux设备驱动程序中。当它引入自旋锁时,它给出了以下示例:
您的驱动程序正在执行,并且刚刚取出一个控制对其设备的访问的锁。当锁被持有时,设备发出一个中断,这将导致您的中断处理程序运行。在访问设备之前,中断处理程序还必须获得锁。在中断处理程序中取出自旋锁是合法的;这是spinlock操作不休眠的原因之一。但是,如果中断例程与最初取出锁的代码在同一个处理器中执行,会发生什么情况呢?当中断处理程序正在旋转时,非中断代码将无法运行以释放锁。处理器会永远旋转。
如何解决这个问题?用信号灯?请帮帮忙。
发布于 2012-05-30 14:36:38
您可以使用非中断代码中的spin_lock_irqsave来禁用当前核心上的硬件中断,或者使用同一章中“锁定”部分中描述的任何工具。
编辑0:
不记得确切的细节,但理论是:
在UP系统上,您根本不需要自旋锁--从访问与中断处理程序共享的数据的BH代码中禁用中断就足够了。在SMP系统中,需要自旋锁来保护自旋锁以防止在其他核上执行的相同BH代码的中断,如果您处理硬件,还希望禁用同一核上的中断以避免IRQ例程的死锁。
希望这能有所帮助。
https://stackoverflow.com/questions/10816288
复制相似问题