Condividi tramite


Uso dei descrittori di risorse interrupt

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 interrupt, che intende assegnare al dispositivo. Il driver può modificare questo elenco per cambiare il numero di messaggi di interruzione, così come alcune impostazioni relative a ciascun 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 interrupt, assegnati al dispositivo del driver.

La richiesta di IRP_MN_FILTER_RESOURCE_REQUIREMENTS fornisce un elenco di strutture IO_RESOURCE_DESCRIPTOR . Se il dispositivo ha una struttura di funzionalità MSI (message-signaled interrupt) come definito nella specifica PCI 2.2, il gestore PnP fornisce un singolo descrittore di messaggi di interrupt. Se il dispositivo ha una struttura di funzionalità MSI-X come definito nella specifica PCI 3.0, il gestore PnP fornisce una struttura per ogni messaggio di interrupt. I descrittori di messaggi di interrupt 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 interrupt modificando i membri u.Interrupt della struttura. Si noti che quando si usa MSI, gli interrupt hanno tutti la stessa affinità, mentre quando si usa MSI-X possono avere affinità diverse. Per altre informazioni, vedere Affinità di interruzione e priorità.

Per MSI, come definito in PCI 2.2, u.Interrupt.MaximumVector - u.Interrupt.MinimumVector + 1 è il numero di messaggi di interrupt allocati per il dispositivo. I driver possono modificare il numero di messaggi di interrupt modificando u.Interrupt.MinimumVector. Per i messaggi di interrupt MSI, u.Interrupt.MaximumVector è sempre CM_RESOURCE_INTERRUPT_MESSAGE_TOKEN. Per allocare messaggi di interrupt MessageCount, impostare u.Interrupt.MinimumVector uguale a 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 interrupt allocati aggiungendo o rimuovendo voci dall'elenco. Si noti che le risorse del messaggio di interrupt 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 interrupt 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 interrupt, 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 interrupt, 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 utilizza MSI (Interrupt a Segnale di Messaggio), il driver riceve solo un descrittore di risorsa interrupt, 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 interrupt.

In Windows 8 il sistema operativo non supporta le richieste di risorse per più di 2048 messaggi di interrupt 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 di dispositivo supera questo limite, l'avvio del dispositivo potrebbe non riuscire. Per consentire a un driver di operare in un computer che contiene molti processori logici, il driver deve evitare di richiedere più interruzioni per processore.

Durante il ribilanciamento delle risorse di interrupt nel sistema, il gestore PnP potrebbe chiedere a un driver di selezionare un set preferito di risorse di interrupt 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 quindi tollerare, senza errori, l'assegnazione di qualsiasi insieme di risorse alternative di interrupt dall'elenco dei requisiti delle risorse. Ad esempio, al dispositivo potrebbe essere assegnato un numero inferiore di interrupt di messaggio rispetto a quanto richiesto dal driver. Nel peggiore dei casi, il driver deve essere pronto a operare il dispositivo con un solo interrupt a linea singola.