Вопрос 8. Общие принципы разработки драйверов в ОС Windows . Общие принципы функционирования драйверов в ОС Windows .
Добавил: | DMT |
Дата создания: | 30 декабря 2007, 18:58 |
Дата обновления: | 10 января 2008, 0:02 |
Просмотров: | 21159 последний сегодня, 1:37 |
Комментариев: | 0 |
Вопрос 8. Общие принципы разработки драйверов в ОС Windows . Общие
принципы функционирования драйверов в ОС Windows . Драйвер - системная программа, предназначенная для управления каким-либо физическим или виртуальным устройством компьютера. Фактически, пользовательские программы либо системные утилиты не могут напрямую обращаться к аппаратуре, используя порты ввода-вывода, DMA либо подобные низкоуровневые механизмы напрямую. Все программы пользователя и часть ОС работают в 3-м кольце защиты компьютера (наименее привилегированном). При этом любая команда обращения к порту из данной программы может быть замаскирована и повлечет за собой аппаратное исключение ( Exception ). Напрямую к аппаратуре может обратится программа, работающая в самом приоритетном, 0-м кольце защиты. В настоящее время практически все устройства используют технологию автоматического распределения ресурсов - Plug and Play ( PnP ). Когда новое устройство будет добавлено в систему, ему будут выделены свободные ресурсы - незадействованные линии запросов на прерывание ( IRQ ), свободные адреса портов ввода-вывода. Поэтому драйвер изначально "не знает", какие именно адреса портов и IRQ ему будут выделены - эти данные будут различными для разных компьютеров. При этом задача распределения ресурсов ложится на ОС.
Система ввода-вывода в Windows Окружение Win 2000 включает компоненты, которые работают в режиме пользователя ( User mode ) и в режиме ядра ( Kernel mode ). В режиме пользователя работают подсистема защиты, подсистема Win 32-архитектуры (обеспечивает стандартные API - вызовы Windows ), подсистема POSIX (обеспечение кроссплатформенности ). В режиме ядра работают все основные компоненты системы: диспетчер ввода-вывода ( I / O manager ), диспетчер конфигурации ( Configuration Manager ), подсистема PnP , диспетчер управления энергопотреблением ( Power Manager ), диспетчер памяти ( Memory Manager ) и прочие жизненно необходимые службы. Драйвера в Win 2000 включены в подсистему ввода-вывода. При этом драйвера тесно взаимодействуют практически со всеми компонентами ядра. Драйвера взаимодействуют с аппаратурой при помощи HAL (уровень абстракции аппаратуры). HAL - программный компонент ядра Win 2000, который обеспечивает интерфейс ядра (в том числе и некоторых драйверов) с аппаратурой. Т.к. Win 2000 - платформенно независимая система, то HAL избавляет ядро от непосредственного общения с кэшем , прерываниями, шинами ввода-вывода и большинством прочих устройств, оставляя эту работу драйверам, специально написанным для данной системы. Таким образом, ядро системы представляется набором отдельных изолированных модулей с четко определенными внешними интерфейсами.
Все драйвера NT имеют множество стандартных методов драйвера, определенных системой, и, возможно, несколько специфических методов, определенных разработчиком. Драйвера Windows 2000 используют архитектуру WDM ( Windows Driver Model ). В Windows 2000 драйвера бывают следующих типов:
В свою очередь, существует три типа драйверов ядра, каждый тип имеет четко определенные структуру и функциональность.
Драйвера Windows 2000 должны удовлетворять следующим требованиям:
Система ввода-вывода Windows 2000 имеет следующие особенности: Менеджер ввода-вывода NT представляет интерфейс для всех kernel - mode драйверов, включая драйвера физических устройств, драйвера логических устройств и драйвера файловых систем. Операции ввода-вывода послойные. Это значит, что вызов, сделанный пользователем, проходит через несколько драйверов, генерируя несколько пакетов запросов на ввод-вывод и "по пути" обращаясь к необходимым драйверам. К примеру, когда приложение пытается открыть файл, подсистема ввода-вывода Windows делает запрос к драйверу файловой системы; драйвер файловой системы обращается к промежуточному драйверу; и лишь промежуточный драйвер обращается непосредственно к винчестеру. Такая архитектура построения системы существенно повышает ее гибкость и снижает общую стоимость разработки. Системная служба Windows NT - это фоновый процесс, который может запускаться и работать без участия интерактивного пользователя. В этом смысле системные службы похожи на демоны Unix и резидентные программы MS-DOS. Как правило, системные службы стартуют при загрузке системы и продолжают работать, пока система не будет остановлена, хотя возможны запуск и остановка служб уже в процессе работы.
Основное отличие драйвера от службы заключается в том, что драйвер может работать в 0 кольце и в пользовательском режиме, а служба работает только в пользовательском режиме. Установка службы осуществляется через SCM менеджер, а драйвер через . inf файл, однако драйвер может быть установлен через SCM менеджер, но не все типы драйверов могут установлены через SCM менеджер. Второй вариант ответа на вопросДрайвер устройства является файлом PE-формата, таким же как обычные exe и dll . Только загружается и работает по другим правилам. Драйверы можно рассматривать как DLL режима ядра, предназначенные для выполнения задач не решаемых из пользовательского режима. Принципиальная разница здесь (не считая уровня привилегий) в том, что мы не сможем напрямую обращаться к драйверу, ни к его коду, ни к его данным, а будем пользоваться специальным механизмом предоставляемым диспетчером ввода-вывода ( Input / Output Manager ). Диспетчер ввода-вывода обеспечивает среду для функционирования драйверов, а также предоставляет механизмы для их загрузки, выгрузки и управления ими. Многоуровневые драйверы Большинство драйверов управляющих физическими устройствами являются многоуровневыми ( layered drivers ). Обработка запроса ввода-вывода разделяется между несколькими драйверами. Каждый выполняет свою часть работы. Например, запрос на чтение файла передается драйверу файловой системы, который, выполнив некоторые операции (например, разбиение запроса на несколько частей ), передает его "ниже" - драйверу диска, а тот, в свою очередь, отправляет запрос драйверу шины. Кроме того между этими драйверами можно добавить любое количество драйверов-фильтров (например, шифрующих данные). Выполнив запрос нижестоящий драйвер ( lower-level driver ) передает его результаты "наверх" - вышестоящему ( higher-level driver ).
Driver Development Kit Первое, что необходимо для разработки драйвера - это Комплект разработки драйверов устройств ( Windows 2000 Driver Development Kit , 2KDDK ). В этот пакет входит документация, которая содержит информацию о внутренних структурах данных и внутрисистемных функциях используемых драйверами устройств. Помимо документации в DDK входит набор библиотечных файлов (*. lib ), которые необходимы при компоновке.
Отладка драйверов Отладчики драйвера – отладчики, которые позволяют отлаживать код режима ядра. Самым лучшим выбором будет SoftICE . Или можно воспользоваться Kernel Debugger входящим в состав DDK.
Существует два метода установки драйвера:
Порядок функционирования драйвера в ОС Обычно принята двухуровневая схема организации драйверов виртуальных устройств. На самом нижнем уровне (уровень ядра операционной системы) работает собственно драйвер виртуального устройства. Который должен выполнять все операции ввода/вывода, которые может осуществлять устройство, реализовывать интерфейс IOCTL и взаимодействовать с системой. По возможности данная часть ПО должна быть небольшой и занимать минимум процессорного времени.
Рис. 1 Схема взаимодействия пользовательской программы с драйвером Второй уровень – уровень DLL, предоставляющей API прикладным программам (далее уровень API). Под API понимается набор функций, которые могут вызывать клиентские программы, для доступа к нашему виртуальному устройству. Клиентские приложения, которые желают работать с драйвером, также могут использовать интерфейс IOCTL. Третий уровень – уровень клиентских приложений он уже не относится к драйверу.
Пример простейшего драйвера: Вид файла driver.h:
Текст init.cpp:
|