Affinità di interruzione

L'affinità di un interruzione è il set di processori che possono eseguire l'interruzione. Ogni dispositivo ha un criterio di affinità. Il sistema operativo usa i criteri di affinità per calcolare l'affinità per gli interruzioni del dispositivo. I criteri di affinità possono essere specificati nel file INF del dispositivo o nelle impostazioni del Registro di sistema.

A partire da Windows Vista, gli amministratori possono usare il Registro di sistema per impostare un criterio di affinità per un interruzione.

Gli amministratori possono impostare le voci seguenti nella chiave del Registro di sistema \Interrupt Management\Affinity Policy :

  • DevicePolicy è un valore REG_DWORD che specifica un criterio di affinità. Per i valori possibili e i relativi significati, vedere IRQ_DEVICE_POLICY. Microsoft consiglia di usare i criteri predefiniti, se applicabile.

  • AssignmentSetOverride può essere un valore REG_BINARY, REG_DWORD o REG_QWORD che specifica una maschera KAFFINITY . Per REG_BINARY, le dimensioni devono essere inferiori o uguali alle dimensioni KAFFINITY per la piattaforma e l'ordine di byte di input è poco endian. Se DevicePolicy è 0x04 (IrqPolicySpecifiedProcessors), questa maschera specifica un set di processori a cui assegnare gli interruzioni del dispositivo.

Il file INF di un driver può fornire impostazioni predefinite per i valori del Registro di sistema. Ecco un esempio di come impostare il valore DevicePolicy su IrqPolicyOneCloseProcessor nel file INF. Per altre informazioni, vedere Direttiva INF AddReg.

[install-section-name.HW]
AddReg=add-registry-section 

[add-registry-section]
HKR, "Interrupt Management\Affinity Policy", DevicePolicy, 0x00010001, 2

Il sistema rende disponibili le impostazioni del Registro di sistema per il driver del dispositivo quando invia il IRP_MN_FILTER_RESOURCE_REQUIREMENTS IRP al driver. Il sistema operativo fornisce una struttura IO_RESOURCE_DESCRIPTOR per ogni interruzione con il membro Type impostato su CmResourceTypeInterrupt. Per un interruzione segnalato dal messaggio, viene impostato il CM_RESOURCE_INTERRUPT_MESSAGE bit del membro Flags ; in caso contrario, è chiaro. Il membro u.Interrupt descrive le impostazioni per l'interruzione.

La tabella seguente fornisce la corrispondenza tra le impostazioni del Registro di sistema e i membri di u.Interrupt.

Valore del Registro di sistema Membro di you.Interrupt

DevicePolicy

AffinityPolicy

AssignmentSetOverride

TargetProcessor

Informazioni su KAFFINITY

Il tipo KAFFINITY è una maschera di affinità che rappresenta un set di processori logici in un gruppo.

typedef ULONG_PTR  KAFFINITY;

Il tipo KAFFINITY è a 32 bit in una versione a 32 bit di Windows ed è a 64 bit in una versione a 64 bit di Windows.

Se un gruppo contiene n processori logici, i processori vengono numerati da 0 a n-1. Il numero del processore i nel gruppo è rappresentato da bit i nella maschera di affinità, dove i si trova nell'intervallo da 0 a n-1. I bit di maschera di affinità che non corrispondono ai processori logici sono sempre zero.

Ad esempio, se un valore KAFFINITY identifica i processori attivi in un gruppo, il bit maschera per un processore è uno se il processore è attivo ed è zero se il processore non è attivo.

Il numero di bit nella maschera di affinità determina il numero massimo di processori logici in un gruppo. Per una versione a 64 bit di Windows, il numero massimo di processori per gruppo è 64. Per una versione a 32 bit di Windows, il numero massimo di processori per gruppo è 32. Chiamare la routine KeQueryMaximumProcessorCountEx per ottenere il numero massimo di processori per gruppo. Questo numero dipende dalla configurazione hardware del sistema multiprocessore, ma non può mai superare i limiti fissi di processore 64 e 32 processori impostati rispettivamente dalle versioni a 64 bit e a 32 bit di Windows.

La struttura GROUP_AFFINITY contiene una maschera di affinità e un numero di gruppo. Il numero di gruppo identifica il gruppo a cui si applica la maschera di affinità.

Le routine del kernel che usano il tipo KAFFINITY includono IoConnectInterrupt, KeQueryActiveProcessorCount e KeQueryActiveProcessors.