2

在 Linux 设备驱动程序中。当它引入自旋锁时,它给出了以下示例:

您的驱动程序正在执行并且刚刚取出一个控制对其设备的访问的锁。当锁被持有时,设备会发出一个中断,这会导致你的中断处理程序运行。中断处理程序在访问设备之前也必须获得锁。在中断处理程序中取出自旋锁是合法的事情。这是自旋锁操作不休眠的原因之一。但是如果中断例程与最初取出锁的代码在同一个处理器中执行会发生什么?当中断处理程序正在旋转时,非中断代码将无法运行以释放锁定。该处理器将永远旋转。

如何解决这个问题?使用信号量?请帮忙。

4

1 回答 1

3

您可以使用spin_lock_irqsavefrom 非中断代码来禁用当前内核上的硬件中断,或者使用同一章节中“锁定的替代方案”部分中描述的任何工具。

编辑0:

不记得那里的确切细节,但理论是:

  • 在 UP 系统上,您根本不需要自旋锁 - 从访问与中断处理程序共享的数据的 BH 代码中禁用中断就足够了。
  • 在 SMP 系统上,您需要一个自旋锁来防止在其他内核上执行相同的 BH 代码,并且,如果您处理硬件,您还希望禁用同一内核上的中断以避免与 IRQ 例程发生死锁。
  • 中断处理程序总是需要在持有任何锁的同时禁用中断,以避免与自身发生死锁。

希望这可以帮助。

于 2012-05-30T14:36:38.100 回答