Comprobació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 escritores de controladores intentan omitir por completo el subsistema HAL DMA. Esta práctica puede introducir errores insidios en el controlador.

La opción Comprobación de DMA del Comprobador de controladores intenta detectar errores comunes de DMA. Junto con la extensión del depurador de kernel !dma , se puede usar para comprobar que un controlador usa 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 hacia 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.

DMA de paquetes
El paquete DMA se realiza cuando hay un único búfer existente que debe asignarse para que lo use el hardware. Un ejemplo de uso del paquete DMA es la transferencia de un archivo de 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 la 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
Dispersión y recopilación de DMA es un método abreviado que configura varias transferencias DMA de paquetes a la vez. Si va a transferir un paquete a través de 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, la dispersión o recopilación de DMA ahorra tiempo mediante la emisión de una solicitud por lotes al HAL para asignar cada encabezado más el segmento de datos para el acceso por parte del hardware. En lugar de tener que llamar a las rutinas DMA del paquete en cada parte del paquete, este método llama a cada rutina una vez y permite que EL HAL sea responsable de asignar cada una individualmente.

NotaLa funcionalidad de dispersión y 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:

  • Sobresrución o ejecución del búfer de memoria DMA (el hardware o el controlador pueden realizar estos errores).

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

  • Pérdida de memoria al no liberar búferes comunes, canales de adaptador, registros de mapa, listas de dispersión y 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 vaciado de un búfer de 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 una MDL con marcas mangled.

  • Haciendo referencia a una dirección del sistema no válida, ya sea antes del primer MDL, o después del final de la primera MDL, o usando una longitud de transferencia mayor que el búfer MDL y cruza un límite de página dentro de 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 mapa mientras algunos todavía están asignados.

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

  • Intentando vaciar demasiados bytes al final del archivo de registro de mapa.

  • Llamar a rutinas de DMA en un IRQL incorrecto.

  • Pasar un valor NULL 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.

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

  • Intentando 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 Comprobación de errores 0xE6 (DRIVER_VERIFIER_DMA_VIOLATION) para obtener una lista de los parámetros de comprobació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 minipuerto, ya que a menudo usan DMA indirectamente (mediante una llamada 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 sobreponen un búfer DMA.

Supervisión de la comprobació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. Consulta 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, vea 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 de comprobadores de controladores

    1. Inicie el Administrador de comprobadores de controladores. Escriba Comprobador en una ventana del símbolo del sistema.
    2. Seleccione Crear configuración personalizada (para desarrolladores de código) y 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 de comprobadores de controladores, haga clic en Crear configuración estándar.