Compartir a través de


Configuración y uso de colas interbloqueadas

Los nuevos controladores deben usar el marco de cola irP seguro para cancelar en preferencia a los métodos descritos en esta sección.

Los controladores con subprocesos o controladores dedicados al dispositivo que usan subprocesos de trabajo ejecutivos, como la mayoría de los FSD del sistema, son los tipos más probables de controladores para administrar su propia cola interna en tiempo de ejecución de IRP en una cola interbloqueada. Todos los controladores PnP, incluidos los controladores WDM, también deben poner en cola determinados IRP internamente mientras realizan transiciones de estado de alimentación y PnP.

Normalmente, estos controladores configuran una cola de interbloqueo doblemente vinculada; cada IRP contiene un miembro de tipo LIST_ENTRY, que un controlador puede usar para vincular doblemente los IRP que contiene actualmente. Un controlador no puede volver a poner en cola los IRP para los reintentos si configura una cola interbloqueada vinculada singly.

Un controlador debe configurar su cola interbloqueada en la inicialización del dispositivo. En la ilustración siguiente se muestra una cola de interbloqueo doblemente vinculada, las rutinas de soporte técnico a las que un controlador debe llamar para configurar dicha cola y un conjunto de rutinas ExInterlockedXxx a las que un controlador puede llamar para insertar IRP en la cola y quitar los IRP de la cola.

diagrama que ilustra el uso de una cola interbloqueada.

Como se muestra en esta ilustración, un controlador debe proporcionar el almacenamiento para la propia cola y para lo siguiente para configurar una cola de interbloqueo doblemente vinculada:

  • Un bloqueo de giro ejecutivo, que el controlador debe llamar a KeInitializeSpinLock para inicializar. Normalmente, un controlador inicializa el bloqueo de número cuando configura las extensiones de dispositivo para sus objetos de dispositivo en su rutina AddDevice .

  • Encabezado de lista de la cola, que el controlador debe inicializar llamando a InitializeListHead.

La mayoría de los controladores que usan colas interbloqueadas doblemente vinculadas proporcionan el almacenamiento necesario en la extensión del dispositivo de un objeto de dispositivo creado por el controlador. En su lugar, el bloqueo de número de cola y ejecutivo puede estar en una extensión de controlador (si el controlador usa un objeto de controlador) o en un grupo no paginado asignado por el controlador.

Mientras el controlador acepta solicitudes de E/S, puede insertar un IRP en su cola llamando a cualquiera de las siguientes rutinas de soporte técnico si ListHead es de tipo LIST_ENTRY, como se muestra en la ilustración anterior:

ExInterlockedInsertTailList para colocar el IRP al final de la cola

ExInterlockedInsertHeadList para colocar el IRP en la parte delantera de la cola. Normalmente, los controladores llaman a esta rutina solo cuando deben reintentar una solicitud determinada.

El controlador debe pasar punteros al IRP (ListEntry), así como los punteros de bloqueo de giro ejecutivo (Lock) de ListHead y los que inicializó anteriormente, a cada una de estas rutinas exInterlockedInsertXxxList. Solo se requieren punteros a ListHead y Lock cuando el controlador quita una cola irP llamando a ExInterlockedRemoveHeadList. Para evitar interbloqueos, el controlador no debe mantener un ExecutiveSpinLock que pase a cualquier rutina ExInterlockedXxx .

Dado que una cola interbloqueada está protegida por el bloqueo de giro ejecutivo, el controlador puede insertar IRP en su cola vinculada doblemente y quitarlas de una manera segura para varios procesadores de cualquier rutina de controlador que se ejecute en menos o igual que IRQL = DISPATCH_LEVEL.

Una cola con listHead de tipo LIST_ENTRY, como se muestra en la ilustración anterior, es una lista vinculada doblemente. Uno con listHead de tipo SLIST_HEADER es una lista secuenciada vinculada de forma cansada. Un controlador inicializa listHead para una cola interbloqueada vinculada secuenciada mediante una llamada a ExInitializeSListHead.

Un controlador que nunca reintenta las operaciones de E/S puede usar ExInterlockedPushEntrySList y ExInterlockedPopEntrySList para administrar su puesta en cola de IRP internamente en una cola interbloqueada secuenciada vinculada de forma automática. Cualquier controlador que use este tipo de cola interbloqueada también debe proporcionar almacenamiento residente para un listHead de tipo SLIST_HEADER y para un ExecutiveSpinLock, como se muestra en la ilustración anterior. Debe inicializar el bloqueo de número y configurar su cola antes de llamar a ExInterlockedPushEntrySList para insertar la entrada inicial en su cola.

Para obtener más información, consulte Administración de prioridades de hardware y bloqueos de número. Para conocer los requisitos de IRQL para una rutina de soporte técnico específica, consulte la página de referencia de la rutina.