Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
As seções críticas são seções de código que exigem acesso exclusivo a recursos de hardware ou dados de driver. Ou seja, o código não deve ser interrompido por outro código que possa fazer referência aos mesmos recursos ou dados, e os recursos ou dados não devem ser referenciados por mais de um processador de cada vez.
As seções críticas devem ser confinadas às ISRs e às rotinas de SynchCritSection. O sistema chama essas rotinas somente depois de elevar o IRQL do processador atual para o valor DIRQL do dispositivo e adquirir um bloqueio de rotação. Depois que uma rotina SynchCritSection retorna, o sistema libera o bloqueio de rotação e baixa o IRQL do processador.
Elevar o IRQL do processador para o valor DIRQL do dispositivo impede que o processador atual seja interrompido, exceto por um dispositivo de prioridade mais alta. A aquisição de um bloqueio de rotação impede que outros processadores executem qualquer código de seção crítico associado a esse bloqueio de rotação. (Esse bloqueio de rotação às vezes é chamado de bloqueio de rotação de interrupção.)
As rotinas StartIo e DpcForIsr, ou CustomDpc, de um driver de dispositivo frequentemente precisam aceder a alguns dos mesmos recursos de hardware (como registradores de dispositivo ou outra memória relativa ao barramento) ou a dados mantidos pelo driver que o ISR também utiliza. Dependendo do dispositivo ou design do driver, suas rotinas de despacho, AdapterControl, ControllerControl ou temporizador também podem acessar recursos de hardware ou dados mantidos pelo driver.
Para chamar qualquer seção crítica não-ISR, um driver deve usar a rotina KeSynchronizeExecution . Essa rotina aceita o endereço de uma rotina SynchCritSection como entrada, juntamente com informações de contexto definidas pelo driver e um ponteiro de objeto de interrupção. O sistema usa o ponteiro de objeto de interrupção para determinar o DIRQL e o bloqueio de rotação a serem usados com a rotina SynchCritSection . (O driver forneceu anteriormente esses valores, usando os parâmetros SpinLock e SynchronizeIrql da função IoConnectInterrupt.)