DMA на основе пакетов в AVStream
Прямой доступ к памяти на основе пакетов (DMA) происходит, когда мини-диск считывает данные непосредственно из и записывает данные непосредственно в буферы, полученные из пользовательского режима. Пример драйвера имитированного оборудования AVStream (AVSHwS) в комплекте драйверов Windows (WDK) демонстрирует создание мини-драйвера AVStream, выполняющего этот тип DMA.
Чтобы реализовать схему DMA на основе пакетов, выполните приведенные далее действия.
Укажите KSPIN_FLAG_GENERATE_MAPPINGS в элементе Флаги соответствующих KSPIN_DESCRIPTOR_EX структур. Обратите внимание, что этот флаг должен использоваться только master шины с поддержкой точечной и сборной.
Зарегистрируйте подпрограмму обслуживания прерываний (ISR), как описано в статье Написание мини-драйверов AVStream для оборудования.
Затем в диспетчере запуска AVStrMiniDeviceStart :
Настройка объекта адаптера DMA с помощью IoGetDmaAdapter.
Зарегистрируйте объект адаптера DMA в AVStream, вызвав KsDeviceRegisterAdapterObject.
Мини-driver задает максимальный размер для одного точечных/собираемых сопоставлений, предоставляя параметр MaxMappingByteCount в вызове KsDeviceRegisterAdapterObject.
Если какое-либо сопоставление точечной и сборной превышает этот максимальный размер, AVStream автоматически разбивает сопоставление на несколько точечной и сборной сопоставлений, каждое из которых не больше размера, указанного в Параметре MaxMappingByteCount.
Также необходимо предоставить подпрограмму обратного вызова AVStrMiniPinProcess . Модуль записи драйверов должен выбрать соответствующую функциональность для этого обратного вызова. В качестве одного из примеров можно сделать следующее:
Вызовите KsPinGetLeadingEdgeStreamPointer.
Клонируйте передний край, вызвав KsStreamPointerClone.
Программируйте оборудование DMA на основе клона.
Вызовите KsStreamPointerAdvanceOffsets или KsStreamPointerAdvance , чтобы продвинуть передний край.
При необходимости повторите шаг 2 для дополнительных кадров.
Когда оборудование прерывается для завершения DMA, ядро вызывает ISR, зарегистрированный поставщиком ранее. В ISR мини-driver помещает в очередь отложенный вызов процедуры (DPC).
DPC должен обновить DataUsed и, возможно, другие элементы структуры KSSTREAM_HEADER . Затем DPC может вызвать KsStreamPointerDelete , чтобы удалить клон и освободить связанный кадр.
Кроме того, DPC может продвигать указатель клона, если завершена только часть кадра. Для этого вызовите KsStreamPointerAdvanceOffsets.
Если необходимо возобновить обработку, вызовите KsPinAttemptProcessing.
Примечание
Если длина сопоставления меньше одной физической страницы, оно не гарантированно будет находиться на одной физической странице.