Compartir a través de


Directiva de copia y almacenamiento en caché de datos

Un controlador de miniporte WaveCíclico copia los datos de audio entre el búfer DMA, al que accede el hardware del controlador de audio HD y el búfer de cliente, al que accede la aplicación de audio en modo de usuario:

  • Para un flujo de datos de reproducción, el controlador copia datos del búfer del cliente al búfer DMA.

  • Para un flujo de datos de captura, el controlador copia los datos del búfer DMA en el búfer de cliente.

Para las secuencias de reproducción y captura, el controlador puede lograr el mejor rendimiento al habilitar el almacenamiento en caché de la memoria del búfer DMA (tipo de caché MmCached) y confiar en el mecanismo de ajuste de bus del controlador PCI para garantizar la coherencia de caché. Sin embargo, algunas implementaciones del controlador PCI Express no supervisan las transferencias de datos isócronos del controlador de audio HD (como el conjunto inicial de chips PCI Express de Intel).

El controlador de función no puede detectar si el hardware del controlador PCI admite la posposición de transferencias de búfer DMA o realiza transferencias de datos isócrónicas. Para evitar posibles problemas de coherencia de caché, el controlador deshabilita el almacenamiento en caché de la memoria del búfer DMA especificando el tipo de almacenamiento en caché para esa memoria como MmWriteCombined. (MmNonCached también funcionaría, pero podría no rendir igual de bien). Si escribe un controlador de adaptador personalizado basado en el controlador de función de ejemplo, su controlador de miniporte WaveCíclico debería comportarse de manera similar a menos que pueda comprobar que el controlador PCI sí admite de hecho la supervisión de transferencias del búfer DMA.

Para admitir dispositivos y sistemas que no realizan operaciones de snooping de bus, un controlador de funciones personalizado debe seguir estas reglas:

  • Para una secuencia de reproducción, especifique el tipo de caché del búfer DMA como MmWriteCombined. Después de copiar un bloque de datos desde el búfer de cliente al búfer DMA, llame a la función KeMemoryBarrier para que los datos sean visibles para el motor DMA. KeMemoryBarrier vacía los datos copiados en la memoria de una manera eficaz que deja las cachés de datos del procesador en gran medida intactas.

  • Para una secuencia de captura, especifique el tipo de caché del búfer DMA como MmWriteCombined o MmNonCached. Además, el controlador de función debe evitar escribir en el búfer DMA. Si debe realizar el procesamiento local de muestras de audio, primero debe copiar los datos en otra parte.

El bloque de datos que el controlador de función copia hacia o desde el búfer DMA no es necesario que comience ni termine en un límite de búfer de combinación de escritura, y no es necesario que el tamaño del bloque sea un múltiplo del tamaño del búfer de combinación de escritura (normalmente, 32 o 64 bytes).

Para los controladores de función de códec que usan la versión HDAUDIO_BUS_INTERFACE_BDL de DDI, la rutina AllocateContiguousDmaBuffer realiza tanto la asignación como el mapeo de la memoria del búfer DMA. La rutina siempre establece el tipo de caché del búfer en MmWriteCombined.

Para obtener más información sobre la combinación de escritura, consulte el "Manual del Desarrollador de Software de Arquitectura Intel IA-32" en el sitio web de Intel.