据我所知:
- NT 的
KeAcquireSpinLock
等同于spin_lock_bh
:一个将 IRQL 提升到 DISPATCH_LEVEL,另一个屏蔽下半部分中断 - 功能相同。虽然 NT 变体保留了 OldIrql,但 Linux 变体似乎没有在任何地方存储“wereInterruptsAlreadyMasked”。这是否意味着spin_unlock_bh
总是揭开他们的面纱? - NT 的
KeAcquireInterruptSpinLock
类似于spin_lock_irqsave
。
spin_lock
在 NT 中的等价物是什么?
如果 spin_unlock_bh
总是取消屏蔽中断(在 NT 语言中,总是将 IRQL 降到 KeAcquireSpinLockAtDpcLevel
?
最佳答案
原始的 spin_lock
可以在您知道没有中断或 bottom-halves 会争用锁时使用。通过避免中断屏蔽,您可以降低中断延迟,同时仍然避免了足够短的关键部分的互斥体开销以进行旋转。
实际上,它们似乎主要由文件系统驱动程序之类的东西使用,用于锁定内部缓存结构,以及其他在持有锁时永远不需要阻塞 IO 的东西。由于后半部分和驱动程序中断从不直接接触 FS 驱动程序,因此无需屏蔽中断。
我怀疑 Windows 等效项是 CRITICAL_SECTION
,或者 NT 内核 API 等效项是什么;但是,与 NT 临界区不同的是,Linux 自旋锁在竞争时不会退回到互斥锁;他们只是不停地旋转。
而且,是的,spin_unlock_bh
无条件恢复下半部。您可以跟踪何时手动启用/禁用(因为您通常应该以相反的获取顺序释放锁,这通常不是问题),或者只是求助于 spin_lock_irqsave
。
关于windows - Linux 自旋锁与 NT KeAcquireSpinLock,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7775049/