Introduzione agli interruzioni di Message-Signaled
Le interruzioni segnalate dai messaggi sono state introdotte nella specifica PCI 2.2 come alternativa agli interruzioni basati su riga. Anziché usare un pin dedicato per attivare gli interruzioni, i dispositivi che usano msi attivano un interruzione scrivendo un valore in un indirizzo di memoria specifico. PCI 3.0 definisce una forma estesa di MSI, denominata MSI-X, che consente una maggiore programmabilità. Windows Vista e versioni successive del supporto MSI e MSI-X. Un singolo dispositivo può supportare sia MSI che MSI-X. Per tale dispositivo, il sistema operativo userà automaticamente MSI-X.
Un messaggio di interruzione è un valore specifico che un dispositivo scrive in un indirizzo specifico per attivare un interruzione. A differenza degli interruzioni basate su riga, gli interruzioni con segnale dei messaggi hanno semantica perimetrale. Il dispositivo invia un messaggio ma non riceve alcun riconoscimento hardware che l'interruzione è stata ricevuta.
Per PCI 2.2, un messaggio è costituito da un indirizzo e da un valore parzialmente opaco a 16 bit. Ogni dispositivo viene assegnato un singolo indirizzo. Per inviare più messaggi, il dispositivo può usare i 4 bit inferiori del valore del messaggio per distinguere i messaggi. Pertanto, per PCI 2.2, i dispositivi possono supportare fino a 16 messaggi.
Per PCI 3.0, un messaggio è costituito da un indirizzo e da un valore opaco a 32 bit. Ogni messaggio diverso ha un proprio indirizzo univoco. A differenza di PCI 2.2, il dispositivo non modifica il valore. Per PCI 3.0, un dispositivo può supportare fino a 2.048 messaggi diversi. I dispositivi che supportano la funzionalità MSI-X di PCI 3.0 sono una tabella hardware programmabile dinamicamente contenente voci per ognuna delle origini di interruzione nel dispositivo. Ogni voce di questa tabella può essere programmata con uno dei messaggi allocati a un dispositivo e può essere mascherato in modo indipendente. I driver possono modificare la programmazione di un messaggio di interruzione in una voce di tabella e se è stata mascherata una voce. Per altre informazioni, vedere Configurazione dinamica di MSI-X.
I driver possono registrare una singola routine InterruptMessageService che gestisce tutti i messaggi possibili o singole routine di InterruptService per ogni messaggio.
I driver possono gestire msi inviati da un dispositivo come indicato di seguito:
Durante l'installazione del driver, abilitare msi nel Registro di sistema. È anche possibile usare il Registro di sistema per specificare il numero di messaggi da allocare per il dispositivo. Per altre informazioni, vedere Abilitazione di interruzioni Message-Signaled nel Registro di sistema.
Facoltativamente, aumentare il numero di messaggi di interruzione e salvare alcune impostazioni per messaggio rispondendo a una richiesta di IRP_MN_FILTER_RESOURCE_REQUIREMENTS . Per altre informazioni, vedere Uso dei descrittori di risorse di interruzione.
Nella routine di invio del driver per IRP_MN_START_DEVICE chiamare IoConnectInterruptEx per registrare una routine InterruptService o InterruptMessageService per il servizio degli interruzioni del dispositivo. Usare la versione CONNECT_FULLY_SPECIFIED di IoConnectInterruptEx per registrare una routine InterruptService per un messaggio specifico o la versione CONNECT_MESSAGE_BASED di IoConnectInterruptEx per registrare una singola routine InterruptMessageService per tutti i messaggi. Per altre informazioni, vedere Uso della versione CONNECT_MESSAGE_BASED di IoConnectInterruptEx e Uso della versione CONNECT_FULLY_SPECIFIED di IoConnectInterruptEx.
Dopo che il driver non intende più interrompere il servizio dal dispositivo, chiamare IoDisconnectInterruptEx (dopo aver disabilitato gli interruzioni del dispositivo) per rimuovere le routine del servizio di interruzione registrate.
I driver progettati per l'uso di più messaggi devono verificare che il numero previsto di messaggi sia allocato. Se il gestore Plug and Play (PnP) non può allocare il numero richiesto di messaggi, alloca invece esattamente un messaggio al dispositivo. I driver possono controllare il numero di messaggi effettivamente allocati in uno dei modi seguenti:
Il gestore PnP segnala il numero di messaggi allocati nell'elenco dei descrittori di risorse non elaborati. Per altre informazioni, vedere Uso dei descrittori di risorse di interruzione.
Quando IoConnectInterruptEx restituisce, imposta Parametri-MessageBased.ConnectContext.InterruptMessageTable-MessageCount>> per il numero di messaggi allocati.