Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
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 referenciados por más de un procesador a la vez.
Las secciones críticas se deben limitar a las ISR y a las rutinas 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 por subproceso. Después de que vuelva una rutina SynchCritSection, el sistema libera el bloqueo por subproceso y reduce el IRQL del procesador.
Elevar el IRQL del procesador al valor DIRQL del dispositivo impide que el procesador actual se interrumpa, excepto por un dispositivo de prioridad superior. La adquisición de un bloqueo de espera activa impide que otros procesadores ejecuten cualquier código de sección crítica asociado a ese bloqueo de espera activa. (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 registros de dispositivos u otra memoria relativa al bus) o datos mantenidos por el controlador que el ISR del controlador. Dependiendo del dispositivo o diseño del controlador, sus rutinas de distribución, AdapterControl, ControllerControl o temporizador también pueden acceder a recursos de hardware o datos mantenidos por controladores.
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 utiliza el puntero de objeto de interrupción para determinar el DIRQL y el bloqueo por subproceso que se van a usar con la rutina SynchCritSection. (El controlador proporcionó anteriormente estos valores mediante los parámetros SpinLock y SynchronizeIrql de la función IoConnectInterrupt).