Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Чтобы использовать 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 ".