Взаимодействие пользовательской программы с драйвером устройства

March 22, 2012 by admin Комментировать »

Приложение пользователя, работающее в Windows, может взаимодействовать с устрой ством через исполнительный уровень, на котором работают важные системные службы, по средством  обращения  к функциям  интерфейса прикладного  программирования  (функции

WINAPI), которые  включены  в некоторые библиотеки динамической компоновки,  например, в kernel32.dll.  Здесь нужно отметить следующий важный момент: все устройства, с которыми взаимодействует  операционная  система, представлены  в ней как  файлы, причем это относит ся не только к файлам в их традиционном представлении как  об определенным образом скомпонованным группам данных на жестком диске, но и ко всем аппаратным устройствам. Так, например, параллельный порт ПК в операционной системе Windows может быть пред ставлен  как   файл  с  именем   «LPT1», последовательному порту может  быть присвоено имя

«COM1» и  т.  д.  Рассмотрим,  например,   как   осуществляется  взаимодействие программы пользователя с печатающим устройством, присоединенным к порту LPT1.

Это очень важный  момент в нашем рассуждении  для понимания  всего  последующего  мате риала. Предположим, нам нужно напечатать из нашей программы символ на принтере. Схема взаимодействия приложения и устройства печати в упрощенном виде показана  на рис. 7.3:

Рис. 7.3

Взаимодействие программы пользователя и устройства печати

Схема взаимодействия  пользовательского  приложения  и  устройства ввода вывода (принтера) является весьма показательной и относится ко всем устройствам операционной системы. Первое, что должна сделать программа,  перед тем как  выполнять операции ввода вывода с устройством – открыть его, что и выполняет системная функция CreateFile() (1). Эта функция всегда должна выполняться при обращении к объекту файловой системы, будь то дисковый  файл или устройство ввода вывода. В качестве первого  параметра эта функция принимает имя устройства (в данном примере, это «LPT1») . Эта функция относится к приклад ному интерфейсу программирования (так называемому интерфейсу WINAPI), который  являет ся своеобразным  мостом между приложением  пользователя  и системой. Здесь есть один важный нюанс – функции WINAPI позволяют  обратиться из программы,  работающей  в режи ме пользователя, к системным функциям, работающим в режиме ядра.

В данном  случае, функция WINAPI CreateFile() обращается  к Менеджеру ввода вывода операционной системы, который находится на исполнительном уровне и формирует запросы

на ввод вывод в/из  устройство(а). Менеджер ввода вывода является важным звеном в цепи взаимодействия  приложения и устройства ввода вывода, осуществляя взаимодействие  про граммы  пользователя, с одной стороны, и устройства посредство его драйвера, с другой. Менеджер ввода вывода – это обобщенное название системных сервисов и программ, осу ществляющих формирование  стандартных пакетов  запросов  (IRP) к драйверу устройства, бу феризацию данных ввода вывода устройства и синхронизацию очередей ввода вывода.

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

На втором шаге программа должна записать байт данных в устройство печати. Это вы полняется при помощи функции WINAPI WriteFile() (2). Как  и в случае с функцией CreateFile(), цепочка обращений та же – Менеджер ввода вывода–драйвер–устройство. Разница в том, что в этом случае Менеджер ввода вывода операционной  системы формирует пакет запроса записи данных с соответствующей инициализацией  областей виртуальной памяти для пере дачи данных.

Наконец,  после окончания  работы с устройством следует закрыть  его дескриптор,  исполь зуя WINAPI функцию CloseHandle(3),  которая  закрывает  сеанс работы с устройством, удаляя дескриптор и выделенные устройству ресурсы.

Это весьма упрощенный пример взаимодействия программы пользователя и устройства ввода вывода, но все же он дает определенное представление о механизмах такого взаимо действия. Таким  образом,  для взаимодействия с  устройством ввода вывода  программа пользователя  так  или  иначе  будет использовать  функции  WINAPI CreateFile(), WriteFile(), ReadFile() и CloseHandle() или их модифицированные версии. При этом последовательность операций в простейшем цикле обмена данными так:

1)   функция CreateFile() открывает устройство ввода–вывода  (оно должно к этому мо менту существовать в системе). Результатом выполнения этой функции будет деск риптор устройства,  с которым  будут выполняться все операции обмена данными (чте ние и запись);

2)   с помощью функций ReadFile() и WriteFile() осуществляются необходимые операции (чтения/записи).  Результатом работы этих функций является количество прочитанных (ReadFile()) или записанных  (WriteFile()) байтов;

3)   по окончанию операций обмена данными с устройством дескриптор устройства нуж но закрыть функцией CloseHandle(). Таким образом, операционной системе сообща ется, что устройство более не используется и выделенные ему аппаратно программ ные ресурсы освобождаются.

Вместо функций ReadFile() и WriteFile() можно использовать  WINAPI функцию DeviceIoControl(). С помощью этой функции можно послать устройству код какой либо операции, не только за писи или чтения данных, но также любой другой код, на который устройство может реагиро вать.  Это расширяет возможности  операций  ввода вывода,  но  требует, чтобы  драйвер устройства мог обрабатывать такие коды. В наших последующих примерах мы будем исполь зовать именно функцию DeviceIoControl().

В принципе,  перечисленных  функций WINAPI вполне достаточно, чтобы ваше приложение могло работать с устройствами ввода вывода. Посмотрим теперь, как создать сам драйвер устройства и как с ним работать, но вначале немного теории.

Источник:  Магда Ю. С. Компьютер  в домашней лаборатории.  – М.: ДМК Пресс, 2008. – 200 с.: ил.

Оставить комментарий

микросхемы мощности Устройство импульсов питания пример приемника провода витков генератора выходе напряжение напряжения нагрузки радоэлектроника работы сигнал сигнала сигналов управления сопротивление усилитель усилителя усиления устройства схема теория транзистора транзисторов частоты