SynchCritSection 루틴 소개
중요한 섹션 은 하드웨어 리소스 또는 드라이버 데이터에 대한 단독 액세스가 필요한 코드 섹션입니다. 즉, 동일한 리소스 또는 데이터를 참조할 수 있는 다른 코드에 의해 코드가 중단되어서는 안 되며 한 번에 둘 이상의 프로세서에서 리소스 또는 데이터를 참조해서는 안 됩니다.
중요한 섹션은 ISR 및 SynchCritSection 루틴으로 제한되어야 합니다. 시스템은 현재 프로세서의 IRQL을 디바이스의 DIRQL 값으로 올리고 스핀 잠금을 획득한 후에만 이러한 루틴을 호출합니다. SynchCritSection 루틴이 반환되면 시스템은 스핀 잠금을 해제하고 프로세서의 IRQL을 낮춥니다.
프로세서의 IRQL을 디바이스의 DIRQL 값으로 올리면 우선 순위가 높은 디바이스를 제외하고 현재 프로세서가 중단되지 않습니다. 스핀 잠금을 획득하면 다른 프로세서가 해당 스핀 잠금과 연결된 중요한 섹션 코드를 실행할 수 없습니다. (이 스핀 잠금을 인터럽트 스핀 잠금이라고도 합니다.)
디바이스 드라이버의 StartIo 및 DpcForIsr 또는 CustomDpc 루틴은 드라이버의 ISR과 동일한 하드웨어 리소스 (예: 디바이스 레지스터 또는 기타 버스 상대 메모리) 또는 드라이버 유지 관리 데이터에 자주 액세스해야 합니다. 드라이버의 디바이스 또는 디자인에 따라 디스패치, AdapterControl, ControllerControl 또는 타이머 루틴도 하드웨어 리소스 또는 드라이버 유지 관리 데이터에 액세스할 수 있습니다.
ISR이 아닌 중요한 섹션을 호출하려면 드라이버가 KeSynchronizeExecution 루틴을 사용해야 합니다. 이 루틴은 드라이버 정의 컨텍스트 정보 및 인터럽트 개체 포인터와 함께 SynchCritSection 루틴의 주소를 입력으로 허용합니다. 시스템은 인터럽트 개체 포인터를 사용하여 SynchCritSection 루틴에 사용할 DIRQL 및 스핀 잠금을 결정합니다. (드라이버는 이전에 IoConnectInterrupt 함수의 SpinLock 및 SynchronizeIrql 매개 변수를 사용하여 이러한 값을 제공했습니다.)