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


Объекты канала DMA

Примечание.

Корпорация Майкрософт поддерживает разнообразную и инклюзивное окружение. В этой статье содержатся ссылки на терминологию, которую руководство по стилю Майкрософт для обмена данными без предвзятости распознает как исключение. Слово или фраза в этой статье используется для согласованности, так как она в настоящее время отображается в программном обеспечении. При обновлении программного обеспечения для удаления языка эта статья будет обновлена для выравнивания.

Системный драйвер PortCls реализует интерфейсы IDmaChannel и IDmaChannelSlave , чтобы воспользоваться преимуществами мини-портов WaveCyclic и WavePci. IDmaChannel представляет канал DMA, а также связанные с ним параметры буфера DMA и параметров использования буфера. Кроме того, драйверы минипорта WaveCyclic используют IDmaChannelSlave для управления каналом DMA для подчиненного устройства. IDmaChannelSlave наследует от IDmaChannel. Сведения об управлении операциями DMA см. в разделе "Объекты адаптера" и "DMA".

Объект IDmaChannel инкапсулирует следующее:

  • Канал DMA для главного или подчиненного устройства

  • Буфер данных, связанный с каналом

  • Сведения, описывающие использование канала

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

Объект канала DMA можно создать для главного или подчиненного устройства:

  • Подчиненное устройство не имеет встроенных возможностей оборудования DMA и должно полагаться на системный контроллер DMA для выполнения любых передач данных, необходимых устройству.

  • Главное устройство использует собственное оборудование DMA для управления шинами для передачи данных на системной шине.

Пример устройства WaveCyclic, использующего подчиненный объект канала DMA, см. в примере звукового драйвера Sb16 в более ранних версиях комплекта драйверов Microsoft Windows (WDK). Главный объект канала DMA — это не более задней панели для обмена информацией о канале DMA между драйверами порта и мини-порта. Дополнительные сведения о главных и подчиненных устройствах см. в разделе "Введение в объекты адаптера".

Объект канала DMA для главного или подчиненного устройства предоставляет следующее:

  • Объект адаптера

  • Один общий буфер, к которому может совместно использовать драйвер и оборудование DMA.

  • Значение размера буфера, которое можно запрашивать и изменять

Объект адаптера — это структура адаптера DMA для физического объекта устройства (PDO). Объект адаптера создается автоматически, когда драйвер минипорта создает объект канала DMA, вызвав один из следующих методов:

IPortWavePci::NewMasterDmaChannel

IPortWaveCyclic::NewMasterDmaChannel

IPortWaveCyclic::NewSlaveDmaChannel

Метод IDmaChannel::GetAdapterObject можно использовать для получения указателя на объект адаптера.

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

В случае канала DMA для подчиненного устройства метод IDmaChannel::TransferCount возвращает максимальный размер передачи (параметр MapSize), указанный в вызове IDmaChannelSlave::Start. Кроме того, объект адаптера предоставляет некоторые методы для управления и запроса устройства DMA. Ни один из этих методов не имеет значения для главных каналов DMA.

IDmaChannel::AllocateBuffer и IDmaChannel::FreeBuffer используются для управления одним общим буфером, связанным с объектом канала DMA. Буфер, выделенный объектом, гарантированно доступен драйверу (с адресами виртуальной памяти ядра) и устройством DMA (с адресами физической памяти). Кроме того, буфер будет физически смежным. Как правило, лучшей стратегией является выделение буфера DMA во время инициализации минипорт-драйвера, когда физически связанная память наиболее много. IDmaChannel::AllocatedBufferSize возвращает размер буфера, как было указано в вызове IDmaChannel::AllocateBuffer.

IDmaChannel::MaximumBufferSize указывает фактический максимальный размер буфера, который можно использовать. Это может превышать выделенный размер, если выделенный размер не является даже нескольким размером страницы. Это может быть меньше выделенного размера, если устройство DMA не может поддерживать передачу выделенного размера. IDmaChannel::BufferSize и IDmaChannel::SetBufferSize используются для запроса и задания размера буфера, используемого для передачи DMA. При выделении буфера размер буфера устанавливается в максимальный размер буфера. После инициализации драйвер порта и драйвер мини-порта могут изменить размер буфера или обнаружить его текущее значение. Драйвер минипорта использует результат IDmaChannel::BufferSize для определения размера передачи операций DMA при запуске канала DMA. IDmaChannel::SystemAddress и IDmaChannel::P hysicalAddress используются для получения виртуальных и физических адресов буфера соответственно.

IDmaChannel::CopyTo и IDmaChannel::CopyFrom копирует примеры данных в буфер DMA и из нее. Драйвер порта WaveCyclic вызывает эти методы для копирования звуковых данных между буфером приложения и циклическим буфером драйвера минипорта.

Буфер DMA не обязательно используется для передачи потоковой передачи данных. В случае драйвера порта WavePci потоковые данные доставляются (или извлекаются из) минипорта в виде списка сопоставлений точечной или сборной. Однако минипорт-драйвер может по-прежнему использовать буфер DMA в качестве общего пространства памяти для взаимодействия с драйвером адаптера.

Драйверы портов предоставляют мини-драйверы с функциями, которые они могут использовать для создания каналов DMA. Если в описании драйвера порта не указано иное, не обязательно использовать объекты DMA, выделенные драйвером портов. Драйвер порта просто требует указателя на интерфейс IDmaChannel , поддерживающий необходимые методы. Проверьте документацию по каждому драйверу портов для списка методов канала DMA, необходимых драйверу порта.

Как правило, самый простой подход — использовать функции распределения каналов DMA, которые реализует драйвер порта. В редких случаях разработчикам минипорт-драйверов может потребоваться реализовать собственные объекты канала DMA для удовлетворения особых требований их конкретных адаптеров. Иногда для этого требуется реализация нового объекта. В других случаях достаточно, чтобы объект потока драйвера мини-порта предоставлял интерфейс IDmaChannel и реализовывать сами методы канала DMA.

Интерфейс IDmaChannel поддерживает следующие методы:

IDmaChannel::AllocateBuffer

IDmaChannel::AllocatedBufferSize

IDmaChannel::BufferSize

IDmaChannel::CopyFrom

IDmaChannel::CopyTo

IDmaChannel::FreeBuffer

IDmaChannel::GetAdapterObject

IDmaChannel::MaximumBufferSize

IDmaChannel::P hysicalAddress

IDmaChannel::SetBufferSize

IDmaChannel::SystemAddress

IDmaChannel::TransferCount

Интерфейс IDmaChannelSlave расширяет IDmaChannel , добавив следующие методы:

IDmaChannelSlave::ReadCounter

IDmaChannelSlave::Start

IDmaChannelSlave::Stop

IDmaChannelSlave::WaitForTC