Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ПЗ_А.Парамонов.doc
Скачиваний:
18
Добавлен:
08.09.2019
Размер:
7.82 Mб
Скачать

2.3.3.Специальные файлы устройств

Существует два типа устройств – символьные (обращение к которым может осуществляться посимвольно) и блочные (обращение к которым может осуществляться только блоками фиксированного размера) [15]. Доступ к данным устройствам осуществляется через специальные файлы, расположенные в папке /dev. Тип устройства можно определить по символу в строке доступа к файлу («c» для символьных и «b» для блочных). Кроме того среди атрибутов этих специальных файлов можно обнаружить два числа, называемые минорным и мажорным номерами устройства. Мажорный номер определяет драйвер, который будет вызван при применении системных вызовов к данному файлу. Минорный номер используется самим драйвером для идентификации устройства, с которым осуществляется работа в данный момент. Создание специальных файлов с заданными минорным и мажорным номерами осуществляется с помощью команды mknod, которая позволяет задать все необходимые параметры.

2.3.4.Структура, инициализация и выгрузка драйверов

Регистрация драйвера устройства (т.е. его связь с определенным специальным файлом в папке /dev) осуществляется при инициализации загрузочного модуля (в рамках функции с атрибутом __init). Аналогично, при выгрузке модуля регистрация удаляется (в рамках функции c атрибутом __exit).

Драйвер устройства определяет набор системных вызовов для данного устройства. При этом часть системных вызовов может быть не определена. Драйвер может определять следующие системные вызовы:

  • lseek – изменение и получение текущей позиции в файле;

  • read – чтение данных из устройства;

  • write – запись данных в устройство;

  • poll – определения состояния устройства;

  • ioctl – управление устройством с помощью набора специальных команд;

  • open – инициализация устройства и получение файлового дескриптора;

  • close – завершение работы с устройством.

Примеры драйверов устройств могут быть найдены в приложении Error: Reference source not foundError: Reference source not foundError: Reference source not foundError: Reference source not found3.

2.3.5.Отладка драйверов

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

В отличие от обычного вывода, функция printk позволяет классифицировать выводимые сообщения. Виды классификаций представляют собой обычные строки, добавляемые в начало выводимого сообщения. Например: «printk( KERN_DEBUG"Message" )». Возможные виды классификаций:

  • KERN_EMERG – экстренные сообщения;

  • KERN_ALERT – действие должно быть предпринято немедленно;

  • KERN_CRIT – возникновение критических условий;

  • KERN_ERR – ошибка выполнения;

  • KERN_WARNING – ошибка выполнения;

  • KERN_NOTICE – замечения;

  • KERN_INFO – информационные сообщения;

  • KERN_DEBUG – отладочные сообщения;

Включение и выключение определенного вида сообщений осуществляется с помощью флагов компиляции.

Не смотря на удобство функции printk, многократное ее использование замедляет работу драйвера, т.е. негативно сказывается на производительности.