Afinidade de interrupção
A afinidade de uma interrupção é o conjunto de processadores que podem atender à interrupção. Cada dispositivo tem uma política de afinidade. O sistema operacional usa a política de afinidade para calcular a afinidade com as interrupções desse dispositivo. A política de afinidade pode ser especificada no arquivo INF do dispositivo ou nas configurações do Registro. Os administradores podem usar o Registro para definir uma política de afinidade para uma interrupção.
Os administradores podem definir as seguintes entradas na chave do Registro \Gerenciamento de Interrupção\Política de Afinidade:
DevicePolicy é um valor REG_DWORD que especifica uma política de afinidade. Para valores possíveis e seus significados, consulte IRQ_DEVICE_POLICY. A Microsoft recomenda usar a política padrão, se aplicável.
AssignmentSetOverride pode ser um valor de REG_BINARY, REG_DWORD ou REG_QWORD que especifica uma máscara KAFFINITY . Por REG_BINARY, o tamanho deve ser menor ou igual ao tamanho KAFFINITY para a plataforma e a ordem dos bytes de entrada é little endian. Se DevicePolicy for 0x04 (IrqPolicySpecifiedProcessors), essa máscara especificará um conjunto de processadores aos quais atribuir as interrupções do dispositivo.
O arquivo INF de um driver pode fornecer configurações padrão para os valores do Registro. Aqui está um exemplo de como definir o valor DevicePolicy como IrqPolicyOneCloseProcessor no arquivo INF. Para mais informações, consulte Diretiva de AddReg do INF.
[install-section-name.HW]
AddReg=add-registry-section
[add-registry-section]
HKR, "Interrupt Management\Affinity Policy", DevicePolicy, 0x00010001, 2
O sistema disponibiliza as configurações do Registro para o driver do dispositivo quando envia o IRP IRP_MN_FILTER_RESOURCE_REQUIREMENTS para o driver. O sistema operacional fornece uma estrutura IO_RESOURCE_DESCRIPTOR para cada interrupção com o membro Type definido como CmResourceTypeInterrupt. Para uma interrupção sinalizada por mensagem, o bit CM_RESOURCE_INTERRUPT_MESSAGE do membro Flags é definido; caso contrário, é claro. O membro u.Interrupt descreve as configurações para a interrupção.
A tabela a seguir fornece a correspondência entre as configurações do Registro e os membros do u.Interrupt.
Valor do Registro | Membro de você.Interrupt |
---|---|
Política de Dispositivo | Política de afinidade |
AssignmentSetOverride | Processadores direcionados |
Sobre a KAFFINITY
O tipo KAFFINITY é uma máscara de afinidade que representa um conjunto de processadores lógicos em um grupo.
typedef ULONG_PTR KAFFINITY;
O tipo KAFFINITY é de 32 bits em uma versão de 32 bits do Windows e é de 64 bits em uma versão de 64 bits do Windows.
Se um grupo contiver n processadores lógicos, os processadores serão numerados de 0 a n-1. O número do processador i no grupo é representado pelo bit i na máscara de afinidade, onde i está no intervalo de 0 a n-1. Os bits de máscara de afinidade que não correspondem a processadores lógicos são sempre zero.
Por exemplo, se um valor KAFFINITY identificar os processadores ativos em um grupo, o bit de máscara de um processador será um se o processador estiver ativo e será zero se o processador não estiver ativo.
O número de bits na máscara de afinidade determina o número máximo de processadores lógicos em um grupo. Para uma versão de 64 bits do Windows, o número máximo de processadores por grupo é 64. Para uma versão de 32 bits do Windows, o número máximo de processadores por grupo é 32. Chame a rotina KeQueryMaximumProcessorCountEx para obter o número máximo de processadores por grupo. Esse número depende da configuração de hardware do sistema multiprocessador, mas nunca pode exceder os limites fixos de 64 e 32 processadores definidos pelas versões de 64 bits e 32 bits do Windows, respectivamente.
A estrutura GROUP_AFFINITY contém uma máscara de afinidade e um número de grupo. O número do grupo identifica o grupo ao qual a máscara de afinidade se aplica.
As rotinas de kernel que usam o tipo KAFFINITY incluem IoConnectInterrupt, KeQueryActiveProcessorCount e KeQueryActiveProcessors.