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


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

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

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

  • AllocateAdapterChannel, когда драйвер готов к программированию адаптера шины для 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 устройства bus-master могут передавать указатель объекта адаптера NULL на MapTransfer и FlushAdapterBuffers. В Windows 2000 и более поздних версиях драйверы больше не могут это сделать.

KeFlushIoBuffers и MmGetMdlVirtualAddress требуют указателя на MDL по адресу Irp->MdlAddress.

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

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