Uso dei descrittori di risorse di interruzione
Il gestore Plug and Play (PnP) assegna messaggi di interruzione a un dispositivo usando due passaggi. Prima di tutto, il gestore PnP invia una richiesta di IRP_MN_FILTER_RESOURCE_REQUIREMENTS al driver con un elenco di risorse hardware, inclusi i messaggi di interruzione, che intende assegnare al dispositivo. Il driver può modificare questo elenco per modificare il numero di messaggi di interruzione, nonché alcune impostazioni per messaggio. Quindi, dopo che il gestore PnP assegna effettivamente le risorse, invia una richiesta di IRP_MN_START_DEVICE e fornisce un elenco completo delle risorse hardware, inclusi i messaggi di interruzione, assegnati al dispositivo del driver.
La richiesta IRP_MN_FILTER_RESOURCE_REQUIREMENTS fornisce un elenco di strutture IO_RESOURCE_DESCRIPTOR . Se il dispositivo ha una struttura di funzionalità msi (interruzione con segnale di messaggio), come definito nella specifica PCI 2.2, la gestione PnP fornisce un singolo descrittore del messaggio di interruzione. Se il dispositivo ha una struttura di funzionalità MSI-X definita nella specifica PCI 3.0, il gestore PnP fornisce una struttura per ogni messaggio di interruzione. I descrittori dei messaggi di interruzione hanno Type = CmResourceTypeInterrupt e Flags = CM_RESOURCE_INTERRUPT_LATCHED | CM_RESOURCE_INTERRUPT_MESSAGE. I driver possono anche modificare le impostazioni, ad esempio l'affinità di interruzione modificando i membri u.Interrupt della struttura. Si noti che quando si usa MSI, interrompe tutte le stesse affinità, mentre quando si usa MSI-X possono avere affinità diverse. Per altre informazioni, vedere Interruzione di affinità e priorità.
Per MSI, come definito in PCI 2.2,u.Interrupt.MaximumVector u.Interrupt.MinimumVector - + 1 è il numero di messaggi di interruzione allocati per il dispositivo. I driver possono modificare il numero di messaggi di interruzione modificando u.Interrupt.MinimumVector. Per i messaggi di interruzione MSI, u.Interrupt.MaximumVector è sempre CM_RESOURCE_INTERRUPT_MESSAGE_TOKEN. Per allocare i messaggi di interruzione messageCount , impostare u.Interrupt.MinimumVector su uguale CM_RESOURCE_INTERRUPT_MESSAGE_TOKEN - MessageCount + 1.
Per MSI-X, come definito in PCI 3.0, i driver possono modificare il numero di messaggi di interruzione allocati aggiungendo o rimuovendo voci dall'elenco. Si noti che le risorse del messaggio di interruzione aggiunte in questo modo non devono essere successivamente rimosse in risposta alla richiesta di IRP_MN_START_DEVICE . Per MSI-X, il gestore PnP fornisce un descrittore per ogni interruzione del messaggio e i membri u.Interrupt.MinimumVector e u.Interrupt.MaximumVector di questo descrittore sono entrambi impostati su CM_RESOURCE_INTERRUPT_MESSAGE_TOKEN.
Dopo che il gestore Plug and Play ha assegnato tutte le risorse hardware per il dispositivo, inclusi i messaggi di interruzione, invia la richiesta di IRP_MN_START_DEVICE al driver. Questa richiesta fornisce due elenchi di strutture CM_PARTIAL_RESOURCE_DESCRIPTOR , ognuna per le risorse non elaborate e tradotte. Per i messaggi di interruzione, il gestore PnP fornisce una struttura per ogni indirizzo di memoria allocato con Type = CmResourceTypeInterrupt e Flags = CM_RESOURCE_INTERRUPT_LATCHED | CM_RESOURCE_INTERRUPT_MESSAGE.
Si noti che quando si usa MSI, il driver riceve solo un descrittore di risorsa di interruzione, poiché tutti i messaggi condividono lo stesso indirizzo. Il membro MessageCount di u.MessageInterrupt.Raw può essere usato per determinare il numero di messaggi assegnati. Quando si usa MSI-X, il driver riceve un descrittore di risorse separato per ogni messaggio di interruzione.
In Windows 8 il sistema operativo non supporta le richieste di risorse per più di 2048 messaggi di interruzione per ogni funzione del dispositivo. In Windows 7 e Windows Vista il sistema operativo non supporta le richieste di risorse per più di 910 messaggi di interruzione per ogni funzione del dispositivo. Se il driver del dispositivo supera questo limite, il dispositivo potrebbe non riuscire ad avviare. Per consentire a un driver di funzionare in un computer che contiene molti processori logici, il driver deve evitare di richiedere più interruzioni per processore.
Durante il bilanciamento del sistema delle risorse di interruzione, il gestore PnP potrebbe chiedere a un driver di selezionare un set preferito di risorse di interruzione alternative da un elenco dei requisiti delle risorse. Tuttavia, il gestore PnP non può sempre assegnare a un driver le risorse preferite dal driver. Il driver deve pertanto tollerare, senza errori, l'assegnazione di qualsiasi set di risorse di interruzioni alternative dall'elenco dei requisiti delle risorse. Ad esempio, il dispositivo potrebbe essere assegnato un numero minore di interruzioni del messaggio rispetto al driver richiesto. Nel peggiore dei casi, il driver deve essere preparato per operare il dispositivo con un solo interruzione in base alla riga.