Compartir a través de


Problemas de confiabilidad de un controlador WavePci Miniport

Un controlador de miniporte WavePci debe realizar un seguimiento de las asignaciones que recibe del controlador de puerto. Un controlador de miniporte WavePci mantiene su lista de asignaciones en una estructura de datos que se comparte entre subprocesos de controlador. Los subprocesos del controlador también deben compartir el acceso al canal DMA para agregar nuevas asignaciones a la cola de hardware y quitar las asignaciones completadas de la cola. Para evitar daños en los datos, los controladores de minipuerto usan bloqueos de número para serializar los accesos a estructuras de datos compartidas y periféricos. Un bloqueo de número protege los datos compartidos y la cola de hardware del acceso simultáneo por dos o más subprocesos de controladores.

Al desarrollar la parte del controlador que administra asignaciones, los proveedores deben prestar especial atención a los siguientes puntos.

Bloqueos de número

Para evitar posibles interbloqueos, el controlador de miniporte no debe contener su propio bloqueo de giro al llamar a Portcls.sys para adquirir o liberar asignaciones. El controlador de ejemplo Ac97 del Kit de controladores de Microsoft Windows (WDK) ilustra este principio. Antes de llamar a IPortWavePciStream::GetMapping o IPortWavePciStream::ReleaseMapping, el controlador de ejemplo llama a KeReleaseSpinLock para liberar el bloqueo de número. Después de que se devuelva la llamada GetMapping o ReleaseMapping , el controlador llama a KeAcquireSpinLock para volver a adquirir el bloqueo de número. Entre las llamadas para liberar y adquirir el bloqueo de número, un subproceso de controlador no debe asumir que tiene acceso exclusivo a la lista de asignaciones. El acceso a los datos compartidos durante este intervalo desprotegido es peligroso. Si el intervalo entre liberar y adquirir el bloqueo de giro es pequeño, la probabilidad de que los datos estén dañados por una condición de carrera entre dos subprocesos de controlador también es pequeño. Esto significa que los errores resultantes son intermitentes y, por tanto, difíciles de rastrear. Después de liberar y adquirir un bloqueo de número, un controlador bien escrito debe suponer que los punteros o índices temporales que usó anteriormente para acceder al contenido de las estructuras de datos compartidas ya no son válidos.

Cancelación de IRP

En cualquier momento durante el procesamiento de una secuencia de reproducción o captura, la cancelación de un IRP puede hacer que el sistema operativo revoque una o varias asignaciones que el controlador de miniporte ha adquirido. Cuando esto ocurre, el controlador de puerto llama al método IMiniportWavePciStream::RevokeMappings para notificar al controlador de miniport. Para evitar reproducir datos de o capturar datos en las asignaciones revocadas, el controlador de miniporte debe quitar las asignaciones de su lista de software y la cola de hardware del controlador DMA. Dado que la lista de software y la cola de hardware se comparten entre subprocesos de controladores, se requiere cierta atención para realizar estas operaciones de forma confiable.

Por ejemplo, un conjunto de asignaciones que se van a revocar puede contener una asignación que acaba de ser o está a punto de publicarse. En este caso, dos subprocesos de controlador pueden intentar quitar simultáneamente la misma asignación de la cola DMA. Si el controlador no puede evitar el acceso simultáneo, el resultado puede ser dañado de los datos de los registros o estructuras de memoria que administran la cola.

Para obtener un ejemplo de código de trabajo, consulta el controlador de ejemplo Ac97 en el Kit de controladores de Windows (WDK).