Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Przerwania sygnalizowane komunikatami (MSI) zostały wprowadzone w specyfikacji PCI 2.2 jako alternatywy dla przerwań opartych na wierszach. Zamiast używać dedykowanego pinu do wyzwalania przerwań, urządzenia korzystające z MSI wyzwalają przerwanie, zapisując wartość na określony adres pamięci. PCI 3.0 definiuje rozszerzoną formę msi o nazwie MSI-X, która zapewnia większą możliwość programowania. Jedno urządzenie może obsługiwać zarówno MSI, jak i MSI-X. W przypadku takiego urządzenia system operacyjny będzie automatycznie używać pliku MSI-X.
Komunikat o przerwaniu jest określoną wartością, którą urządzenie zapisuje na określonym adresie w celu wywołania przerwania. W przeciwieństwie do przerwań opartych na liniach, przerwania sygnalizowane komunikatami mają semantykę krawędzi. Urządzenie wysyła komunikat, ale nie otrzymuje żadnego potwierdzenia sprzętowego, że przerwanie zostało odebrane.
W przypadku standardu PCI 2.2 komunikat składa się z adresu i częściowo nieprzezroczystej wartości 16-bitowej. Każde urządzenie ma przypisany jeden adres. Aby wysłać wiele komunikatów, urządzenie może użyć niższych 4 bitów wartości komunikatu w celu odróżnienia komunikatów. W związku z tym w przypadku standardu PCI 2.2 urządzenia mogą obsługiwać maksymalnie 16 komunikatów.
W przypadku standardu PCI 3.0 komunikat składa się z adresu i nieprzezroczystej wartości 32-bitowej. Każdy inny komunikat ma swój własny unikatowy adres. W przeciwieństwie do standardu PCI 2.2 urządzenie nie modyfikuje wartości. W przypadku standardu PCI 3.0 urządzenie może obsługiwać maksymalnie 2048 różnych komunikatów. Urządzenia obsługujące standard PCI 3.0 MSI-X oferują dynamicznie programowalną tabelę sprzętową zawierającą wpisy dla każdego źródła przerwań w urządzeniu. Każdy wpis w tej tabeli może być zaprogramowany przy użyciu jednego z komunikatów przydzielonych do urządzenia i może być niezależnie maskowany. Sterowniki mogą zmieniać sposób, w jaki komunikat przerwania jest zapisywany jako wpis w tabeli, oraz czy wpis został zamaskowany. Aby uzyskać więcej informacji, zobacz Dynamiczne konfigurowanie msi-X.
Sterowniki mogą zarejestrować pojedynczą procedurę InterruptMessageService , która obsługuje wszystkie możliwe komunikaty lub poszczególne procedury PrzerwanieUsługi dla każdego komunikatu.
Sterowniki mogą obsługiwać interfejsy MSI wysyłane przez urządzenie w następujący sposób:
Podczas instalacji sterownika włącz MSI w rejestrze. Możesz również użyć rejestru, aby określić liczbę komunikatów do przydzielenia dla urządzenia. Aby uzyskać więcej informacji, zobacz Włączanie przerwań Message-Signaled w rejestrze.
Opcjonalnie zwiększ liczbę komunikatów przerwań i zapisz ustawienia dotyczące poszczególnych komunikatów, odpowiadając na żądanie IRP_MN_FILTER_RESOURCE_REQUIREMENTS. Aby uzyskać więcej informacji, zobacz Używanie deskryptorów zasobów przerwania.
W procedurze wysyłania sterownika dla IRP_MN_START_DEVICE wywołaj IoConnectInterruptEx, aby zarejestrować procedurę InterruptService lub InterruptMessageService do obsługi przerwań urządzenia. Użyj wersji CONNECT_FULLY_SPECIFIED IoConnectInterruptEx, aby zarejestrować procedurę InterruptService dla określonego komunikatu lub wersji CONNECT_MESSAGE_BASED IoConnectInterruptEx, aby zarejestrować pojedynczą procedurę InterruptMessageService dla wszystkich komunikatów. Aby uzyskać więcej informacji, zobacz Korzystanie z wersji CONNECT_MESSAGE_BASED IoConnectInterruptEx i Korzystanie z wersji CONNECT_FULLY_SPECIFIED IoConnectInterruptEx.
Gdy sterownik nie zamierza już obsługiwać przerwań z urządzenia, wywołaj funkcję IoDisconnectInterruptEx (po wyłączeniu przerwań urządzenia), aby usunąć wszelkie zarejestrowane procedury obsługi przerwań.
Sterowniki przeznaczone do korzystania z wielu komunikatów powinny sprawdzić, czy przydzielona jest oczekiwana liczba komunikatów. Jeśli menedżer Plug and Play (PnP) nie może przydzielić żądanej liczby komunikatów, zamiast tego przydziela dokładnie jeden komunikat do urządzenia. Sterowniki mogą sprawdzić liczbę komunikatów, które są rzeczywiście przydzielone na jeden z następujących sposobów:
Menedżer PnP zgłasza liczbę przydzielonych komunikatów na liście pierwotnych deskryptorów zasobów. Aby uzyskać więcej informacji na temat, zobacz Używanie deskryptorów zasobów przerwania.
Gdy IoConnectInterruptEx zwraca wartość, ustawia Parameters->MessageBased.ConnectContext.InterruptMessageTable->MessageCount na liczbę przydzielonych komunikatów.