Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
При запуске устройства драйвер, использующий системную или главную DMA, вызывает IoGetDmaAdapter для получения указателя на объект адаптера и определения максимального количества регистров карты, доступных для каждой операции передачи. Когда драйвер вызывает IoGetDmaAdapter, диспетчер ввода-вывода, в свою очередь, вызывает HAL, чтобы получить необходимые сведения о конкретной платформе.
Драйвер должен предоставить определенную информацию в системной DEVICE_DESCRIPTION структуре в вызове IoGetDmaAdapter. Драйверы должны использовать RtlZeroMemory для инициализации структуры DEVICE_DESCRIPTION с нулями, прежде чем задавать значения в нем.
Необходимые данные содержат сведения о функциях устройства драйвера, например о том, является ли устройство мастер-шиной, имеет ли оно возможности рассеивания/сбора данных, а также сколько байт данных устройство может передавать за раз (MaximumLength).
Необходимые данные описания устройства также включают сведения, специфичные для платформы, такие как номер шины, управляемой драйвером устройства главной шины, который назначается системой. Драйвер может получить эти сведения, вызвав IoGetDeviceProperty.
Структура DEVICE_DESCRIPTION включает в себя некоторые поля, которые могут быть неуместными для некоторых устройств или драйверов DMA. Например, поле BusNumber не используется в драйверах WDM. Каждый драйвер должен предоставлять значения для соответствующих элементов структуры и должен задать значения для всех остальных элементов равным нулю.
Драйвер подчиненного устройства не должен передавать TRUE в поле ScatterGather, если устройство не может ожидать перепрограммирования системного контроллера DMA, когда запрос нужно разбить на две или более операций DMA.
IoGetDmaAdapter возвращает указатель на объект адаптера и значение конкретного платформы или устройства, указывающее, сколько регистров карты доступно для объекта адаптера для каждой операции передачи DMA.
Возвращаемый объект адаптера содержит три поля, доступные драйверам:
Номер версии (версия)
Размер (размер)
Указатель на структуру DMA_OPERATIONS (DmaOperations)
Структура DMA_OPERATIONS состоит из таблицы указателей на функции, которые драйвер должен использовать для выполнения операций DMA на своем устройстве. Функции доступны только с помощью указателей в этой структуре данных; Драйвер не может вызывать их напрямую по имени. (Обратите внимание, что эти подпрограммы заменяют подпрограммы HalXxx , поддерживаемые в предыдущих версиях Windows NT. Чтобы обеспечить совместимость устаревших драйверов, файлы заголовков Wdm.h и Ntddk.h предоставляют макросы с устаревшими именами, но новые драйверы всегда должны вызывать функции через структуру данных.)
Количество регистров карты может варьироваться в зависимости от устройства и платформы. Как правило, HAL назначает ряд регистров карт в соответствии со следующими критериями:
По возможности HAL возвращает значение, которое на единицу больше, чем количество регистров карты, необходимых для передачи MaximumLength байтов, как указано в вызове драйвера IoGetDmaAdapter.
В противном случае HAL возвращает меньшее значение, которое максимально возможно для конкретной платформы.
Другими словами, HAL обычно дает каждому драйверу достаточно регистров карты, чтобы максимально увеличить пропускную способность DMA для своего устройства, но HAL может вернуть меньшее значение на некоторых платформах Windows. Нет гарантии, что драйвер получит количество запрашиваемых регистров карты, поэтому драйверам следует всегда проверять возвращаемое значение.
Любой драйвер устройства DMA должен предоставлять хранилище для указателя объекта адаптера и значения NumberOfMapRegisters , возвращаемого IoGetDmaAdapter. Этот указатель является обязательным параметром для подпрограмм поддержки, предоставляемых системой, используемых для DMA. Поскольку многие из этих подпрограмм поддержки должны вызываться в IRQL = DISPATCH_LEVEL, хранилище, выделенное драйвером, должно быть резидентным. Большинство драйверов DMA предоставляют необходимое хранилище в расширении устройства. Однако хранилище может находиться в расширении контроллера, если драйвер также использует объект контроллера или в непакованном пуле, выделенном драйвером. Дополнительные сведения см. в статье о выделении System-Space памяти и управлении приоритетами оборудования .
После завершения всех операций DMA драйвер вызывает PutDmaAdapter для освобождения объекта адаптера.
В следующих разделах Использование System DMA и Использование Bus-Master DMA описано, как монолитные драйверы устройств DMA используют подпрограммы поддержки для удовлетворения запросов на передачу. В этих разделах предполагается, что драйвер имеет следующее:
Стандартная подпрограмма StartIo вместо настройки и управления внутренней очередью IRPs
Внутренняя подпрограмма для разделения запросов на передачу, для которых доступно недостаточное количество регистров карты
Нет ограничений DMA для конкретного устройства
Другими словами, в этих разделах описывается наиболее простая техника выполнения операций DMA драйверами, но отдельные драйверы не обязательно используют точно такие же техники. Для любого драйвера устройства DMA, какие подпрограммы драйверов должны разделить большие запросы на передачу DMA, зависят от модели драйвера (класса или порта или монолитного), от функций устройства и от любых ограничений DMA для конкретного устройства, которые должен обрабатывать драйвер.