在 Linux 设备驱动程序中。当它引入自旋锁时,它给出了以下示例:
您的驱动程序正在执行并且刚刚取出一个控制对其设备的访问的锁。当锁被持有时,设备会发出一个中断,这会导致你的中断处理程序运行。中断处理程序在访问设备之前也必须获得锁。在中断处理程序中取出自旋锁是合法的事情。这是自旋锁操作不休眠的原因之一。但是如果中断例程与最初取出锁的代码在同一个处理器中执行会发生什么?当中断处理程序正在旋转时,非中断代码将无法运行以释放锁定。该处理器将永远旋转。
如何解决这个问题?使用信号量?请帮忙。
在 Linux 设备驱动程序中。当它引入自旋锁时,它给出了以下示例:
您的驱动程序正在执行并且刚刚取出一个控制对其设备的访问的锁。当锁被持有时,设备会发出一个中断,这会导致你的中断处理程序运行。中断处理程序在访问设备之前也必须获得锁。在中断处理程序中取出自旋锁是合法的事情。这是自旋锁操作不休眠的原因之一。但是如果中断例程与最初取出锁的代码在同一个处理器中执行会发生什么?当中断处理程序正在旋转时,非中断代码将无法运行以释放锁定。该处理器将永远旋转。
如何解决这个问题?使用信号量?请帮忙。
您可以使用spin_lock_irqsave
from 非中断代码来禁用当前内核上的硬件中断,或者使用同一章节中“锁定的替代方案”部分中描述的任何工具。
不记得那里的确切细节,但理论是:
希望这可以帮助。