Introdução às interrupções de Message-Signaled
As MSIs (interrupções sinalizadas por mensagem) foram introduzidas na especificação PCI 2.2 como uma alternativa às interrupções baseadas em linha. Em vez de usar um pino dedicado para disparar interrupções, os dispositivos que usam MSIs disparam uma interrupção gravando um valor em um endereço de memória específico. O PCI 3.0 define uma forma estendida de MSI, chamada MSI-X, que permite maior programação. O Windows Vista e versões posteriores do Windows dão suporte a MSI e MSI-X. Um único dispositivo pode dar suporte a MSI e MSI-X. Para esse dispositivo, o sistema operacional usará automaticamente o MSI-X.
Uma mensagem de interrupção é um valor específico que um dispositivo grava em um endereço específico para disparar uma interrupção. Ao contrário das interrupções baseadas em linha, as interrupções sinalizadas por mensagem têm semântica de borda. O dispositivo envia uma mensagem, mas não recebe nenhuma confirmação de hardware de que a interrupção foi recebida.
Para a PCI 2.2, uma mensagem consiste em um endereço e um valor parcialmente opaco de 16 bits. Cada dispositivo recebe um único endereço. Para enviar várias mensagens, o dispositivo pode usar os 4 bits inferiores do valor da mensagem para distinguir mensagens. Portanto, para a PCI 2.2, os dispositivos podem dar suporte a até 16 mensagens.
Para pci 3.0, uma mensagem consiste em um endereço e um valor opaco de 32 bits. Cada mensagem diferente tem seu próprio endereço exclusivo. Ao contrário do PCI 2.2, o dispositivo não modifica o valor. Para o PCI 3.0, um dispositivo pode dar suporte a até 2.048 mensagens diferentes. Os dispositivos que dão suporte ao PCI 3.0 MSI-X apresentam uma tabela de hardware dinamicamente programável que contém entradas para cada uma das fontes de interrupção no dispositivo. Cada entrada nesta tabela pode ser programada com uma das mensagens alocadas para um dispositivo e pode ser mascarada independentemente. Os drivers podem alterar a programação de uma mensagem de interrupção em uma entrada de tabela e se uma entrada foi mascarada. Para obter mais informações, consulte Configurando dinamicamente o MSI-X.
Os drivers podem registrar uma única rotina InterruptMessageService que manipula todas as mensagens possíveis ou rotinas individuais de InterruptService para cada mensagem.
Os drivers podem lidar com MSIs que um dispositivo envia da seguinte maneira:
Durante a instalação do driver, habilite msis no registro. Você também pode usar o Registro para especificar o número de mensagens a serem alocadas para o dispositivo. Para obter mais informações, consulte Habilitando interrupções de Message-Signaled no Registro.
Opcionalmente, aumente o número de mensagens de interrupção e salve algumas configurações por mensagem respondendo a uma solicitação de IRP_MN_FILTER_RESOURCE_REQUIREMENTS . Para obter mais informações, consulte Usando descritores de recurso de interrupção.
Na rotina de expedição do driver para IRP_MN_START_DEVICE, chame IoConnectInterruptEx para registrar uma rotina InterruptService ou InterruptMessageService para atender às interrupções do dispositivo. Use a versão CONNECT_FULLY_SPECIFIED de IoConnectInterruptEx para registrar uma rotina InterruptService para uma mensagem específica ou a versão CONNECT_MESSAGE_BASED de IoConnectInterruptEx para registrar uma única rotina InterruptMessageService para todas as mensagens. Para obter mais informações, consulte Using the CONNECT_MESSAGE_BASED Version of IoConnectInterruptEx e Using the CONNECT_FULLY_SPECIFIED Version of IoConnectInterruptEx.
Depois que o driver não pretende mais atender a interrupções do dispositivo, chame IoDisconnectInterruptEx (depois de desabilitar as interrupções do dispositivo) para remover quaisquer rotinas de serviço de interrupção registradas.
Os drivers projetados para usar várias mensagens devem marcar que o número esperado de mensagens seja alocado. Se o gerenciador de Plug and Play (PnP) não puder alocar o número solicitado de mensagens, ele alocará exatamente uma mensagem ao dispositivo. Os drivers podem marcar o número de mensagens realmente alocadas de uma das seguintes maneiras:
O gerenciador PnP relata o número de mensagens alocadas em sua lista de descritores de recursos brutos. Para obter mais informações, consulte Usando descritores de recurso de interrupção.
Quando IoConnectInterruptEx retorna, ele define Parameters-MessageBased.ConnectContext.InterruptMessageTable-MessageCount>> como o número de mensagens alocadas.