인터럽트 개체 만들기

디바이스의 하드웨어 인터럽트 처리 WDF(Windows 드라이버 프레임워크) 드라이버는 각 디바이스가 지원할 수 있는 각 인터럽트마다 프레임워크 인터럽트 개체를 만들어야 합니다. 운영 체제의 Windows 8 이상 버전에서 실행되는 프레임워크 버전 1.11 이상에서 Kernel-Mode KMDF(Driver Framework) 및 User-Mode Driver Framework(UMDF) 드라이버는 수동 수준 처리가 필요한 인터럽트 개체를 만들 수 있습니다. 그러나 System on a Chip(SoC) 플랫폼용 드라이버를 작성하지 않는 한 드라이버는 DIRQL 인터럽트 개체를 사용해야 합니다.

드라이버는 일반적으로 EvtDriverDeviceAdd 콜백 함수에서 프레임워크 인터럽트 개체를 만듭니다. 드라이버는 EvtDevicePrepareHardware 콜백 함수에서 인터럽트 개체를 만들 수도 있습니다.

프레임워크는 플러그 앤 플레이(PnP) 관리자가 인터럽트 벡터와 같은 시스템 리소스를 디바이스에 할당하기 전에 드라이버의 EvtDriverDeviceAdd 콜백 함수를 호출합니다. PnP 관리자가 리소스를 할당한 후 프레임워크는 디바이스의 인터럽트 개체에 인터럽트 리소스를 저장합니다. (플러그 앤 플레이 지원하지 않는 드라이버는 인터럽트 개체를 사용할 수 없습니다.)

프레임워크 인터럽트 개체를 만들려면 드라이버가 WDF_INTERRUPT_CONFIG 구조를 초기화하고 WdfInterruptCreate 메서드에 전달해야 합니다.

UMDF는 다음과 같은 유형의 인터럽트 를 지원합니다.

  • 수준 트리거(공유 또는 배타적)
  • Edge 트리거(배타적 전용)
  • MSI(정의에 따라 배타적)

참고 UMDF는 공유 에지 트리거 인터럽트 를 지원하지 않습니다.

UMDF 버전 2.15부터 UMDF는 하드웨어 레지스터를 사용하여 명시적으로 사용하거나 사용하지 않도록 설정할 수 없는 하드웨어 누름 단추(일반적으로 GPIO 핀으로 지원)와 같은 간단한 디바이스에 대한 인터럽트 기능을 지원합니다. 이러한 디바이스를 지원하려면 UMDF 드라이버에서 전용 에지 트리거 인터럽트만 사용해야 합니다.

KMDF 버전 1.15부터 KMDF는 Active-Both 인터럽트 처리에 설명된 해결 방법 없이 이러한 디바이스에 대한 인터럽트도 지원합니다.

또한 WDF_INTERRUPT_CONFIG 드라이버는 다음 드라이버 제공 이벤트 콜백 함수에 대한 포인터를 제공합니다.

EvtInterruptEnable
하드웨어 인터럽트 사용

EvtInterruptDisable
하드웨어 인터럽트 사용 안 함

EvtInterruptIsr
인터럽트용 ISR(인터럽트 서비스 루틴)입니다.

EvtInterruptDpc
인터럽트용 DPC(지연 프로시저 호출)입니다.

EvtInterruptWorkItem
수동 수준 인터럽트용 작업 항목입니다.

운영 체제의 Windows 8 이상 버전에서 프레임워크 버전 1.11 이상을 사용하는 드라이버의 경우 드라이버는 프레임워크 인터럽트 개체(DIRQL 또는 수동)의 부모를 프레임워크 디바이스 개체 또는 프레임워크 큐 개체로 명시적으로 설정할 수 있습니다. 드라이버가 부모를 지정하는 경우 드라이버는 인터럽트 개체의 WDF_INTERRUPT_CONFIG 구조체의 AutomaticSerialization 멤버를 TRUE로 설정해야 합니다. ( AutomaticSerialization 이 TRUE인 경우 프레임워크는 인터럽트 개체의 EvtInterruptDpc 또는 EvtInterruptWorkItem 콜백 함수의 실행을 인터럽트의 부모 개체 아래에 있는 다른 개체의 콜백 함수와 동기화합니다.)

예를 들어 드라이버는 큐를 인터럽트의 부모로 지정하여 큐의 콜백을 인터럽트의 EvtInterruptDpc 또는 EvtInterruptWorkItem 콜백과 동기화할 수 있습니다. 이 구성에서 프레임워크는 디바이스 개체를 삭제할 때 큐 개체를 삭제합니다.

WdfInterruptCreate를 호출한 후 드라이버는 필요에 따라 WdfInterruptSetPolicy 또는WdfInterruptSetExtendedPolicy를 호출하여 추가 인터럽트 매개 변수를 지정할 수 있습니다. 일반적으로 드라이버는 EvtDriverDeviceAdd 콜백 함수에서 이러한 메서드를 호출합니다.

프레임워크는 인터럽트의 부모를 삭제하기 전에 인터럽트 를 자동으로 삭제합니다. 필요에 따라 드라이버는 WdfObjectDelete 를 호출하여 이전 시간에 인터럽트를 삭제할 수 있습니다.

메시지 신호 인터럽트 지원

MSI(메시지 신호 인터럽트)는 Windows Vista부터 지원됩니다. 운영 체제가 디바이스에 대한 MSI를 지원할 수 있도록 하려면 드라이버의 INF 파일이 레지스트리에 일부 값을 설정해야 합니다. 이러한 값을 설정하는 방법에 대한 자세한 내용은 레지스트리에서 Message-Signaled 인터럽트 사용을 참조하세요.

드라이버는 디바이스에서 지원할 수 있는 각 인터럽트 벡터 또는 MSI 메시지에 대한 프레임워크 인터럽트 개체를 만들어야 합니다. PnP 관리자가 디바이스에서 지원할 수 있는 모든 인터럽트 리소스를 디바이스에 부여하지 않으면 추가 인터럽트 개체가 사용되지 않으며 해당 콜백 함수가 호출되지 않습니다.

Windows 7에서 운영 체제는 디바이스 함수당 910개 이상의 인터럽트 메시지에 대한 리소스 요청을 지원하지 않습니다. Windows 8 운영 체제는 디바이스 함수당 2048개 이상의 인터럽트 리소스 요청을 지원하지 않습니다.

디바이스 드라이버가 이 제한을 초과하면 디바이스가 시작되지 않을 수 있습니다. 많은 논리 프로세서가 포함된 컴퓨터에서 작동하려면 드라이버가 프로세서당 둘 이상의 인터럽트 를 요청해서는 안 됩니다.

드라이버는 PnP 관리자가 리소스 요구 사항 목록에서 대체 인터럽트 리소스 집합을 디바이스에 할당하는 인터럽트 리소스의 시스템 리밸런싱을 실패 없이 허용해야 합니다. 예를 들어 디바이스에 요청된 드라이버보다 적은 수의 메시지 인터럽트 할당이 있을 수 있습니다. 최악의 경우 드라이버는 한 줄 기반 인터럽트만 사용하여 디바이스를 작동하도록 준비해야 합니다.