Политика копирования и кэширования данных
Драйвер miniport WaveCyclic копирует звуковые данные между буфером DMA, к которому обращается аппаратное обеспечение контроллера HD Audio, и буфером клиента, к которому обращается звуковое приложение пользовательского режима:
Для потока данных воспроизведения драйвер копирует данные из буфера клиента в буфер DMA.
Для потока данных отслеживания драйвер копирует данные из буфера DMA в буфер клиента.
Для потоков воспроизведения и записи драйвер может достичь наилучшей производительности, включив кэширование буферной памяти DMA (тип кэша MmCached) и используя механизм отслеживания шины контроллера PCI для обеспечения когерентности кэша. Однако некоторые реализации контроллера PCI Express не отслеживает изохронную передачу данных контроллера HD Audio (например, исходный набор микросхем PCI Express intel).
Драйвер функции не может определить, поддерживает ли оборудование контроллера PCI слежку за буфером DMA или выполняет изохронную передачу данных. Чтобы избежать потенциальных проблем с когерентностью кэша, драйвер отключает кэширование буферной памяти DMA, указывая тип кэширования для этой памяти как MmWriteCombined. (MmNonCached также будет работать, но может работать не так хорошо.) Если вы создаете пользовательский драйвер адаптера, основанный на примере драйвера функции, драйвер miniport WaveCyclic должен вести себя аналогичным образом, если вы не сможете убедиться, что контроллер PCI действительно поддерживает слежку передачи буфера DMA.
Для поддержки устройств и систем, которые не выполняют отслеживание шины, пользовательский драйвер функции должен следовать следующим правилам:
Для потока воспроизведения укажите тип кэша буфера DMA MmWriteCombined. После копирования блока данных из клиентского буфера в буфер DMA вызовите функцию KeMemoryBarrier , чтобы сделать данные видимыми для подсистемы DMA. KeMemoryBarrier эффективно сбрасывает скопированные данные в память, оставляя кэши данных процессора в значительной степени нетронутыми.
Для потока записи укажите тип кэша буфера DMA : MmWriteCombined или MmNonCached. Кроме того, драйвер функции должен избегать записи в буфер DMA. Если необходимо выполнить обработку образцов звука на месте, необходимо сначала скопировать данные в другое место.
Блок данных, копируемый драйвером функции в буфер DMA или из буфера DMA, не требуется начинаться или заканчиваться на границе буфера, объединяющей запись, и его размер не обязательно должен быть кратным размеру буфера для объединения записи (обычно 32 или 64 байта).
Для драйверов функций кодека, использующих HDAUDIO_BUS_INTERFACE_BDL версию DDI, подпрограмма AllocateContiguousDmaBuffer выполняет выделение и сопоставление буферной памяти DMA. Подпрограмма всегда задает для типа кэша буфера значение MmWriteCombined.
Дополнительные сведения об объединении операций записи см. в руководстве разработчика программного обеспечения архитектуры Intel IA-32 на веб-сайте Intel .