Partilhar via


Política de cópia e cache de dados

Um driver de miniporto WaveCyclic copia dados de áudio entre o buffer de DMA, que o hardware do controlador de áudio HD acessa e o buffer do cliente, que o aplicativo de áudio no modo de usuário acessa:

  • Para um fluxo de dados de reprodução, o driver copia dados do buffer do cliente para o buffer de DMA.

  • Para um fluxo de dados de captura, o driver copia dados do buffer DMA para o buffer do cliente.

Para fluxos de reprodução e captura, o driver pode obter o melhor desempenho habilitando o cache da memória do buffer de DMA (tipo de cache MmCached) e contando com o mecanismo de bisbilhotagem de barramento do controlador PCI para garantir a coerência do cache. No entanto, algumas implementações do controlador PCI Express não bisbilhotam as transferências de dados isócronas do controlador de áudio HD (como o chipset PCI Express inicial da Intel).

O driver de função não pode detectar se o hardware do controlador PCI dá suporte à espionagem de transferências de buffer de DMA ou executa transferências de dados isócronas. Para evitar possíveis problemas de coerência de cache, o driver desabilita o cache da memória do buffer de DMA especificando o tipo de cache para essa memória como MmWriteCombined. (MmNonCached também funcionaria, mas pode não funcionar tão bem.) Se você escrever um driver de adaptador personalizado baseado no driver de função de exemplo, o driver de miniporto WaveCyclic deverá se comportar da mesma forma, a menos que você possa verificar se o controlador PCI de fato dá suporte à espionagem de transferências de buffer de DMA.

Para dar suporte a dispositivos e sistemas que não executam a bisbilhotagem de ônibus, um driver de função personalizado deve seguir estas regras:

  • Para um fluxo de reprodução, especifique o tipo de cache do buffer DMA como MmWriteCombined. Depois de copiar um bloco de dados do buffer do cliente para o buffer de DMA, chame a função KeMemoryBarrier para tornar os dados visíveis para o mecanismo de DMA. KeMemoryBarrier libera os dados copiados para a memória de uma maneira eficiente que deixa os caches de dados do processador em grande parte não alterados.

  • Para um fluxo de captura, especifique o tipo de cache do buffer DMA como MmWriteCombined ou MmNonCached. Além disso, o driver de função deve evitar gravar no buffer de DMA. Se ele precisar executar o processamento in-loco de amostras de áudio, ele deverá primeiro copiar os dados em outro lugar.

O bloco de dados que o driver de função copia para ou do buffer de DMA não é necessário para começar ou terminar em um limite de buffer de combinação de gravação e seu tamanho não é necessário para ser um múltiplo do tamanho do buffer de combinação de gravação (normalmente, 32 ou 64 bytes).

Para drivers de função codec que usam a versão HDAUDIO_BUS_INTERFACE_BDL da DDI, a rotina AllocateContiguousDmaBuffer executa a alocação e o mapeamento da memória do buffer de DMA. A rotina sempre define o tipo de cache do buffer como MmWriteCombined.

Para obter mais informações sobre a combinação de gravação, consulte o Manual do Desenvolvedor de Software de Arquitetura Ia-32 Intel no site da Intel .