Linux spin_lock与NT KeAcquireSpinLock

Ily*_*lya 6 windows wdk device-driver linux-device-driver linux-kernel

从我可以收集到:

  • NT KeAcquireSpinLock相当于spin_lock_bh:一个将IRQL提升到DISPATCH_LEVEL,另一个屏蔽下半部分中断 - 功能相同.虽然NT变体保留了OldIrql,但Linux变体似乎并未在任何地方存储"wereInterruptsAlreadyMasked".这是否意味着spin_unlock_bh总是取消它们?
  • NT KeAcquireInterruptSpinLock就像spin_lock_irqsave.

什么是NT相当于spin_lock

如果spin_unlock_bh总是取消屏蔽中断(在NT语言中,总是将IRQL丢弃到<DISPATCH_LEVEL),它是否意味着spin_lock类似于KeAcquireSpinLockAtDpcLevel

bdo*_*lan 2

spin_lock当您知道没有中断或下半部分将争夺锁时,可以使用原始数据。通过避免中断屏蔽,您可以降低中断延迟,同时仍然避免关键部分的互斥体开销足够短以进行旋转。

实际上,它们似乎主要由文件系统驱动程序等事物使用,用于锁定内部缓存结构,以及在持有锁时永远不需要阻塞 IO 的其他事物。由于后半部分和驱动程序中断永远不会直接接触 FS 驱动程序,因此无需屏蔽中断。

我怀疑 Windows 的等效项是 a CRITICAL_SECTION,或者任何 NT 内核 API 的等效项;然而,与 NT 临界区不同,Linux 自旋锁在发生争用时不会回退到互斥体;他们只是不停地旋转。

是的,spin_unlock_bh无条件恢复下半部分。您可以跟踪何时手动启用/禁用(因为您通常应该以与获取相反的顺序释放锁,这通常不是问题),或者只是求助于spin_lock_irqsave.