Partilhar via


Introdução às interrupções sinalizadas por mensagem

As interrupções sinalizadas por mensagem (MSIs) 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. PCI 3.0 define uma forma estendida de MSI, chamado MSI-X, que permite maior programabilidade. Um único dispositivo pode suportar MSI e MSI-X. Para tal 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 PCI 2.2, uma mensagem consiste em um endereço e um valor parcialmente opaco de 16 bits. A cada dispositivo é atribuído 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 PCI 2.2, os dispositivos podem suportar 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 o seu próprio endereço único. Ao contrário do PCI 2.2, o dispositivo não modifica o valor. Para PCI 3.0, um dispositivo pode suportar até 2.048 mensagens diferentes. Os dispositivos que suportam 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 que são alocadas a 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 lida com todas as mensagens possíveis ou rotinas InterruptService individuais para cada mensagem.

Os drivers podem lidar com MSIs que um dispositivo envia da seguinte maneira:

  1. Durante a instalação do driver, ative MSIs no registo. 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 Ativar Message-Signaled Interrupções no Registro.

  2. 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 recursos de interrupção.

  3. Na rotina de despacho 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 do IoConnectInterruptEx para registrar uma rotina InterruptService para uma mensagem específica ou a versão CONNECT_MESSAGE_BASED do IoConnectInterruptEx para registrar uma única rotina InterruptMessageService para todas as mensagens. Para obter mais informações, consulte Utilizando a versão CONNECT_MESSAGE_BASED do IoConnectInterruptEx e Utilizando a versão CONNECT_FULLY_SPECIFIED do IoConnectInterruptEx.

  4. Depois que o driver não pretende mais atender interrupções do dispositivo, chame IoDisconnectInterruptEx (depois de desativar 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 verificar se o número esperado de mensagens está alocado. Se o gerenciador Plug and Play (PnP) não puder alocar o número solicitado de mensagens, ele alocará exatamente uma mensagem para o dispositivo. Os drivers podem verificar o número de mensagens que são realmente alocadas de uma das seguintes maneiras:

  • O gestor PnP relata o número de mensagens alocadas na sua lista de descritores de recursos brutos. Para obter mais informações, consulte Usando descritores de recursos de interrupção.

  • Quando IoConnectInterruptEx retorna, ele define Parameters->MessageBased.ConnectContext.InterruptMessageTable->MessageCount para o número de mensagens alocadas.