Daños en los datos sin un tratamiento especial de la transferencia

Este artículo le ayuda a resolver el problema en el que pueden producirse daños en los datos sin el tratamiento especial de la transferencia.

Versión del producto original:   Acceso directo a memoria
Número de KB original:   2714876

Síntomas

En las versiones de Windows x86 habilitadas para PAE que admiten el acceso a la memoria superior a 4 GB, los controladores de dispositivos que combina el dispositivo de acceso directo a memoria (DMA) de 32 bits Lee con escrituras en la dirección virtual del mismo búfer de transferencia puede causar daños en los datos sin un tratamiento especial de la transferencia.

Causa

PAE habilitado para versiones de Windows x86 que admiten el acceso a la memoria superior a 4 GB implementar un control especial para los dispositivos que informan que no pueden usar más de 32 direcciones DMA de bits. Esta administración especial se implementa en la capa de abstracción de hardware (HAL) del sistema operativo con registros de mapa a los que a veces se hace referencia como búferes de devolución.

Cuando un controlador de dispositivo inicia una operación DMA en un dispositivo compatible con 32 bits, la DmaOperations función HalGetScatterGatherList debe determinar si alguna de las direcciones físicas que describen la transferencia reside en 4 GB. La HAL reemplazará las direcciones físicas del búfer de transferencia que residan por encima de 4 GB con un registro de mapa que resida por debajo de 4 GB, que el dispositivo puede tratar.

Si se realizaron sustituciones, la lista de recopilación de dispersión (SGL) generada estará formada por direcciones físicas, algunas de las cuales son distintas de la lista de descriptores de memoria original (MDL) que describe la transferencia. Cuando el controlador indica que la transferencia DMA se ha completado, la HAL determina si usa registros de mapa para admitir la transferencia. Si es así, y si la operación se leyó desde el dispositivo a la memoria del sistema, la HAL copiará el contenido de cualquier registro de mapa que se use en el búfer de datos original. Los datos escritos directamente en las direcciones virtuales del búfer de transferencia por el controlador antes de la finalización de las solicitudes se sobrescribirán por el contenido de los registros de mapa de la HAL sustituidos al finalizar la solicitud.

Si los datos contenidos en los registros de mapa no coinciden con lo que el controlador ha escrito directamente en el búfer de transferencia, es posible que los datos del búfer de transferencia no sean coherentes.

Solución

Los controladores de dispositivo que requieren la mezcla de operaciones de lectura DMA de 32 bits con escrituras en las direcciones virtuales de un búfer de transferencia deben usar la DmaOperations función HalBuildMdlFromScatterGatherList .

Si la HAL realizó sustituciones de registros de mapas, HalBuildMdlFromScatterGatherList creará una nueva MDL compuesta por la dirección física de búfer de transferencia no sustituida y las direcciones físicas de los registros de asignación de Hal sustituidos. La asignación de direcciones virtuales de la nueva MDL puede obtenerse llamando a MmGetSystemAddressForMdlSafe . Si HalBuildMdlFromScatterGatherList devuelve la MDL original, no se realizó ninguna sustitución de registro de mapa.

Las nuevas MDLs creadas por HalBuildMdlFromScatterGatherList deben ser no asignadas y liberadas por llamadas a MmUnmapLockedPages y la función IoFreeMdl.

Más información