Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ДП.docx
Скачиваний:
11
Добавлен:
23.09.2019
Размер:
4.64 Mб
Скачать

3 Технологический раздел

3.1 Технология разработки драйверов для операционных систем семейства Windows

3.1.1 Архитектура Windows Driver Model

Ни для кого не секрет, что тема драйверов достаточно объемная и сложная, поэтому мы не будем уходить в «дебри» системного низкоуровнего программирования, а рассмотрим лишь в общих чертах особенности драйверных моделей. А для большей наглядности, рассмотрим архитектуру WDM на небольшом примере.

Допустим, програм­ме пользовательского режима потребовалось прочитать данные с устройства. Она вызывает функцию API ReadFile, к примеру. Модуль подсистемы - такой как KERNEL32.DLL - реализует вызов, передавая его к низ­коуровневой функции API NtReadFile [3.1]. Низкоуровневый API – довольно важная составляющая WDM да и архитектуры Windows в целом, но о нем чуть позже.

Такие функции, как, например, NtReadFile, является частью системного компонента, на­зываемого менеджером ввода/вывода (I/O Manager). Следует иметь ввиду, что в самой системе не существует конкретного исполняемого модуля с таким именем. Тем не менее, нам потребуется какое-то название для обозначения «облака» функций опера­ционной системы, окружающего драйвер.

В рассматриваемом примере с ReadFile функция NtReadFile создает IRP с основным кодом функ­ции IRP_MJ_READ. Дальнейшее может различаться в деталях, но чаще всего та­кие функции, как NtReadFile, возвращают управление вызывающей стороне поль­зовательского режима [3.1].

А теперь немного поводу низкоуровнего API. Низкоуровневый API представляет интерфейс, который позволяет «клиентским» приложениям обращаться к программам (в данном контексте - драйверам) режима ядра. Дело в том, что каждая точка входа данного API является тонкой оберткой для функции режима ядра. Все они проверяют свои параметры, предотвращая возможные дефекты безопас­ности. Сам вызов использует платформенно-зависимый интерфейс для передачи управления через границу пользовательского режима/режима ядра (например, инструкции ассемблера и т.п.). Функции низкоуровнего API работают в режиме ядра и обслуживают запросы приложений на обращение к устройству. Как правило, они создают структуру данных, называемую пакетом запроса ввода-вывода, или IRP (I/O Request Packet), и передают ее в точке входа некоторому драйверу устройства.

Для выполнения запроса IRP драйверу, в конечном счете, потребу­ется обратиться к своему устройству. Драйверы, хотя они и работают в режиме ядра и могут напрямую общаться с оборудованием, используют сред­ства прослойки HAL (Hardware Abstraction Layer) для обращения к оборудова­нию. Функции HAL используют платформенно-зависимую реализацию для выполнения операций. Закончив операцию ввода/вывода, драйвер завершает обработку IRP, вызывая соответствующую функцию режима ядра. Завершение является последним эта­пом обработки IRP и позволяет ожидающему приложению продолжить работу. Для большей наглядности рекомендую обратиться к рисунку 3.1.

Рисунок 3.1 – Схема работы драйверов WDM

Вот, собственно, по такому принципу и работают драйверы WDM. Конечно, то, что мы рассмотрели, это, примерно, сотая часть архитектуры WDM и всего того, что с ней связано. Однако, в рамках данного раздела, надеюсь, вполне достаточно.

Итак, вот несколько ключевых особенностей драйверной модели WDM [3.2]:

  • Совместимость на уровне двоичных кодов между драйверами для Windows 98 и NТ;

  • Поддержка управления питанием (power management), что дает системе возможность осуществления энергосбережения путем выборочного отключения питания нескольких или всех устройств в системе;

  • Поддержка Plug and Play;

  • Поддержка "продвинутого" шинного управления (advanced bus management);

  • Единая обработка операций ввода/вывода посредством общей структуры данных - IRP (в Windows 98/Ме существовали серьезные различия в работе с дисками, коммуникационными портами, клавиатурами и т. д.).