Linux spin_lock与NT KeAcquireSpinLock

时间:2011-10-15 01:01:46

标签: windows linux-kernel device-driver linux-device-driver wdk

从我可以收集的内容:

  • 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

1 个答案:

答案 0 :(得分:2)

当您知道没有中断或下半部分将争夺锁定时,可以使用原始spin_lock。通过避免中断屏蔽,可以降低中断延迟,同时仍然可以避免关键部分的互斥锁开销很短,从而无法启动。

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

我怀疑Windows等价物是CRITICAL_SECTION,或者NT内核API等价物;然而,与NT关键部分不同,Linux自旋锁在争用时不会回归到互斥锁;他们只是继续旋转。

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