Partilhar via


Introdução às rotinas SynchCritSection

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 referenciar os mesmos recursos ou dados, e os recursos ou dados não devem ser referenciados por mais de um processador por vez.

As seções críticas devem ser restritas às rotinas ISRs e 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 é retornada, o sistema libera o bloqueio de rotação e reduz 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. Adquirir 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 devem acessar alguns dos mesmos recursos de hardware (como registros de dispositivo ou outra memória relativa ao barramento) ou dados mantidos pelo driver como o ISR do driver. Dependendo do dispositivo ou do design do driver, suas rotinas de expedição, 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 do objeto de interrupção para determinar o DIRQL e o bloqueio de rotação a serem usados com a rotina SynchCritSection . (O driver forneceu esses valores anteriormente, usando os parâmetros SpinLock e SynchronizeIrql da função IoConnectInterrupt.)