Использование точечной и сборной данных DMA
Драйверы, выполняющие системную или master шину, DMA на основе пакетов, могут использовать подпрограммы поддержки, разработанные специально для точечной и сборной DMA. Вместо вызова последовательности подпрограмм, описанных в разделе Использование Packet-Based системного DMA и Bus-Master на основе пакетов DMA, драйвер может использовать GetScatterGatherList и PutScatterGatherList.
Для использования этих подпрограмм устройству не требуется встроенная поддержка точечной и сборной данных для своего драйвера.
Драйверы, использующие DMA на основе пакетов, вызывают следующую последовательность процедур поддержки для операций точечной и сборной:
MmGetMdlVirtualAddress для получения индекса в MDL, необходимого в качестве параметра в вызове GetScatterGatherList.
GetScatterGatherList, когда драйвер готов к программированию своего устройства для DMA и нуждается в системном контроллере DMA или адаптере master шины
GetScatterGatherList выделяет системный контроллер DMA или адаптер master шины, определяет, сколько регистров карты требуется и выделяет их, заполняет список точечной и сборной и вызывает подпрограмму AdapterListControl драйвера при наличии контроллера DMA или адаптера и регистров карт.
PutScatterGatherList , как только все запрошенные данные были переданы или драйвер завершает работу с IRP из-за ошибки ввода-вывода устройства
PutScatterGatherList очищает буферы адаптера, освобождает регистры карты и освобождает точечный/собирающий список. Драйвер должен вызвать PutScatterGatherList , прежде чем получить доступ к данным в буфере.
Указатель на объект адаптера, возвращаемый IoGetDmaAdapter, является обязательным параметром для каждой из этих подпрограмм, за исключением MmGetMdlVirtualAddress, для которого требуется указатель на MDL в Irp-MdlAddress>.
Подпрограмма GetScatterGatherList включает вызовы AllocateAdapterChannel и MapTransfer, поэтому драйверу не нужно выполнять эти вызовы. Подпрограмма принимает в качестве параметров следующее:
Указатель на структуру DMA_ADAPTER, возвращаемую IoGetDmaAdapter.
Указатель на объект целевого устройства для операции DMA.
Указатель на MDL, описывающий буфер в Irp-MdlAddress>.
Указатель на текущий виртуальный адрес в буфере, описываемом Mdl.
Число сопоставляемых байтов
Указатель на подпрограмму AdapterListControl , которая выполняет передачу
Указатель на определяемую драйвером контекстную область, передаваемую в подпрограмму AdapterListControl .
Логическое значение: TRUE для передачи на устройство; False, в противном случае
После определения требуемого количества регистров карты, выделения канала адаптера и регистров карты, заполнения списка точечной и сборной и подготовки к передаче GetScatterGatherList вызывает подпрограмму AdapterListControl , предоставляемую драйвером. Подпрограмма AdapterListControl выполняется в произвольном контексте потока по адресу IRQL = DISPATCH_LEVEL.
Подпрограмма AdapterListControl , которую драйвер предоставляет в вызовах GetScatterGatherList , отличается от подпрограммы AdapterControl , переданной в AllocateAdapterChannel , в следующих важных аспектах:
Подпрограмма AdapterListControl не имеет возвращаемого значения, тогда как подпрограмма AdapterControl возвращает IO_ALLOCATION_ACTION.
Вместо указателя на MapRegisterBase для регистров карты, выделенных системой, третий параметр подпрограммы AdapterListControl указывает на SCATTER_GATHER_LIST структуру, с помощью которой драйвер может выполнять DMA.
Подпрограмма AdapterListControl выполняет подмножество задач, необходимых в подпрограмме AdapterControl .
Подпрограмма AdapterListControl не вызывает AllocateAdapterChannel или MapTransfer. Его единственными обязанностями является сохранение указателя точечного или собираемого списка ввода, настройка устройства и использование точечных и сборных списков для выполнения DMA.
Структура списка точечной и сборной включает SCATTER_GATHER_ELEMENT массив и количество элементов в массиве. Каждый элемент массива предоставляет длину и начальный физический адрес физической непрерывной области точечных/сборных данных. Драйвер использует длину и адрес при передаче данных.
Драйвер может использовать GetScatterGatherList независимо от того, поддерживает ли его устройство точечную и сборную DMA. Для устройства, которое не поддерживает точечную и сборную DMA, список точечной и сборной данных будет содержать только один элемент.
Использование процедур точечной и сборной может повысить производительность по сравнению с вызовом AllocateAdapterChannel (как описано ранее в разделах Использование DMA системы Packet-Based и использование Packet-Based Bus-Master DMA). В отличие от вызовов AllocateAdapterChannel, несколько вызовов GetScatterGatherList могут быть поставлены в очередь для объекта устройства в любой момент времени. Драйвер может снова вызвать GetScatterGatherList для другой операции DMA с тем же объектом драйвера до завершения выполнения подпрограммы AdapterListControl .
При возвращении из подпрограммы AdapterListControl , предоставленной драйвером, GetScatterGatherList сохраняет регистры карты, но освобождает структуру адаптера DMA.
Если драйвер выполнил текущий запрос на передачу IRP или должен завершиться сбоем из-за ошибки ввода-вывода устройства или шины, он должен вызвать PutScatterGatherList , прежде чем получить доступ к переданным данным в буфере. PutScatterGatherList очищает буферы адаптера и освобождает регистры карты, а также список точечной и сборной.