Message-Signaled 인터럽트 소개

메시지 신호 인터럽트(MSI)는 줄 기반 인터럽트 대신 PCI 2.2 사양에 도입되었습니다. 전용 핀을 사용하여 인터럽트를 트리거하는 대신 MSI를 사용하는 디바이스는 특정 메모리 주소에 값을 기록하여 인터럽트를 트리거합니다. PCI 3.0은 더 큰 프로그래밍 기능을 가능하게 하는 MSI-X라는 확장된 형태의 MSI를 정의합니다. Windows Vista 이상 버전의 Windows는 MSI 및 MSI-X를 지원합니다. 단일 디바이스는 MSI와 MSI-X를 모두 지원할 수 있습니다. 이러한 디바이스의 경우 운영 체제는 MSI-X를 자동으로 사용합니다.

인터럽트 메시지는 디바이스가 인터럽트를 트리거하기 위해 특정 주소에 쓰는 특정 값입니다. 줄 기반 인터럽트와 달리 메시지 신호 인터럽트는 에지 의미 체계를 갖습니다. 디바이스는 메시지를 보내지만 인터럽트 수신에 대한 하드웨어 승인을 받지 않습니다.

PCI 2.2의 경우 메시지는 주소와 부분적으로 불투명한 16비트 값으로 구성됩니다. 각 디바이스에는 단일 주소가 할당됩니다. 여러 메시지를 보내기 위해 디바이스는 메시지 값의 하위 4비트 를 사용하여 메시지를 구분할 수 있습니다. 따라서 PCI 2.2의 경우 디바이스는 최대 16개 메시지를 지원할 수 있습니다.

PCI 3.0의 경우 메시지는 주소와 불투명한 32비트 값으로 구성됩니다. 각 메시지에는 고유한 주소가 있습니다. PCI 2.2와 달리 디바이스는 값을 수정하지 않습니다. PCI 3.0의 경우 디바이스는 최대 2,048개의 다른 메시지를 지원할 수 있습니다. PCI 3.0 MSI-X를 지원하는 디바이스에는 디바이스의 각 인터럽트 원본에 대한 항목이 포함된 동적으로 프로그래밍 가능한 하드웨어 테이블이 있습니다. 이 테이블의 각 항목은 디바이스에 할당된 메시지 중 하나로 프로그래밍할 수 있으며 독립적으로 마스킹할 수 있습니다. 드라이버는 인터럽트 메시지의 프로그래밍을 테이블 항목으로 변경하고 항목이 마스킹되었는지 여부를 변경할 수 있습니다. 자세한 내용은 동적으로 MSI-X 구성을 참조하세요.

드라이버는 각 메시지에 대해 가능한 모든 메시지 또는 개별 InterruptService 루틴을 처리하는 단일 InterruptMessageService 루틴을 등록할 수 있습니다.

드라이버는 다음과 같이 디바이스에서 보내는 MSI를 처리할 수 있습니다.

  1. 드라이버를 설치하는 동안 레지스트리에서 MSI를 사용하도록 설정합니다. 레지스트리를 사용하여 디바이스에 할당할 메시지 수를 지정할 수도 있습니다. 자세한 내용은 레지스트리에서 Message-Signaled 인터럽트 사용을 참조하세요.

  2. 필요에 따라 인터럽트 메시지 수를 늘리고 IRP_MN_FILTER_RESOURCE_REQUIREMENTS 요청에 응답하여 메시지별 설정을 저장합니다. 자세한 내용은 인터럽트 리소스 설명자 사용을 참조하세요.

  3. IRP_MN_START_DEVICE 대한 드라이버의 디스패치 루틴에서 IoConnectInterruptEx를 호출하여 인터럽트 서비스 디바이스의 인터럽트에 대한 InterruptService 또는 InterruptMessageService 루틴을 등록합니다. CONNECT_FULLY_SPECIFIED 버전의 IoConnectInterruptEx 를 사용하여 특정 메시지에 대한 InterruptService 루틴을 등록하거나 IoConnectInterruptEx 의 CONNECT_MESSAGE_BASED 버전을 등록하여 모든 메시지에 대해 단일 InterruptMessageService 루틴을 등록합니다. 자세한 내용은 CONNECT_MESSAGE_BASED 버전의 IoConnectInterruptEx 사용 및 IoConnectInterruptEx의 CONNECT_FULLY_SPECIFIED 버전 사용을 참조하세요.

  4. 드라이버가 더 이상 디바이스에서 인터럽트를 서비스하지 않으려면 IoDisconnectInterruptEx (디바이스 인터럽트를 사용하지 않도록 설정 한 후)를 호출하여 등록된 인터럽트 서비스 루틴을 제거합니다.

여러 메시지를 사용하도록 설계된 드라이버는 예상되는 메시지 수가 할당될 검사 합니다. 플러그 앤 플레이(PnP) 관리자가 요청된 메시지 수를 할당할 수 없는 경우 디바이스에 정확히 하나의 메시지를 할당합니다. 드라이버는 다음 방법 중 하나로 실제로 할당된 메시지 수를 검사 수 있습니다.

  • PnP 관리자는 원시 리소스 설명자 목록에 할당된 메시지 수를 보고합니다. 자세한 내용은 인터럽트 리소스 설명자 사용을 참조하세요.

  • IoConnectInterruptEx가 반환되면 Parameters-MessageBased.ConnectContext.InterruptMessageTable-MessageCount>> 를 할당된 메시지 수로 설정합니다.