Compartir a través de


Verificación de DMA

La comprobación de DMA supervisa el uso del acceso directo a memoria (DMA). Dado que las rutinas de DMA han cambiado a medida que Windows ha desarrollado, muchos controladores hacen un uso incorrecto de las llamadas DMA. Además, algunos desarrolladores de controladores intentan omitir por completo el subsistema HAL DMA. Esta práctica puede introducir errores insidiosos en el controlador.

La opción Comprobación DMA del Comprobador de controladores intenta detectar errores comunes de DMA. Junto con la extensión !dma para el depurador de kernel, se puede usar para comprobar que un controlador emplea DMA de forma adecuada.

Esta opción del comprobador de controladores también se denomina Verificación HAL. Algunos mensajes de error generados por el Comprobador de controladores pueden usar este término.

Diferentes tipos de DMA

DMA es un mecanismo a través del cual un dispositivo de hardware puede transferir datos a o desde la memoria sin usar el procesador. El procesador es necesario para configurar la transferencia y el dispositivo indicará al procesador cuando haya completado la transferencia. La ventaja de este sistema es que el procesador puede realizar otras tareas mientras se realiza la transferencia DMA.

Hay varios tipos de DMA usados en Windows 2000 y versiones posteriores:

DMA de búfer común
DMA de búfer común se realiza cuando el sistema puede asignar un único búfer accesible tanto por el hardware como por el software. El controlador es responsable de sincronizar los accesos al búfer. La memoria no se almacena en caché, lo que facilita esta sincronización para el controlador. Después de configurar un búfer común, tanto el controlador como el hardware pueden escribir directamente en las direcciones del búfer sin intervención de HAL.

Paquete DMA
El DMA de paquetes se lleva a cabo cuando hay un único búfer existente que debe ser asignado para que lo utilice el hardware. Un ejemplo de uso de DMA de paquete es la transferencia de un archivo de la memoria a un disco. El uso de DMA de búfer común en esta situación sería desperdiciado, ya que el archivo tendría que transferirse al búfer común antes de que el hardware pudiera transferirlo al disco. En su lugar, se consulta el HAL; proporciona al controlador la información que necesita para ayudar al hardware a encontrar el búfer real en memoria. Esta operación es complicada por la necesidad de que las rutinas implicadas funcionen en diferentes arquitecturas.

Dispersión y recopilación de DMA
Scatter/gather DMA es un método abreviado que configura varias transferencias DMA de paquetes simultáneamente. Si está transfiriendo un paquete por la red, por ejemplo, cada parte de la pila de red agrega su propio encabezado (TCP, IP, Ethernet, etc.). Estos encabezados se asignan desde diferentes lugares en la memoria. En este caso, el DMA de dispersión/recolección ahorra tiempo al emitir una solicitud por lotes al HAL para mapear cada encabezado junto con el segmento de datos para el acceso por parte del hardware. En lugar de tener que llamar a las rutinas de DMA del paquete en cada capa del paquete, este método llama a cada rutina una vez y permite que el HAL sea responsable de asignar cada una de forma individual.

NotaLa funcionalidad Dispersión/recopilación no significa que el dispositivo pueda usar las rutinas de dispersión y recopilación. La funcionalidad de dispersión y recopilación hace referencia a una marca en la descripción del dispositivo que indica que el dispositivo puede leer o escribir desde cualquier área en memoria, en lugar de solo un intervalo determinado.

DMA del sistema
El sistema DMA se realiza mediante la programación del controlador DMA del sistema en la placa base para realizar la transferencia directamente. Solo las tarjetas ISA pueden usar DMA del sistema.

Efectos de la comprobación de DMA

Cuando la comprobación de DMA está activa, el comprobador de controladores detecta los usos incorrectos de las rutinas de DMA, entre las que se incluyen:

  • Desbordamiento o subutilización del búfer de memoria DMA (estos errores pueden ser causados por el hardware o el controlador).

  • Liberar un búfer común, un canal de adaptador, un registro de mapa o una lista de dispersión y recopilación de forma duplicada.

  • Pérdida de memoria al no liberar búferes comunes, canales de adaptador, registros de mapeo, listas de dispersión/recopilación o adaptadores.

  • Tener más de un canal de adaptador presente para un adaptador a la vez.

  • Intentando usar un adaptador que ya se ha liberado y que ya no existe.

  • No se vacia el búfer de un adaptador.

  • Tener demasiados recuentos de referencia pendientes para un adaptador.

  • Realizar DMA en un búfer paginable (todos los búferes deben bloquearse antes de que comience la transferencia de DMA).

  • Realizar DMA en un MDL con marcas corruptas.

  • Hacer referencia a una dirección del sistema no válida, ya sea antes de la primera MDL, o después del final de la primera MDL, o usando una longitud de transferencia que sea mayor que el búfer MDL y cruce un límite de página dentro de la MDL.

  • Asignar demasiados registros de mapa a la vez o asignar más registros de mapa que el número máximo permitido.

  • Asignación doble de registros de mapa.

  • Intentando liberar registros de mapeo mientras algunos aún están asignados.

  • Intentar vaciar un registro de mapa que no se ha asignado.

  • Intentar purgar demasiados bytes al final del archivo de registros del mapa.

  • Llamar a rutinas de DMA en un IRQL incorrecto.

  • Pasar un valor nulo de DMA_ADAPTER a una rutina HAL.

  • Pasar una dirección y una MDL a una rutina HAL cuando la dirección no está contenida en la MDL.

  • Intentar asignar un intervalo de direcciones que ya se ha asignado.

  • Intentar vaciar un búfer que no está asignado.

  • Intentando asignar un búfer de longitud cero para la transferencia.

  • Llamar a la función obsoleta HalGetAdapter (todos los controladores deben usar IoGetDmaAdapter en su lugar).

El Comprobador de controladores supervisa el comportamiento del controlador y emite la comprobación de errores 0xE6 si se produce alguna de estas infracciones. Consulte Verificación de errores 0xE6 (DRIVER_VERIFIER_DMA_VIOLATION) para obtener una lista de los parámetros de verificación de errores.

¿Cuándo es útil la comprobación de DMA?

Todos los controladores que usan DMA directamente (llamando a las rutinas de HAL DMA) deben probarse con la comprobación de DMA.

Además, también se deben probar los controladores de miniport, ya que a menudo usan DMA indirectamente (llamando a controladores de puerto que usan DMA).

La comprobación de DMA también puede ser una manera eficaz de detectar daños en la memoria, ya que puede detectarse cuando un controlador o un dispositivo de hardware sobrepone un búfer DMA.

Supervisión de la verificación de DMA

La extensión del depurador de kernel !dma se puede usar para mostrar una gran cantidad de información de DMA. Puede mostrar varios detalles sobre el comportamiento de cada adaptador DMA. Hay un ejemplo detallado de la extensión !dma , así como información general sobre las extensiones del depurador, en la documentación del paquete Herramientas de depuración para Windows. Consulte Depuración de Windows para obtener más información.

Activación de esta opción

Puede activar la característica comprobación de DMA para uno o varios controladores mediante el Administrador de comprobadores de controladores o la línea de comandos Verifier.exe. Para obtener más información, consulte Seleccionar opciones del comprobador de controladores.

  • En la línea de comandos

    En la línea de comandos, la opción Comprobación de DMA se representa mediante Bit 7 (0x80). Para activar la comprobación de DMA, use un valor de marca de 0x80 o agregue 0x80 al valor de marca. Por ejemplo:

    verifier /flags 0x80 /driver MyDriver.sys
    

    La característica estará activa después del siguiente arranque.

    En Windows Vista y versiones posteriores de Windows, también puede activar y desactivar la comprobación de DMA sin reiniciar el equipo agregando el parámetro /volatile al comando. Por ejemplo:

    verifier /volatile /flags 0x80 /adddriver MyDriver.sys
    

    Esta configuración es efectiva inmediatamente, pero se pierde al apagar o reiniciar el equipo. Para obtener más información, consulte Uso de la configuración volátil.

    La característica Comprobación de DMA también se incluye en la configuración estándar. Por ejemplo:

    verifier /standard /driver MyDriver.sys
    
  • Uso del Administrador del Verificador de Controladores

    1. Inicie el Administrador del comprobador de controladores. Escriba Comprobador en una ventana del símbolo del sistema.
    2. Seleccione Crear configuración personalizada (para desarrolladores de código) y, a continuación, haga clic en Siguiente.
    3. Seleccione Seleccionar configuración individual en una lista completa.
    4. Seleccione (comprobar) comprobación de DMA.

    La característica Comprobación de DMA también se incluye en la configuración estándar. Para usar esta característica, en El Administrador del comprobador de controladores, haga clic en Crear configuración estándar.