Stratégie de copie et de mise en cache des données
Un pilote miniport WaveCyclic copie les données audio entre la mémoire tampon DMA, à laquelle le matériel du contrôleur Audio HD accède, et la mémoire tampon cliente, à laquelle l’application audio en mode utilisateur accède :
Pour un flux de données de lecture, le pilote copie les données de la mémoire tampon cliente vers la mémoire tampon DMA.
Pour un flux de données de capture, le pilote copie les données de la mémoire tampon DMA vers la mémoire tampon cliente.
Pour les flux de lecture et de capture, le pilote peut obtenir les meilleures performances en activant la mise en cache de la mémoire tampon DMA (type de cache MmCached) et en s’appuyant sur le mécanisme d’analyse du bus du contrôleur PCI pour garantir la cohérence du cache. Toutefois, certaines implémentations de contrôleur PCI Express n’espionnent pas les transferts de données isochronais du contrôleur Audio HD (comme le chipset PCI Express initial d’Intel).
Le pilote de fonction ne peut pas détecter si le matériel du contrôleur PCI prend en charge l’espionnage des transferts de mémoire tampon DMA ou effectue des transferts de données isochrone. Pour éviter les problèmes potentiels de cohérence du cache, le pilote désactive la mise en cache de la mémoire tampon DMA en spécifiant le type de mise en cache de cette mémoire en tant que MmWriteCombined. (MmNonCached fonctionne également, mais peut ne pas fonctionner aussi bien.) Si vous écrivez un pilote d’adaptateur personnalisé basé sur l’exemple de pilote de fonction, votre pilote de miniport WaveCyclic doit se comporter de la même façon, sauf si vous pouvez vérifier que le contrôleur PCI prend en charge l’espionnage des transferts de mémoire tampon DMA.
Pour prendre en charge les appareils et les systèmes qui n’effectuent pas d’analyse de bus, un pilote de fonction personnalisée doit suivre les règles suivantes :
Pour un flux de lecture, spécifiez le type de cache de la mémoire tampon DMA comme MmWriteCombined. Après avoir copié un bloc de données de la mémoire tampon cliente vers la mémoire tampon DMA, appelez la fonction KeMemoryBarrier pour rendre les données visibles pour le moteur DMA. KeMemoryBarrier vide les données copiées dans la mémoire de manière efficace, ce qui laisse les caches de données du processeur en grande partie intacts.
Pour un flux de capture, spécifiez le type de cache de la mémoire tampon DMA comme MmWriteCombined ou MmNonCached. En outre, le pilote de fonction doit éviter d’écrire dans la mémoire tampon DMA. S’il doit effectuer un traitement sur place d’échantillons audio, il doit d’abord copier les données ailleurs.
Le bloc de données que le pilote de fonction copie vers ou à partir de la mémoire tampon DMA n’est pas nécessaire pour commencer ou se terminer sur une limite de mémoire tampon combinant l’écriture, et sa taille n’est pas requise pour être un multiple de la taille de mémoire tampon de combinaison d’écriture (généralement, 32 ou 64 octets).
Pour les pilotes de fonction de codec qui utilisent la version HDAUDIO_BUS_INTERFACE_BDL de la DDI, la routine AllocateContiguousDmaBuffer effectue à la fois l’allocation et le mappage de la mémoire tampon DMA. La routine définit toujours le type de cache de la mémoire tampon sur MmWriteCombined.
Pour plus d’informations sur la combinaison d’écritures, consultez le Manuel du développeur de logiciels d’architecture Intel IA-32 sur le site web d’Intel .