Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Для каждого устройства, подключенного к системе и поддерживаемого определенным драйвером, драйвер может использовать следующие сочетания очередей ввода-вывода и обработчиков запросов:
Одна очередь ввода-вывода по умолчанию и один обработчик запросов EvtIoDefault. Фреймворк будет доставлять все запросы устройства в очередь по умолчанию, вызывая обработчик EvtIoDefault драйвера для доставки каждого запроса драйверу.
Одна очередь ввода-вывода по умолчанию и несколько обработчиков запросов, таких как EvtIoRead, EvtIoWrite и EvtIoDeviceControl. Платформа будет доставлять все запросы устройства в очередь по умолчанию. Он вызовет обработчик EvtIoRead драйвера для доставки запросов на чтение, обработчик EvtIoWrite для доставки запросов на запись и обработчик EvtIoDeviceControl для доставки запросов на управление устройствами.
Несколько очередей ввода-вывода, например один для запросов на чтение и другой для запросов на запись. Для каждой очереди драйвер предоставляет только один обработчик запросов, так как очередь получает только один тип запроса.
Несколько очередей ввода-вывода, каждый из которых содержит несколько обработчиков запросов.
Некоторые примеры сценариев включают следующее:
Одна последовательная очередь ввода-вывода
Если вы пишете драйвер функции для диска, который может выполнять только операции чтения и записи запросов только за один раз, драйвер функции должен иметь только одну очередь ввода-вывода на устройство.
Драйвер может использовать очередь ввода-вывода по умолчанию, созданную платформой, когда драйвер вызывает WdfIoQueueCreate и задает DefaultQueueзначение TRUEв структуре WDF_IO_QUEUE_CONFIG очереди. В структуре WDF_IO_QUEUE_CONFIG драйвер также должен указать следующее:
WdfIoQueueDispatchSequential в качестве метода диспетчеризации, поэтому очередь ввода-вывода по умолчанию доставляет запросы ввода-вывода драйверу синхронно.
Единственная функция обратного вызова событий EvtIoDefault, которая будет обрабатывать все запросы ввода-вывода.
Каждый раз, когда запрос ввода-вывода доступен в очереди ввода-вывода драйвера по умолчанию, платформа будет доставлять запрос драйверу, вызвав обработчик запроса EvtIoDefault драйвера. Если другой запрос становится доступным в очереди, платформа не будет доставлять его до тех пор, пока драйвер не вызовет WdfRequestComplete для ранее доставленного запроса.
Несколько последовательных очередей ввода-вывода и очереди ручного ввода-вывода
Рассмотрим устройство последовательного порта со следующими характеристиками:
Она может одновременно выполнять одну операцию чтения и одну операцию записи.
Она не может выполнять несколько операций чтения или записи асинхронно.
Он может получать запросы на управление вводом/выводом устройств для получения сведений о состоянии. Драйвер устройства может занять много времени, чтобы завершить некоторые из этих запросов (например, запрос на ожидание изменения состояния).
Драйвер функции для этого устройства может использовать несколько последовательных очередей ввода-вывода на одно устройство. Драйвер вызывает WdfIoQueueCreate три раза: один раз для создания очереди по умолчанию и дважды для создания двух дополнительных очередей ввода-вывода. В структуре WDF_IO_QUEUE_CONFIG для каждой из этих очередей драйвер должен указать:
WdfIoQueueDispatchSequential в качестве метода диспетчеризации для каждой очереди, чтобы платформа отправляла запросы ввода-вывода драйверу синхронно.
Другой обработчик запросов для каждой очереди (EvtIoDefault, EvtIoRead и EvtIoWrite), который получит запросы ввода-вывода очереди.
После вызова WdfIoQueueCreate драйвер может вызвать WdfDeviceConfigureRequestDispatching дважды, чтобы перенаправить все запросы на чтение в одну из дополнительных очередей и все запросы на запись в другую.
В этой конфигурации функция обратного вызова EvtIoDefault очереди ввода-вывода устройства по умолчанию будет получать только запросы управления вводом-выводом устройства для получения информации о состоянии.
Если драйвер должен долго хранить запрос состояния, он может создать четвертую очередь и указать WdfIoQueueDispatchManual в качестве метода диспетчеризации. Когда драйвер получает запрос на получение сведений о том, что он должен ждать, он может поместить запрос в эту дополнительную очередь до тех пор, пока сведения о состоянии не будут доступны. Затем драйвер может получить запрос из очереди и завершить его. В то же время очередь по умолчанию может доставлять еще один запрос драйверу.
Одна очередь параллельных операций ввода-вывода
Контроллеры дисков IDE могут перекрывать некоторые операции ввода-вывода, но не другие. Например, когда контроллер обрабатывает операцию чтения или записи на одном диске, она может отправить команду поиска на другой диск. С другой стороны, несколько одновременных команд чтения и записи не поддерживаются.
Драйвер функции для этого контроллера должен проверять каждый запрос ввода-вывода. Если драйвер получает команду поиска, он должен определить, может ли быть обработана команда поиска. Команда поиска не может обрабатываться, если:
Указанный диск уже занят.
Диск отформатирован и, следовательно, никакие другие диски не могут быть активными.
Для каждого устройства, подключенного к контроллеру, драйвер может вызвать WdfIoQueueCreate , чтобы создать очередь ввода-вывода по умолчанию. В структуре WDF_IO_QUEUE_CONFIG для каждой из этих очередей драйвер должен указать:
WdfIoQueueDispatchParallel в качестве метода диспетчеризации для каждой очереди, чтобы платформа отправляла запросы ввода-вывода драйверу асинхронно.
Функция обратного вызова событий EvtIoDefault для каждой очереди, получающая запросы ввода-вывода данной очереди.
С этой конфигурацией для каждого устройства назначается одна параллельная очередь ввода-вывода. Драйвер должен проверить каждый запрос ввода-вывода, который платформа доставляет из каждой очереди ввода-вывода. Если драйвер может немедленно обработать запрос, он делает это. В противном случае драйвер вызывает WdfIoQueueStop, что приводит к остановке доставки запросов, пока драйвер не вызывает WdfIoQueueStart.
Несколько параллельных очередей ввода-вывода
Адаптер узла SCSI — это пример устройства, поддерживающего асинхронные, перекрывающиеся операции ввода-вывода. К адаптеру можно подключить до 32 устройств. Рассмотрим систему со следующей конфигурацией:
Некоторые устройства, подключенные к адаптеру SCSI, поддерживают "повторное выделение", а некоторые — нет. Если устройство SCSI поддерживает повторное выделение, то во время операции ввода-вывода устройство может временно освободить адаптер, чтобы адаптер может обслуживать другое устройство. Первое устройство позже переизбирает себя, чтобы завершить работу.
Адаптер SCSI использует аппаратные почтовые ящики для передачи запросов и ответов между драйвером и устройствами. Если устройство готово к запросу, но нет доступных почтовых ящиков, устройство должно ждать.
Чтобы повысить производительность, драйвер-функция для этого адаптера узла SCSI должен получать запросы ввода-вывода из платформы сразу после их доступности. Драйвер должен проверить каждый запрос и определить, может ли он быть запущен немедленно или должен быть отложен до тех пор, пока устройство и ресурсы (например, память почтового ящика) будут доступны.
Драйвер, вероятно, должен использовать несколько параллельных очередей ввода-вывода. Для каждого устройства, подключенного к адаптеру, драйвер вызовет WdfIoQueueCreate , чтобы создать очередь ввода-вывода по умолчанию. В структуре WDF_IO_QUEUE_CONFIG для каждой из этих очередей драйвер должен указать:
WdfIoQueueDispatchParallel в качестве метода диспетчеризации для каждой очереди, чтобы платформа отправляла запросы ввода-вывода драйверу асинхронно.
Функция обратного вызова события EvtIoDefault для каждой очереди, которая будет обрабатывать её запросы ввода-вывода.
Функция обратного вызова EvtIoDefault каждой очереди ввода-вывода должна проверять запросы ввода-вывода очереди, так как они доставляются, и определить, можно ли обслуживать каждую из них немедленно. Если доступны ресурсы устройства и системы, драйвер запускает операцию ввода-вывода. Если устройство или ресурсы недоступны, драйвер должен вызвать WdfIoQueueStop , чтобы остановить доставку дополнительных запросов до тех пор, пока текущий объект не будет обработан.
При необходимости драйвер может вызвать WdfIoQueueCreate , чтобы создать дополнительные очереди для каждого устройства. Затем драйвер может вызвать WdfRequestForwardToIoQueue, чтобы перенаправить определённые типы запросов в дополнительные очереди. Когда платформа отправляет запросы из дополнительной очереди, драйвер может вызвать WdfIoQueueStop, если это необходимо, вместо очереди по умолчанию, тем самым минимизируя число или тип запросов, для которых отложена доставка.