다음을 통해 공유


스핀 잠금을 사용하는 호출 지원 루틴

KeAcquireSpinLock 또는 KeAcquireInStackQueuedSpinLock을 호출하면, KeReleaseSpinLock 또는 KeReleaseInStackQueuedSpinLock을 호출하여 이전 IRQL이 복원될 때까지 현재 프로세서의 IRQL이 DISPATCH_LEVEL로 설정됩니다. 따라서 드라이버는 KeAcquireSpinLock 또는 KeAcquireInStackQueuedSpinLock을 호출할 때 IRQL <= DISPATCH_LEVEL 실행해야 합니다.

KeAcquireSpinLockAtDpcLevel, KeAcquireInStackQueuedSpinLockAtDpcLevel, KeReleaseInStackQueuedSpinLockFromDpcLevelKeReleaseSpinLockFromDpcLevel의 호출자는 이미 IRQL = DISPATCH_LEVEL 실행 중이므로 이러한 지원 루틴은 현재 프로세서에서 IRQL을 재설정할 필요가 없으므로 더 빠르게 실행됩니다. 따라서 대다수의 Windows 플랫폼에서는 DISPATCH_LEVEL 미만의 IRQL에서 실행 중에 KeAcquireSpinLockAtDpcLevel 또는 KeAcquireInStackQueuedSpinLockAtDpcLevel을 호출하면 치명적인 오류가 발생합니다. 호출자의 원래 IRQL이 복원되지 않았기 때문에 KeReleaseSpinLockFromDpcLevel을 호출하여 KeAcquireSpinLock으로 획득한 스핀 잠금을 해제하는 것도 오류입니다.

ExInterlockedXxx와 같은 임계 구역 스핀 잠금을 보유하는 루틴은 일반적으로 스핀 잠금을 해제하고 호출자에게 제어를 반환할 때까지 IRQL = DISPATCH_LEVEL에서 실행됩니다. 그러나 드라이버의 인터럽트 서비스 루틴 및 SynchCritSection 루틴(DIRQL에서 실행)은 루틴에 전달된 스핀 잠금이 ISR 및 SynchCritSection 루틴에서만 사용되는 한 ExInterlockedXxxList 루틴과 같은 특정 ExInterlocked Xxx 루틴을 호출할 수 있습니다.

인터럽트 스핀 잠금을 보유하는 각 루틴은 연결된 인터럽트 개체 집합의 DIRQL에서 실행됩니다. 따라서 드라이버는 KeAcquireSpinLockKeReleaseSpinLock 또는 ISR 또는 SynchCritSection 루틴에서 임원 스핀 잠금을 사용하는 다른 루틴을 호출해서는 안됩니다. 이러한 호출은 시스템 교착 상태를 일으킬 수 있는 오류로, 사용자가 컴퓨터를 다시 부팅해야 합니다. 드라이버의 ISR 또는 SynchCritSection 루틴이 ExInterlockedXxxList 루틴을 호출하는 경우, 드라이버는 이 루틴에 전달한 스핀 잠금을 ExInterlockedXxxList 루틴에 대해 KeXxxSpinLock 또는 KeXxxSpinLockXxxDpcLevel 지원 루틴을 호출할 때 다시 사용할 수 없습니다.

드라이버에 다중 벡터 ISR 또는 둘 이상의 ISR이 있는 경우 해당 루틴은 연결된 인터럽트 개체에 대해 지정된 SynchronizeIrql 값까지 모든 IRQL에서 실행하는 동안 KeSynchronizeExecution을 호출할 수 있습니다.