【问题标题】:Solving the Spinlock issue解决自旋锁问题
【发布时间】:2012-05-30 12:27:13
【问题描述】:

在 Linux 设备驱动程序中。在引入自旋锁的时候,给出了下面的例子:

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

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

【问题讨论】:

    标签: linux-device-driver spinlock


    【解决方案1】:

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

    编辑 0:

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

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

    希望这会有所帮助。

    【讨论】:

    • 感谢您的回复。在中断例程中 spin_lock_irqsave 应该在单处理器系统和多处理器系统中使用,我可以使用 spin_lock、spin_lock_irqsave、spin_lock_irq。我的理解正确吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-02
    • 2016-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多