Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этой статье рассматривается идея о том, что driver Framework (KMDF) Kernel-Mode можно рассматривать как универсальную модель пары драйверов.
Заметка
Прежде чем читать эту тему, следует понять идеи, представленные в минидрайверах и парах драйверов.
На протяжении многих лет корпорация Майкрософт создала несколько моделей драйверов для конкретных технологий, которые используют эту парадигму:
- Драйвер разделен на две части: один, обрабатывающий общую обработку и обрабатывающий обработку, относящуюся к конкретному устройству.
- Общая часть, называемая Платформой, написана корпорацией Майкрософт.
- Конкретный фрагмент, называемый драйвером KMDF, может быть написан корпорацией Майкрософт или независимым поставщиком оборудования.
Часть фреймворка пары драйверов выполняет задачи, характерные для различных драйверов. Например, платформа может обрабатывать очереди запросов ввода-вывода, синхронизацию потоков и большую часть обязанностей управления питанием.
Платформа владеет таблицей отправки драйвера KMDF, поэтому при отправке пакета запросов ввода-вывода (IRP) в пару (драйвер KMDF, Framework) IRP переходит в Платформу. Если платформа может обрабатывать IRP самостоятельно, драйвер KMDF не участвует. Если платформа сама по себе не может обрабатывать IRP, она получает помощь путем вызова обработчиков событий, реализованных драйвером KMDF. Ниже приведены некоторые примеры обработчиков событий, которые могут быть реализованы драйвером KMDF.
- EvtDevicePrepareHardware
- EvtIoRead
- EvtIoDeviceControl
- EvtInterruptIsr
- EvtInterruptDpc
- EvtDevicePnpStateChange
Например, драйвер контроллера узла USB 2.0 содержит определенную часть с именем usbehci.sys и общую часть с именем usbport.sys. Usbehci.sys, который называется драйвером Минипорта USB 2.0, имеет код, характерный для контроллеров узла USB 2.0. Usbport.sys, который называется драйвером USB-порта, имеет общий код, который применяется как к USB 2.0, так и к USB 1.0. Пара драйверов (usbehci.sys, usbport.sys) объединяется для формирования одного драйвера WDM для контроллера узла USB 2.0.
Пары драйверов (конкретных, общих) имеют различные имена в разных технологиях устройств. Большинство драйверов, относящихся к устройству, имеют префикс мини-. Общие драйверы часто называются драйверами портов или классов. Ниже приведены некоторые примеры пар (конкретных, общих):
- (драйвер минипорта отображения, драйвер дисплейного порта)
- (драйвер USB минипорт, драйвер порта USB)
- (драйвер миникласса батареи, драйвер класса батареи)
- (минидрайвер HID, драйвер класса HID)
- (драйвер минипорта хранилища, драйвер порта хранилища)
По мере разработки более и более моделей пар драйверов стало трудно отслеживать все различные способы написания драйвера. Каждая модель имеет собственный интерфейс для взаимодействия между драйвером для конкретного устройства и общим драйвером. Объем знаний, необходимых для разработки драйверов для одной технологии устройства (например, аудио), может сильно отличаться от объема знаний, необходимых для разработки драйверов для другой технологии устройства (например, хранилища данных).
Со временем разработчики поняли, что было бы хорошо иметь единую модель для пар драйверов в режиме ядра. Платформа драйверов в режиме ядра (KMDF), которая была впервые доступна в Windows Vista, отвечает этим требованиям. Драйвер, основанный на KMDF, использует парадигму, аналогичную многим моделям пар драйверов для конкретной технологии.
- Драйвер разделен на две части: один, обрабатывающий общую обработку и обрабатывающий обработку, относящуюся к конкретному устройству.
- Общий фрагмент, написанный корпорацией Майкрософт, называется платформой.
- Конкретный фрагмент, написанный корпорацией Майкрософт или независимым поставщиком оборудования, называется драйвером KMDF.
Драйвер контроллера узла USB 3.0 является примером драйвера на основе KMDF. В этом примере оба драйвера в паре написаны корпорацией Майкрософт. Общий драйвер — платформа, а драйвер для конкретного устройства — драйвер контроллера узла USB 3.0. На этой схеме показан узел устройства и стек устройств для контроллера узла USB 3.0.
На схеме Usbxhci.sys является драйвером контроллера узла USB 3.0. Оно связано с Wdf01000.sys, который является фреймворком. Пара (usbxhci.sys, wdf01000.sys) формирует один драйвер WDM, который служит драйвером функции для контроллера узла USB 3.0. Обратите внимание, что пара драйверов занимает один уровень в стеке устройств и представлена одним объектом устройства. Один объект устройства, представляющий пару (usbxhci.sys, wdf01000.sys) — это функциональный объект устройства (FDO) для контроллера узла USB 3.0.
В паре «драйвер KMDF и фреймворк» платформа обрабатывает задачи, которые являются общими для драйверов, работающих в режиме ядра. Например, платформа может обрабатывать очередь запросов ввода-вывода, синхронизацию потоков, большую часть задач Plug and Play и большую часть задач управления питанием. Драйвер KMDF обрабатывает задачи, требующие взаимодействия с определенным устройством. Драйвер KMDF участвует в обработке запросов, регистрируя обработчики событий, которые вызывает платформа по мере необходимости.