Una llamada a procedimiento diferido (DPC) es un mecanismo de manejo de interrupciones en el sistema operativo Microsoft Windows al que los conductores pueden hacer referencia cuando ejecutan ciertos procesos. DPC permite que una tarea se active, pero no se ejecute, desde un nivel de solicitud de interrupción altamente priorizado (IRQL). Esto permite que un controlador procese una rutina de servicio de interrupción de alto nivel (ISR) rápidamente, a la vez que aplaza la ejecución de códigos IRQL de nivel inferior. Los controladores utilizan DPC para programar operaciones de entrada / salida (E / S). Los controladores son software utilizados por Windows para comunicarse con dispositivos de hardware.
Transferencias
Un controlador de dispositivo en modo kernel maneja convencionalmente la transferencia de un flujo de datos de audio o video desde o hacia un dispositivo externo. El procesamiento de datos de los controladores de dispositivo es controlado por interrupciones. El hardware externo genera rutinariamente interrupciones para solicitar al controlador del dispositivo que transfiera el siguiente lote de datos. Un controlador de dispositivo no puede procesar datos instantáneamente en su rutina de interrupción; por lo tanto, el sistema operativo debe activar una rutina de devolución de llamada, que es el DPC. El modo de núcleo, o el modo de sistema, y el modo de usuario son los modos de operación de su unidad central de procesamiento. El kernel controla todas las actividades de procesamiento del sistema.
Programación
El concepto de una llamada a procedimiento diferido existe solo en modo kernel. El sistema operativo mantiene los DPC programados por los controladores del dispositivo en una cola. Si su sistema necesita procesar interrupciones, el kernel comprueba la cola DPC y ejecuta el primer DPC si no hay interrupciones y no se están ejecutando procesos DPC. El DPC es el subproceso con mayor prioridad en el sistema, ya que el procesamiento de la cola del DPC se produce antes de que el despachador elija un subproceso y lo asigne a la CPU. Los DPC tienen tres niveles de prioridad: bajo, medio y alto.
Procesos
Cada DPC está vinculado con un objeto DPC definido por el sistema. Cuando un controlador registra una rutina DPCForslr, el sistema inicializa el objeto DPC previamente definido. Si se requiere más de un DPC, un controlador crea objetos DPC adicionales conocidos como rutinas CustomDPC. La rutina DPCForlsr maneja varios procesos; completa la operación de E / S descrita por los paquetes de solicitud de entrada / salida (IRP), define el siguiente IRP, establece el estado de entrada / salida en el IRP recibido y el proceso para completar la solicitud.
Rutinas
Normalmente, un controlador de dispositivo que tiene una rutina de servicio de interrupción tiene al menos una rutina DPCForIsr o CustomDPC para completar el procesamiento de las operaciones de E / S controladas por interrupciones. Según Open Systems Resources, Inc., la razón fundamental por la que un controlador tiene una única rutina DPCForlsr, un conjunto de rutinas CustomDPC o ambas depende de la naturaleza de su dispositivo subyacente y del conjunto de solicitudes de E / S que debe admitir. El ISR de un controlador debe llamar a IoRequestDPC para operaciones de E / S controladas por interrupciones utilizando rutinas DPCForlsr. A la inversa, para las operaciones superpuestas, las operaciones de E / S controladas por interrupciones que utilizan rutinas CustomDPC, ISR debe llamar a KeInsertQueueDPC.