Поделиться через


Использование DMA на основе пакетов

Драйверы подчиненных устройств, использующих DMA на основе пакетов, вызывают следующую общую последовательность подпрограмм поддержки при обработке IRP, запрашивающей передачу DMA:

  • KeFlushIoBuffers непосредственно перед попыткой выделить системный контроллер DMA (дополнительные сведения см. в разделе "Обслуживание кэша Coherency")

  • ВыделитьAdapterChannel , когда драйвер готов программировать устройство для DMA и нуждается в системном контроллере DMA.

    В свою очередь, AllocateAdapterChannel вызывает подпрограмму AdapterControl драйвера.

  • MmGetMdlVirtualAddress для получения индекса в MDL, необходимого в качестве параметра в первоначальном вызове MapTransfer

  • MapTransfer для программирования системного контроллера DMA для операции передачи

    Драйверу может потребоваться вызвать MapTransfer несколько раз для передачи всех запрошенных данных, как описано в разделе "Запросы на передачу разбиения".

  • FlushAdapterBuffers сразу после каждой операции передачи DMA из подчиненного устройства

    Если драйвер должен вызывать MapTransfer несколько раз для передачи всех запрошенных данных, он должен вызывать FlushAdapterBuffers столько раз, сколько вызывает MapTransfer.

  • FreeAdapterChannel либо сразу после передачи всех запрошенных данных, либо если драйвер завершает ошибку IRP из-за ошибки ввода-вывода устройства

Указатель объекта адаптера, возвращаемый IoGetDmaAdapter, является обязательным параметром для каждой из этих подпрограмм, кроме KeFlushIoBuffers и MmGetMdlVirtualAddress, для которых требуется указатель на MDL, переданный в Irp-MdlAddress>.

Отдельные драйверы вызывают эту последовательность подпрограмм поддержки в разных точках в зависимости от того, как каждый драйвер реализуется для обслуживания своего устройства. Например, подпрограмма StartIo одного драйвера может вызвать Приложение AllocateAdapterChannel, другой драйвер может сделать этот вызов из подпрограммы, которая удаляет irPs из очереди, созданной драйвером, и еще один драйвер может сделать этот вызов, когда его подчиненный устройство DMA указывает, что оно готово к передаче данных.