Partilhar via


Usando Descritores de Recursos de Interrupção

O gerenciador Plug and Play (PnP) atribui mensagens de interrupção a um dispositivo usando duas passagens. Primeiro, o gerenciador PnP envia uma solicitação de IRP_MN_FILTER_RESOURCE_REQUIREMENTS para o driver com uma lista de recursos de hardware, incluindo mensagens de interrupção, que ele pretende atribuir ao dispositivo. O driver pode modificar essa lista para alterar o número de mensagens de interrupção, bem como algumas configurações por mensagem. Em seguida, depois que o gerente PnP realmente atribui os recursos, ele envia uma solicitação de IRP_MN_START_DEVICE e fornece uma lista completa dos recursos de hardware, incluindo mensagens de interrupção, atribuídos ao dispositivo do driver.

O pedido do IRP_MN_FILTER_RESOURCE_REQUIREMENTS fornece uma lista de estruturas IO_RESOURCE_DESCRIPTOR. Se o dispositivo tiver uma estrutura de capacidade MSI (interrupção sinalizada por mensagem), conforme definido na especificação PCI 2.2, o gerenciador PnP fornecerá um único descritor de mensagem de interrupção. Se o dispositivo tiver uma estrutura de capacidade MSI-X, conforme definido na especificação PCI 3.0, o gerenciador PnP fornece uma estrutura para cada mensagem de interrupção. Os descritores de mensagens de interrupção têm Type = CmResourceTypeInterrupt e Flags = CM_RESOURCE_INTERRUPT_LATCHED | CM_RESOURCE_INTERRUPT_MESSAGE. Os drivers também podem alterar configurações, como a afinidade de interrupção, alterando os membros u.Interrupt da estrutura. Observe que, ao usar MSI, todas as interrupções têm a mesma afinidade, enquanto ao usar MSI-X elas podem ter afinidades diferentes. Para obter mais informações, consulte Afinidade e prioridade de interrupção.

Para MSI, conforme definido no PCI 2.2, u.Interrupt.MaximumVector - u.Interrupt.MinimumVector + 1 é o número de mensagens de interrupção alocadas para o dispositivo. Os drivers podem alterar o número de mensagens de interrupção modificando u.Interrupt.MinimumVector. Para mensagens de interrupção MSI, u.Interrupt.MaximumVector é sempre CM_RESOURCE_INTERRUPT_MESSAGE_TOKEN. Para alocar mensagens de interrupção MessageCount , defina u.Interrupt.MinimumVector como igual a CM_RESOURCE_INTERRUPT_MESSAGE_TOKEN - MessageCount + 1.

Para MSI-X, conforme definido no PCI 3.0, os drivers podem alterar o número de mensagens de interrupção alocadas adicionando ou removendo entradas da lista. Observe que os recursos de mensagem de interrupção adicionados dessa forma não devem ser removidos posteriormente em resposta à solicitação de IRP_MN_START_DEVICE . Para MSI-X, o gerenciador PnP fornece um descritor por interrupção de mensagem, e os membros u.Interrupt.MinimumVector e u.Interrupt.MaximumVector desse descritor são definidos como CM_RESOURCE_INTERRUPT_MESSAGE_TOKEN.

Uma vez que o gerente Plug and Play atribuiu todos os recursos de hardware para o dispositivo, incluindo mensagens de interrupção, ele envia a solicitação IRP_MN_START_DEVICE para o driver. Esta solicitação fornece duas listas de estruturas CM_PARTIAL_RESOURCE_DESCRIPTOR , uma para recursos brutos e traduzidos. Para mensagens de interrupção, o gerenciador PnP fornece uma estrutura para cada endereço de memória alocado com Type = CmResourceTypeInterrupt e Flags = CM_RESOURCE_INTERRUPT_LATCHED | CM_RESOURCE_INTERRUPT_MESSAGE.

Observe que, ao usar o MSI, o driver recebe apenas um descritor de recurso de interrupção, já que todas as mensagens compartilham o mesmo endereço. O membro MessageCount de u.MessageInterrupt.Raw pode ser usado para determinar o número de mensagens atribuídas. Ao usar o MSI-X, o driver recebe um descritor de recurso separado para cada mensagem de interrupção.

No Windows 8, o sistema operacional não oferece suporte a solicitações de recursos para mais de 2048 mensagens de interrupção por função de dispositivo. No Windows 7 e Windows Vista, o sistema operacional não oferece suporte a solicitações de recursos para mais de 910 mensagens de interrupção por função de dispositivo. Se o driver de dispositivo exceder esse limite, o dispositivo pode falhar ao iniciar. Para permitir que um driver opere em um computador que contém muitos processadores lógicos, o driver deve evitar solicitar mais de uma interrupção por processador.

Durante o rebalanceamento do sistema de recursos de interrupção, o gerente PnP pode pedir a um driver para selecionar um conjunto preferencial de recursos de interrupção alternativos de uma lista de requisitos de recursos. No entanto, o gerenciador PnP nem sempre pode atribuir a um driver os recursos que o driver prefere. O driver deve, portanto, tolerar, sem falhas, a atribuição de qualquer conjunto de recursos de interrupção alternativos da lista de requisitos de recursos. Por exemplo, o dispositivo pode receber um número menor de interrupções de mensagem do que o driver solicitou. Na pior das hipóteses, o condutor deve estar preparado para operar o dispositivo com apenas uma interrupção em linha.