Linux spin_lock против NT KeAcquireSpinLock

Из чего я могу собрать:

  • 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?

windows,linux-kernel,device-driver,linux-device-driver,wdk,

6

Ответов: 1


"за" 2 "за" принято

Необработанный spin_lockможет быть использован, когда вы знаете, что никаких прерываний или нижние половины не будут бороться за блокировку Избегая маскирования прерываний, вы уменьшаете задержку прерываний, в то же время избегая накладных расходов мьютекса для критических секций, достаточно коротких, чтобы вращаться.

На практике они, по-видимому, в основном используются такими вещами, как драйверы файловой системы, для блокировки структур внутреннего кэша и другими вещами, когда при блокировке блокировки нет необходимости блокировать ввод-вывод. Поскольку задние половины и прерывания драйвера никогда не касаются драйвера FS напрямую, нет необходимости маскировать прерывания.

Я подозреваю, что эквивалент Windows был бы CRITICAL_SECTION, или любой другой эквивалент API ядра NT; однако, в отличие от критической секции NT, спин-блокировки Linux не возвращаются к мьютексу, когда утверждаются; они просто продолжают вращаться.

И, да, spin_unlock_bhбезусловно восстанавливает нижние половинки. Вы можете либо отслеживать, когда включать / отключать вручную (так как вы обычно должны снимать блокировки в обратном порядке получения, это обычно не проблема), либо просто прибегнуть к помощи spin_lock_irqsave.

Windows, Linux-ядро, драйвера устройства, линукс-драйвера устройства, WDK,
Похожие вопросы