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


Получение объекта адаптера

При запуске устройства драйвер, использующий системную или шину master DMA, вызывает IoGetDmaAdapter, чтобы получить указатель на объект адаптера и определить максимальное количество регистров карты, доступных для каждой операции передачи. Когда драйвер вызывает IoGetDmaAdapter, диспетчер ввода-вывода, в свою очередь, вызывает HAL, чтобы получить необходимые сведения для конкретной платформы.

Драйвер должен предоставлять определенные сведения в системной структуре DEVICE_DESCRIPTION при вызове IoGetDmaAdapter. Драйверы должны использовать RtlZeroMemory для инициализацииструктуры DEVICE_DESCRIPTION с нулями перед установкой значений в ней.

Необходимые данные включают сведения о функциях устройства водителя, например о том, является ли устройство master шины, имеет ли оно возможности точечной и сборочной информации, а также сколько байтов данных устройство может передать за раз (MaximumLength).

Необходимые данные описания устройства также содержат сведения о конкретной платформе, например номер шины, назначаемый системой, которым управляет водитель master автобуса. Драйвер может получить эти сведения, вызвав IoGetDeviceProperty.

Структура DEVICE_DESCRIPTION включает в себя некоторые поля, которые могут быть неактуальны для некоторых устройств или драйверов DMA. Например, поле BusNumber не используется в драйверах WDM. Каждый драйвер должен предоставлять значения для соответствующих элементов структуры и устанавливать значения для всех остальных элементов равным нулю.

Драйвер подчиненного устройства не должен передавать значение TRUE в поле ScatterGather , если устройство не может ожидать перепрограммы контроллера DMA системы, когда запрос должен быть разбит на две или более операции DMA.

IoGetDmaAdapter возвращает как указатель на объект адаптера, так и значение для конкретной платформы или устройства, указывающее, сколько регистров карты доступно с объектом адаптера для каждой операции передачи DMA.

Возвращенный объект адаптера содержит три поля, доступные для драйверов:

Структура 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 , чтобы освободить объект адаптера.

В следующих разделах Использование системных DMA и Использование Bus-Master DMA) описывается, как монолитные драйверы устройств DMA используют подпрограммы поддержки для удовлетворения запросов на передачу. В этих разделах предполагается, что драйвер имеет следующие компоненты:

  • Стандартная подпрограмма StartIo , а не настройка внутренней очереди IRP и управление ею

  • Внутренняя подпрограмма для разделения запросов на передачу, для которой доступно недостаточное количество регистров карты

  • Нет ограничений DMA для конкретных устройств

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