Использование 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 .