Sdílet prostřednictvím


Úvod do přerušení signalizovaných zprávami

Ve specifikaci PCI 2.2 byla zavedena přerušení signalizovaná zprávou (MSI) jako alternativa k řádkovým přerušením. Místo použití vyhrazeného špendlíku k aktivaci přerušení zařízení, která používají rozhraní MSI, aktivují přerušení zápisem hodnoty na konkrétní adresu paměti. PCI 3.0 definuje rozšířenou formu MSI s názvem MSI-X, která umožňuje větší programovatelnost. Jedno zařízení může podporovat MSI i MSI-X. Pro takové zařízení operační systém automaticky použije MSI-X.

Zpráva o přerušení je konkrétní hodnota, kterou zařízení zapisuje na konkrétní adresu, aby aktivovalo přerušení. Na rozdíl od přerušení založených na řádcích mají přerušení signalizovaná zprávou hraniční sémantiku. Zařízení odešle zprávu, ale neobdrží žádné potvrzení příjmu na hardwarové úrovni, že přerušení bylo přijato.

V případě PCI 2.2 se zpráva skládá z adresy a částečně neprůžné 16bitové hodnoty. Každému zařízení je přiřazena jedna adresa. Pokud chcete odeslat více zpráv, zařízení může k rozlišení zpráv použít nižší 4 bity hodnoty zprávy. Proto pro PCI 2.2 můžou zařízení podporovat až 16 zpráv.

V případě PCI 3.0 se zpráva skládá z adresy a neprůžné 32bitové hodnoty. Každá jiná zpráva má svou vlastní jedinečnou adresu. Na rozdíl od PCI 2.2 zařízení hodnotu nezmění. Pro PCI 3.0 může zařízení podporovat až 2 048 různých zpráv. Zařízení podporující PCI 3.0 MSI-X obsahují dynamicky programovatelnou hardwarovou tabulku, která obsahuje položky pro každý zdroj přerušení v zařízení. Každá položka v této tabulce může být naprogramována jednou ze zpráv přidělených zařízení a může být nezávisle maskována. Ovladače mohou změnit naprogramování zprávy přerušení na položku tabulky a zjistit, zda je položka maskována. Další informace najdete v tématu Dynamická konfigurace MSI-X.

Ovladače mohou zaregistrovat jednu rutinu InterruptMessageService , která zpracovává všechny možné zprávy nebo jednotlivé rutiny InterruptService pro každou zprávu.

Ovladače můžou zpracovávat rozhraní MSI, které zařízení odesílá takto:

  1. Během instalace ovladače povolte v registru instalační balíčky MSI. Registr můžete také použít k určení počtu zpráv, které se mají zařízení přidělit. Další informace naleznete v tématu Povolení Message-Signaled Přerušení v registru.

  2. Volitelně můžete zvýšit počet zpráv přerušení a uložit některá nastavení jednotlivých zpráv tím, že odpovíte na IRP_MN_FILTER_RESOURCE_REQUIREMENTS žádost. Další informace najdete v tématu Použití popisovačů zdrojů přerušení.

  3. V rutině odesílání ovladače pro IRP_MN_START_DEVICE zavolejte IoConnectInterruptEx , aby se registrovala rutina InterruptService nebo InterruptMessageService pro obsluhu přerušení zařízení. Pomocí CONNECT_FULLY_SPECIFIED verze IoConnectInterruptEx zaregistrujte rutinu InterruptService pro konkrétní zprávu nebo CONNECT_MESSAGE_BASED verzi IoConnectInterruptEx k registraci jedné rutiny InterruptMessageService pro všechny zprávy. Další informace naleznete v tématu Použití CONNECT_MESSAGE_BASED verze IoConnectInterruptEx a použití CONNECT_FULLY_SPECIFIED verze IoConnectInterruptEx.

  4. Jakmile ovladač přestane obsluhovat přerušení ze zařízení, zavolejte IoDisconnectInterruptEx (po zakázání přerušení zařízení) a odeberte všechny registrované obslužné rutiny přerušení.

Ovladače navržené tak, aby používaly více zpráv, by měly zkontrolovat, jestli je přidělen očekávaný počet zpráv. Pokud správce plug and play (PnP) nemůže přidělit požadovaný počet zpráv, místo toho přidělí zařízení přesně jednu zprávu. Ovladače můžou zkontrolovat počet zpráv, které jsou skutečně přiděleny jedním z následujících způsobů:

  • Správce PnP hlásí počet přidělených zpráv v seznamu surových popisovačů prostředků. Další informace najdete v tématu Použití popisovačů zdrojů přerušení.

  • Když IoConnectInterruptEx vrátí, nastaví Parameters->-MessageBased.ConnectContext.InterruptMessageTable->MessageCount na počet přidělených zpráv.