windows - Linux 自旋锁与 NT KeAcquireSpinLock

标签 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

spin_lock 在 NT 中的等价物是什么?

如果 spin_unlock_bh 总是取消屏蔽中断(在 NT 语言中,总是将 IRQL 降到 spin_lock 类似于 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/

相关文章:

windows - 内核调试: Windows 7 hangs at boot time

linux - 是否有任何用户空间工具可用于 eMMC 在 linux 中执行诊断测试和性能测试?

linux - 插入具有循环依赖性的模块 (*.ko)

python - 为什么 Python 多处理没有将 4 核 CPU 上的处理时间减少到 1/4

windows - git-bash 中的 curl 命令

c - 如何在 ubuntu 上编译内核 3.14(从 kernel.org 下载)

linux - 与 I/O 地址端口相比,设备 mmap 如何工作?

c - C中的多处理

.net - 所有者绘制 TextBox 以在 WinForms 中使用

linux - 内核中的malloc