디바이스 데이터에 대한 액세스 동기화
일반적으로 드라이버의 InterruptService 또는 ISR(InterruptMessageService 루틴)은 드라이버 데이터 및 하드웨어 리소스에 대한 액세스를 다른 드라이버 루틴과 공유해야 합니다. ISR은 관리자 권한 IRQL의 인터럽트 컨텍스트에서 실행되고 시스템에 여러 프로세서가 있을 수 있으므로 각 루틴이 중단 없이 이 공유 정보에 대한 단독 액세스를 일시적으로 가질 수 있도록 공유 데이터 및 리소스에 대한 액세스를 동기화하는 것이 중요합니다.
시스템은 인터럽트 중요 섹션 내에서 ISR을 실행하여 이 동기화를 지원합니다. 인터럽트에는 할당된 스핀 잠금, 인터럽트 스핀 잠금 및 인터 럽트 동기화 IRQL인 IRQL이 있습니다. 시스템은 프로세서의 IRQL을 인터럽트 동기화 IRQL로 올리고 코드를 실행하기 전에 인터럽트 스핀 잠금을 획득하여 중요한 섹션 내에서 이 코드를 공유 정보에 대한 단독 액세스 권한으로 실행하도록 보장합니다. 시스템은 ISR을 실행하기 전에 항상 인터럽트의 중요 섹션에 들어갑니다. 다른 인터럽트는 인터럽트 스핀 잠금 및 동기화 IRQL을 공유하여 동일한 중요 섹션을 공유할 수 있습니다.
드라이버는 SynchCritSection 루틴을 제공하여 인터럽트의 중요 섹션에서 실행되는 코드를 구현할 수 있습니다. 드라이버가 KeSynchronizeExecution 을 사용하여 SynchCritSection 루틴을 호출하는 경우 시스템은 인터럽트 매개 변수로 지정된 인터럽트에 대한 중요 섹션을 자동으로 입력합니다.
프로세서의 IRQL을 인터럽트의 동기화 IRQL로 올리면 동기화 IRQL이 더 높은 인터럽트를 제외하고 현재 프로세서가 중단되지 않습니다. 스핀 잠금을 획득하면 다른 프로세서가 해당 스핀 잠금과 관련된 중요한 섹션 코드를 실행할 수 없습니다.
시스템은 드라이버가 IoConnectInterruptEx를 호출할 때 인터럽트에 대한 인터럽트 스핀 잠금 및 동기화 IRQL을 할당합니다. 대부분의 경우 드라이버는 시스템에서 다음 두 값을 모두 확인하도록 허용할 수 있습니다.
드라이버가 CONNECT_LINE_BASED 버전의 IoConnectInterruptEx를 사용하고 NULL 스핀 잠금을 지정하는 경우 시스템은 인터럽트 라인에 스핀 잠금을 할당합니다. 또한 시스템은 동기화 IRQL의 값을 결정합니다(드라이버는 필요에 따라 더 높은 값을 지정할 수 있음).
드라이버가 CONNECT_MESSAGE_BASED 버전의 IoConnectInterruptEx를 사용하고 NULL 스핀 잠금을 지정하는 경우 시스템은 각 인터럽트 메시지에 대해 스핀 잠금을 할당합니다. 또한 시스템은 각 메시지에 대한 동기화 IRQL 값을 결정합니다(드라이버는 필요에 따라 모든 메시지에 공통되는 더 높은 값을 지정할 수 있음).
드라이버는 IoConnectInterruptEx 의 CONNECT_FULLY_SPECIFIED 버전을 사용하고 동일한 중요 섹션을 공유해야 하는 여러 인터럽트 벡터가 있는 경우에만 자체 스핀 잠금을 할당해야 합니다. 드라이버는 IO_CONNECT_INTERRUPT_PARAMETERSSpinLock 및 SynchronizeIrql 멤버를 사용하여 자체 스핀 잠금 및 동기화 IRQL을 지정할 수 있습니다. 자세한 내용은 IO_CONNECT_INTERRUPT_PARAMETERS 참조하세요.
중요한 섹션을 작성하고 입력하는 방법에 대한 자세한 내용은 중요 섹션 사용을 참조하세요.