인터럽트 리소스 설명자 사용

플러그 앤 플레이(PnP) 관리자는 두 번의 패스를 사용하여 인터럽트 메시지를 디바이스에 할당합니다. 먼저 PnP 관리자는 디바이스에 할당하려는 인터럽트 메시지를 비롯한 하드웨어 리소스 목록이 포함된 IRP_MN_FILTER_RESOURCE_REQUIREMENTS 요청을 드라이버 에 보냅니다. 드라이버는 이 목록을 수정하여 인터럽트 메시지 수와 일부 메시지별 설정을 변경할 수 있습니다. 그런 다음 PnP 관리자가 실제로 리소스를 할당한 후 IRP_MN_START_DEVICE 요청을 보내고 드라이버의 디바이스에 할당된 인터럽트 메시지를 비롯한 하드웨어 리소스의 전체 목록을 제공합니다.

IRP_MN_FILTER_RESOURCE_REQUIREMENTS 요청은 IO_RESOURCE_DESCRIPTOR 구조 목록을 제공합니다. 디바이스에 PCI 2.2 사양에 정의된 MSI(메시지 신호 인터럽트) 기능 구조가 있는 경우 PnP 관리자는 단일 인터럽트 메시지 설명자를 제공합니다. 디바이스에 PCI 3.0 사양에 정의된 MSI-X 기능 구조가 있는 경우 PnP 관리자는 각 인터럽트 메시지에 대해 하나의 구조를 제공합니다. 인터럽트 메시지 설명자에 형식 = CmResourceTypeInterruptFlags = CM_RESOURCE_INTERRUPT_LATCHED | CM_RESOURCE_INTERRUPT_MESSAGE. 드라이버는 구조체의 u.Interrupt 멤버를 변경하여 인터럽트 선호도와 같은 설정을 변경할 수도 있습니다. MSI를 사용할 때 인터럽트는 모두 동일한 선호도를 가지지만 MSI-X를 사용할 때는 서로 다른 친화력을 가질 수 있습니다. 자세한 내용은 선호도 및 우선 순위 중단을 참조하세요.

MSI의 경우 PCI 2.2에 정의된 대로 u.Interrupt.MaximumVector - u.Interrupt.MinimumVector + 1은 디바이스에 할당된 인터럽트 메시지 수입니다. 드라이버는 u.Interrupt.MinimumVector를 수정하여 인터럽트 메시지 수를 변경할 수 있습니다. MSI 인터럽트 메시지의 경우 u.Interrupt.MaximumVector 는 항상 CM_RESOURCE_INTERRUPT_MESSAGE_TOKEN. MessageCount 인터럽트 메시지를 할당하려면 u.Interrupt.MinimumVector를 CM_RESOURCE_INTERRUPT_MESSAGE_TOKEN - MessageCount + 1로 설정합니다.

MSI-X의 경우 PCI 3.0에 정의된 대로 드라이버는 목록에서 항목을 추가하거나 제거하여 할당된 인터럽트 메시지 수를 변경할 수 있습니다. 이러한 방식으로 추가된 인터럽트 메시지 리소스는 이후에 IRP_MN_START_DEVICE 요청에 대한 응답으로 제거되어서는 안 됩니다. MSI-X의 경우 PnP 관리자는 메시지 인터럽트당 하나의 설명자를 제공하고, 이 설명자의 u.Interrupt.MinimumVectoru.Interrupt.MaximumVector 멤버는 모두 CM_RESOURCE_INTERRUPT_MESSAGE_TOKEN 설정됩니다.

플러그 앤 플레이 관리자가 인터럽트 메시지를 포함하여 디바이스에 대한 모든 하드웨어 리소스를 할당하면 드라이버에 IRP_MN_START_DEVICE 요청을 보냅니다. 이 요청은 원시 및 번역된 리소스에 대해 각각 하나씩 두 개의 CM_PARTIAL_RESOURCE_DESCRIPTOR 구조 목록을 제공합니다. 인터럽트 메시지의 경우 PnP 관리자는CmResourceTypeInterruptFlags = CM_RESOURCE_INTERRUPT_LATCHED | 형식 = 으로 할당된 각 메모리 주소에 대해 하나의 구조를 제공합니다. CM_RESOURCE_INTERRUPT_MESSAGE.

MSI를 사용하는 경우 모든 메시지가 동일한 주소를 공유하기 때문에 드라이버는 하나의 인터럽트 리소스 설명자만 받습니다. u.MessageInterrupt.RawMessageCount 멤버를 사용하여 할당된 메시지 수를 확인할 수 있습니다. MSI-X를 사용하는 경우 드라이버는 각 인터럽트 메시지에 대해 별도의 리소스 설명자를 받습니다.

Windows 8 운영 체제는 디바이스 함수당 2048개 이상의 인터럽트 메시지에 대한 리소스 요청을 지원하지 않습니다. Windows 7 및 Windows Vista에서 운영 체제는 디바이스 함수당 910개 이상의 인터럽트 메시지에 대한 리소스 요청을 지원하지 않습니다. 디바이스 드라이버가 이 제한을 초과하면 디바이스가 시작되지 않을 수 있습니다. 드라이버가 많은 논리 프로세서가 포함된 컴퓨터에서 작동할 수 있도록 하려면 드라이버가 프로세서당 둘 이상의 인터럽트 요청을 피해야 합니다.

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