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


Использование Packet-Based Bus-Master DMA

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

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

  • AllocateAdapterChannel, когда драйвер готов к программированию адаптера master шины для DMA

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

    Обратите внимание, что любому драйверу может потребоваться выполнить несколько операций передачи для удовлетворения текущего IRP, как описано в разделе Разделение запросов на передачу. Драйверы устройств, у которых нет возможностей точечных и сборных данных, могут вызывать MapTransfer один раз для каждой операции передачи. Драйверы устройств с возможностями точечной и сборной могут вызывать MapTransfer несколько раз, чтобы настроить каждую операцию передачи. Кроме того, эти драйверы могут использовать встроенную поддержку точечной и сборной системы, описанную в разделе Использование точечной и сборной DMA.

  • FlushAdapterBuffers в конце каждой операции передачи DMA на целевое устройство и с него, чтобы определить, были ли полностью переданы все запрошенные данные.

  • FreeMapRegisters сразу после выполнения всех операций DMA для текущего IRP, так как все запрошенные данные полностью переданы или драйвер должен завершить работу IRP из-за ошибки ввода-вывода устройства или шины.

Указатель на объект адаптера, возвращаемый IoGetDmaAdapter , является обязательным параметром для AllocateAdapterChannel, MapTransfer, FlushAdapterBuffers и FreeMapRegisters. Обратите внимание, что в версиях Windows NT, предшествующих Windows 2000, устройства с master шиной могли передавать указатель объекта адаптера NULL в MapTransfer и FlushAdapterBuffers. В Windows 2000 и более поздних версиях драйверы больше не могут это делать.

Для KeFlushIoBuffers и MmGetMdlVirtualAddress требуется указатель на MDL в Irp-MdlAddress>.

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

Вместо процедур, описанных в этом разделе, любой драйвер, использующий DMA на основе пакетов, может использовать подпрограммы поддержки, предназначенные для оптимизации точечной и сборной данных, независимо от того, имеет ли его устройство встроенную поддержку точечной и сборной данных. Дополнительные сведения см. в разделе Использование точечной и сборной DMA .