Compartir a través de


Introducción a las rutinas synchCritSection

Las secciones críticas son secciones de código que requieren acceso exclusivo a los recursos de hardware o a los datos del controlador. Es decir, el código no debe interrumpirse por otro código que pueda hacer referencia a los mismos recursos o datos, y los recursos o datos no deben ser a los que hace referencia más de un procesador a la vez.

Las secciones críticas deben limitarse a las rutinas ISR y SynchCritSection . El sistema llama a estas rutinas solo después de elevar el IRQL del procesador actual al valor DIRQL del dispositivo y adquirir un bloqueo de número. Después de que se devuelva una rutina SynchCritSection , el sistema libera el bloqueo de número y reduce el IRQL del procesador.

Elevar el IRQL del procesador al valor DIRQL del dispositivo impide que se interrumpa el procesador actual, excepto por un dispositivo de prioridad más alta. La adquisición de un bloqueo de número impide que otros procesadores ejecuten cualquier código de sección crítico asociado a ese bloqueo de número. (Este bloqueo de giro a veces se denomina bloqueo de giro de interrupción).

Las rutinas StartIo y DpcForIsr o CustomDpc del controlador de dispositivo suelen tener acceso a algunos de los mismos recursos de hardware (como los registros de dispositivos u otra memoria relativa al bus) o los datos mantenidos por el controlador que el ISR del controlador. Según el dispositivo o el diseño del controlador, sus rutinas de envío, AdapterControl, ControllerControl o temporizador también pueden acceder a los recursos de hardware o a los datos mantenidos por el controlador.

Para llamar a cualquier sección crítica que no sea ISR, un controlador debe usar la rutina KeSynchronizeExecution . Esta rutina acepta la dirección de una rutina SynchCritSection como entrada, junto con la información de contexto definida por el controlador y un puntero de objeto de interrupción. El sistema usa el puntero de objeto de interrupción para determinar el DIRQL y el bloqueo de número para usarlos con la rutina SynchCritSection . (El controlador proporcionó previamente estos valores mediante los parámetros SpinLock y SynchronizeIrql de la función IoConnectInterrupt).