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 das interrupções desse dispositivo. A política de afinidade pode ser especificada nas configurações de registro ou arquivo INF do dispositivo.

A partir do Windows Vista, 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 obter 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 REG_BINARY, REG_DWORD ou REG_QWORD que especifica uma máscara KAFFINITY . Para REG_BINARY, o tamanho deve ser menor ou igual ao tamanho da KAFFINITY para a plataforma e a ordem de 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 obter mais informações, consulte Diretiva InF AddReg.

[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 ele 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 está definido; caso contrário, está 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ê.Interrupção

DevicePolicy

AffinityPolicy

AssignmentSetOverride

TargetedProcessors

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, em que i está no intervalo de 0 a n-1. 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 para 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 processadores 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.