Interrupt-Affinität
Die Affinität eines Interrupts ist der Satz von Prozessoren, die den Interrupt verarbeiten können. Jedes Gerät verfügt über eine Affinitätsrichtlinie. Das Betriebssystem verwendet die Affinitätsrichtlinie, um die Affinität für die Unterbrechungen dieses Geräts zu berechnen. Die Affinitätsrichtlinie kann in den INF-Datei- oder Registrierungseinstellungen des Geräts angegeben werden. Administratoren können die Registrierung verwenden, um eine Affinitätsrichtlinie für einen Interrupt festzulegen.
Administratoren können die folgenden Einträge unter dem Registrierungsschlüssel \Interrupt Management\Affinity Policy festlegen:
DevicePolicy ist ein REG_DWORD Wert, der eine Affinitätsrichtlinie angibt. Mögliche Werte und ihre Bedeutungen finden Sie unter IRQ_DEVICE_POLICY. Microsoft empfiehlt, ggf. die Standardrichtlinie zu verwenden.
AssignmentSetOverride kann ein REG_BINARY-, REG_DWORD- oder REG_QWORD-Wert sein, der ein KAFFINITY-Mask angibt. Bei REG_BINARY muss die Größe kleiner oder gleich der KAFFINITY-Größe für die Plattform sein, und die Eingabebytereihenfolge ist wenig Endianisch. Wenn DevicePolicy 0x04 (IrqPolicySpecifiedProcessors) ist, gibt diese Maske eine Reihe von Prozessoren an, der die Unterbrechungen des Geräts zugewiesen werden sollen.
Die INF-Datei eines Treibers kann Standardeinstellungen für die Registrierungswerte bereitstellen. Hier ist ein Beispiel für das Festlegen des DevicePolicy-Werts auf IrqPolicyOneCloseProcessor in der INF-Datei. Weitere Informationen finden Sie unter INF AddReg Direktive.
[install-section-name.HW]
AddReg=add-registry-section
[add-registry-section]
HKR, "Interrupt Management\Affinity Policy", DevicePolicy, 0x00010001, 2
Das System stellt die Registrierungseinstellungen dem Treiber des Geräts zur Verfügung, wenn er das IRP_MN_FILTER_RESOURCE_REQUIREMENTS IRP an den Treiber sendet. Das Betriebssystem stellt eine IO_RESOURCE_DESCRIPTOR Struktur für jeden Interrupt bereit, wobei das Type-Element auf CmResourceTypeInterrupt festgelegt ist. Bei einem Nachrichtensignalunterbruch wird das CM_RESOURCE_INTERRUPT_MESSAGE Bit des Flags-Elements festgelegt. Andernfalls ist es klar. Der U.Interrupt-Member beschreibt die Einstellungen für den Interrupt.
Die folgende Tabelle enthält die Korrespondenz zwischen Registrierungseinstellungen und Mitgliedern von u.Interrupt.
Registrierungswert | Mitglied von you.Interrupt |
---|---|
DevicePolicy | AffinityPolicy |
AssignmentSetOverride | TargetedProcessors |
Über KAFFINITY
Der KAFFINITY-Typ ist eine Affinitätsmaske, die eine Reihe logischer Prozessoren in einer Gruppe darstellt.
typedef ULONG_PTR KAFFINITY;
Der KAFFINITY-Typ ist 32 Bit auf einer 32-Bit-Version von Windows und ist 64 Bit auf einer 64-Bit-Version von Windows.
Wenn eine Gruppe n logische Prozessoren enthält, werden die Prozessoren von 0 bis n-1 nummeriert. Die Prozessornummer i in der Gruppe wird durch Bit i in der Affinitätsmaske dargestellt, wobei ich im Bereich 0 bis n-1 liegt. Affinitätsmaskenbits, die nicht logischen Prozessoren entsprechen, sind immer Null.
Wenn beispielsweise ein KAFFINITY-Wert die aktiven Prozessoren in einer Gruppe identifiziert, ist das Maskenbit für einen Prozessor eins, wenn der Prozessor aktiv ist und null ist, wenn der Prozessor nicht aktiv ist.
Die Anzahl der Bits in der Affinitätsmaske bestimmt die maximale Anzahl logischer Prozessoren in einer Gruppe. Bei einer 64-Bit-Version von Windows beträgt die maximale Anzahl von Prozessoren pro Gruppe 64. Bei einer 32-Bit-Version von Windows beträgt die maximale Anzahl von Prozessoren pro Gruppe 32. Rufen Sie die KeQueryMaximumProcessorCountEx-Routine auf, um die maximale Anzahl von Prozessoren pro Gruppe abzurufen. Diese Zahl hängt von der Hardwarekonfiguration des Multiprozessorsystems ab, kann jedoch niemals die festgelegten Grenzwerte für 64-Prozessor und 32-Prozessor überschreiten, die von den 64-Bit- bzw. 32-Bit-Versionen von Windows festgelegt werden.
Die GROUP_AFFINITY-Struktur enthält ein Affinitätsformat und eine Gruppennummer. Die Gruppennummer gibt die Gruppe an, auf die die Affinitätsmaske angewendet wird.
Kernelroutinen, die den KAFFINITY-Typ verwenden, umfassen IoConnectInterrupt, KeQueryActiveProcessorCount und KeQueryActiveProcessors.