Dela via


Introduktion till meddelandesignalerade avbrott

Meddelandesignalerade avbrott infördes i PCI 2.2-specifikationen som ett alternativ till linjebaserade avbrott. I stället för att använda en dedikerad pin-kod för att utlösa avbrott utlöser enheter som använder MSI:er ett avbrott genom att skriva ett värde till en viss minnesadress. PCI 3.0 definierar en utökad form av MSI, som kallas MSI-X, som möjliggör större programmerbarhet. En enskild enhet kan ha stöd för både MSI och MSI-X. För en sådan enhet använder operativsystemet automatiskt MSI-X.

Ett avbrottsmeddelande är ett visst värde som en enhet skriver till en viss adress för att utlösa ett avbrott. Till skillnad från radbaserade avbrott har meddelandesignalerade avbrott kantsemantik. Enheten skickar ett meddelande men får ingen maskinvarubekräftelse om att avbrottet togs emot.

För PCI 2.2 består ett meddelande av en adress och ett delvis täckande 16-bitarsvärde. Varje enhet tilldelas en enda adress. Om du vill skicka flera meddelanden kan enheten använda de lägre 4 bitarna av meddelandevärdet för att särskilja meddelanden. För PCI 2.2 kan enheterna därför ha stöd för upp till 16 meddelanden.

För PCI 3.0 består ett meddelande av en adress och ett täckande 32-bitarsvärde. Varje meddelande har en egen unik adress. Till skillnad från för PCI 2.2 ändrar enheten inte värdet. För PCI 3.0 kan en enhet ha stöd för upp till 2 048 olika meddelanden. Enheter som stöder PCI 3.0 MSI-X har en dynamiskt programmerbar maskinvarutabell som innehåller poster för var och en av avbrottskällorna på enheten. Varje post i den här tabellen kan programmeras med ett av de meddelanden som allokeras till en enhet och kan maskeras separat. Drivrutiner kan ändra programmeringen av ett avbrottsmeddelande till en tabellpost och om en post har maskerats. Mer information finns i Konfigurera MSI-X dynamiskt.

Drivrutiner kan registrera en enda InterruptMessageService-rutin som hanterar alla möjliga meddelanden eller enskilda InterruptService-rutiner för varje meddelande.

Drivrutiner kan hantera MSI:er som en enhet skickar på följande sätt:

  1. Under drivrutinsinstallationen aktiverar du MSI:er i registret. Du kan också använda registret för att ange antalet meddelanden som ska allokeras för enheten. För mer information, se Aktivera Message-Signaled-avbrott i registret.

  2. Du kan också öka antalet avbrottsmeddelanden och spara vissa inställningar per meddelande genom att svara på en IRP_MN_FILTER_RESOURCE_REQUIREMENTS begäran. Mer information finns i Använda avbrottsresursbeskrivningar.

  3. I drivrutinens sändningsrutin för IRP_MN_START_DEVICE anropar du IoConnectInterruptEx för att registrera en InterruptService - eller InterruptMessageService-rutin för att hantera enhetens avbrott. Använd den CONNECT_FULLY_SPECIFIED versionen av IoConnectInterruptEx för att registrera en InterruptService-rutin för ett visst meddelande eller den CONNECT_MESSAGE_BASED versionen av IoConnectInterruptEx för att registrera en enda InterruptMessageService-rutin för alla meddelanden. För mer information, se Använda CONNECT_MESSAGE_BASED-versionen av IoConnectInterruptEx och Använda CONNECT_FULLY_SPECIFIED-versionen av IoConnectInterruptEx.

  4. När drivrutinen inte längre avser att hantera avbrott från enheten anropar du IoDisconnectInterruptEx (efter att enhetens avbrott har inaktiverats) för att ta bort alla registrerade avbrottshanteringsrutiner.

Drivrutiner som är utformade för att använda flera meddelanden bör kontrollera att det förväntade antalet meddelanden allokeras. Om PnP-hanteraren (Plug and Play) inte kan allokera det begärda antalet meddelanden allokerar den i stället exakt ett meddelande till enheten. Förare kan kontrollera antalet meddelanden som faktiskt fördelas på något av följande sätt:

  • PnP-hanteraren rapporterar antalet allokerade meddelanden i listan över råa resursbeskrivningar. Mer information finns i Använda avbrottsresursbeskrivningar.

  • När IoConnectInterruptEx återvänder anger den Parameters->MessageBased.ConnectContext.InterruptMessageTable->MessageCount till antalet tilldelade meddelanden.