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


Управление методами доступа к буферу в драйверах UMDF

Если вы пишете драйвер UMDF, можно указать настройки для метода доступа к буферу , который фреймворк использует для запросов на чтение и запись, а также запросы управления вводом-выводом устройства. Значения, предоставляемые драйвером UMDF, являются только предпочтениями и не гарантируются для использования платформой.

указание предпочтительного метода доступа к буферу

Начиная с UMDF версии 2.0 драйвер UMDF вызывает WdfDeviceInitSetIoTypeEx, чтобы зарегистрировать предпочтительный метод доступа для запросов на чтение и запись и запросы управления устройствами.

Если драйвер не вызывает WdfDeviceInitSetIoTypeEx, UMDF использует буферизированный метод для запросов ввода-вывода на это устройство.

Платформа использует следующие правила, чтобы определить, какой метод доступа следует использовать:

  • Все драйверы UMDF в стеке драйверов должны использовать тот же метод для доступа к буферам устройства, а платформа предоставляет предпочтение буферизованному вводу-выводу.

    Если UMDF определяет, что некоторые драйверы предпочитают буферизацию ввода-вывода или прямые операции ввода-вывода для устройства, а другие драйверы предпочитают только буферизацию ввода-вывода для устройства, UMDF использует буферный ввод-вывод для всех драйверов. Если один или несколько драйверов стека предпочитают только буферизацию ввода-вывода, а другие предпочитают только прямой ввод-вывод, UMDF регистрирует событие в системном журнале событий и не запускает стек драйверов.

    Драйвер может вызывать WdfDeviceGetDeviceStackIoType для определения методов доступа к буферу, назначенных UMDF запросам на чтение и запись, а также запросам управления вводом-выводом устройства.

  • В некоторых случаях UMDF назначает прямой ввод-вывод устройству, но для оптимальной производительности использует буферный ввод-вывод для одного или нескольких запросов устройства. Например, UMDF использует буферный ввод-вывод для небольших буферов, если он может скопировать данные в буфер драйвера быстрее, чем он может сопоставить буферы для прямого доступа.

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

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

  • Для запросов управления ввода-вывода устройства UMDF использует прямой ввод-вывод только в том случае, если код управления ввода-вывода (IOCTL) задает прямой ввод-вывод и только если все драйверы UMDF для этого устройства вызвали WdfDeviceInitSetIoTypeEx для указания метода прямого доступа.

Получение метода доступа для запроса ввода-вывода

Драйверы используют тот же набор методов объекта запроса для доступа к буферам данных независимо от метода доступа к буферу. Поэтому большинству драйверов обычно не нужно знать, использует ли UMDF буферный ввод-вывод или прямой ввод-вывод для запроса ввода-вывода.

В некоторых случаях можно улучшить производительность драйвера, если вы знаете метод доступа для запроса ввода-вывода. Например, рассмотрим устройство с высокой пропускной способностью, которое обычно использует прямой ввод-вывод. Когда драйвер получает запрос ввода-вывода, он копирует данные из общего буферного пространства в локальную память драйвера для проверки.

Однако драйвер может иногда получать буфер, использующий буферный ввод-вывод. Так как диспетчер ввода-вывода уже копировал эти данные в промежуточный буфер, драйвер не должен копировать параметры локально. Избегая операции копирования, драйвер повышает производительность.

Драйвер UMDF вызывает WdfRequestGetEffectiveIoType для получения метода доступа к буферу запроса ввода-вывода. Как описано выше, тип ввода-вывода для конкретного запроса может отличаться от параметров типа ввода-вывода, назначенных платформой для устройства.

преобразование из состояния, которое не является ни буферизованным вводом-выводом, ни прямым вводом-выводом

Драйвер UMDF не может использовать метод «ни один».

Однако определения некоторых кодов управления ввода-вывода устройств (IOCTLs) указывают, что запросы используют метод "ни один". При необходимости драйвер UMDF может преобразовать метод доступа к буферу таких запросов управления ввода-вывода устройства в буферные операции ввода-вывода или прямые операции ввода-вывода. Выполните следующие действия.

  1. Включите директиву UmdfMethodNeitherAction в раздел INF DDInstall INF-файла драйвера. Можно задать значение директивы, чтобы указать, что UMDF должен передавать драйверу запросы управления вводом-выводом (I/O) устройством, которые используют метод доступа "neither". (В противном случае UMDF завершает эти запросы ввода-вывода со значением состояния ошибки.)

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

Включайте поддержку запросов IOCTL, использующих метод "ни то, ни другое," только в том случае, если вы уверены, что UMDF может преобразовать метод доступа в буферный ввод-вывод или прямой ввод-вывод. Например, если IOCTL задает настраиваемый запрос, который не соответствует правилам спецификации буфера, описанным в разделе Описания буферов для кодов управления ввода-вывода, UMDF не может преобразовать буферы.