다음을 통해 공유


인터럽트 서비스

이 항목에서는 DIRQL 인터럽트 서비스를 사용하는 방법을 설명합니다. 수동 수준 인터럽트 서비스에 대한 자세한 내용은 수동 수준 인터럽트 지원을 참조하세요.

인터럽트 서비스 는 다음 두 단계와 경우에 따라 세 단계로 구성됩니다.

  1. IRQL = DIRQL에서 실행되는 인터럽트 서비스 루틴에서 휘발성 정보(예: 콘텐츠 등록)를 신속하게 저장합니다.

  2. IRQL = DISPATCH_LEVEL 실행되는 DPC(지연 프로시저 호출)에서 저장된 휘발성 정보를 처리합니다.

  3. 필요한 경우 IRQL = PASSIVE_LEVEL 추가 작업 수행

디바이스가 하드웨어 인터럽트를 생성하면 프레임워크는 프레임워크 기반 드라이버가 EvtInterruptIsr 콜백 함수로 구현하는 드라이버의 ISR(인터럽트 서비스 루틴)을 호출합니다.

디바이스의 DIRQL에서 실행되는 EvtInterruptIsr 콜백 함수는 다른 인터럽트가 발생할 경우 손실되는 레지스터 콘텐츠와 같은 인터럽트 정보를 신속하게 저장해야 합니다.

일반적으로 EvtInterruptIsr 콜백 함수는 나중에 더 낮은 IRQL(DISPATCH_LEVEL)에서 저장된 정보를 처리하기 위해 DPC(지연 프로시저 호출)를 예약합니다. 프레임워크 기반 드라이버는 DPC 루틴을 EvtInterruptDpc 또는 EvtDpcFunc 콜백 함수로 구현합니다.

대부분의 드라이버는 각 인터럽트 유형에 대해 단일 EvtInterruptDpc 콜백 함수를 사용합니다. EvtInterruptDpc 콜백 함수의 실행을 예약하려면 드라이버는 EvtInterruptIsr 콜백 함수 내에서 WdfInterruptQueueDpcForIsr를 호출해야 합니다.

드라이버가 각 디바이스에 대해 여러 프레임워크 큐 개체 를 만드는 경우 각 큐에 대해 별도의 DPC 개체EvtDpcFunc 콜백 함수를 사용하는 것이 좋습니다. EvtDpcFunc 콜백 함수의 실행을 예약하려면 드라이버가 먼저 드라이버의 EvtDriverDeviceAdd 콜백 함수에서 WdfDpcCreate를 호출하여 하나 이상의 DPC 개체를 만들어야 합니다. 그런 다음 드라이버의 EvtInterruptIsr 콜백 함수는 WdfDpcEnqueue를 호출할 수 있습니다.

드라이버는 일반적으로 EvtInterruptDpc 또는 EvtDpcFunc 콜백 함수에서 I/O 요청을 완료합니다.

드라이버가 IRQL = PASSIVE_LEVEL 일부 인터럽트 서비스 작업을 수행해야 하는 경우가 있습니다. 이러한 경우 IRQL = DISPATCH_LEVEL 실행되는 드라이버의 EvtInterruptDpc 또는 EvtDpcFunc 콜백 함수는 IRQL = PASSIVE_LEVEL 실행되는 하나 이상의 프레임워크 작업 항목 실행을 예약할 수 있습니다.

디바이스 인터럽트를 서비스하는 동안 작업 항목을 사용하는 드라이버의 예는 PCIDRV 샘플 드라이버를 참조하세요.