Linux
<<  История создания Linux Работа с внешними устройствами linux  >>
Общие понятия
Общие понятия
Общие понятия
Общие понятия
Общие понятия
Общие понятия
Динамическая загрузка драйверов
Динамическая загрузка драйверов
Динамическая загрузка драйверов
Динамическая загрузка драйверов
Сборка первого драйвера
Сборка первого драйвера
Журнал сообщений ядра
Журнал сообщений ядра
Символьные драйверы Linux
Символьные драйверы Linux
Символьные драйверы Linux
Символьные драйверы Linux
Символьные драйверы Linux
Символьные драйверы Linux
Файлы символьных устройств
Файлы символьных устройств
Файлы символьных устройств
Файлы символьных устройств
Картинки из презентации «Драйверы LINUX» к уроку информатики на тему «Linux»

Автор: GUN. Чтобы познакомиться с картинкой полного размера, нажмите на её эскиз. Чтобы можно было использовать все картинки для урока информатики, скачайте бесплатно презентацию «Драйверы LINUX.ppt» со всеми картинками в zip-архиве размером 805 КБ.

Драйверы LINUX

содержание презентации «Драйверы LINUX.ppt»
Сл Текст Сл Текст
1Драйверы LINUX. 31журналирования, является журнальный файл
2Общие понятия. Строго говоря, /var/log/messages.
драйвером считается фрагмент кода 32Журнал сообщений ядра. Таким образом,
операционной системы, который позволяет ей все данные, выдаваемые командой printk, по
обращаться к аппаратуре. Не вполне умолчанию находятся в этом файле. Впрочем,
конкретный термин "аппаратура" можно изменить настройку — например,
обозначает здесь как неотъемлемые части пересылать сообщения на последовательный
компьютера (например, наборы микросхем на порт (например, /dev/ttyS0) или на все
материнских платах современных консоли, как это обычно происходит в
персональных компьютеров), так и вполне случае возникновения события KERN_EMERG.
автономные устройства (как, скажем, Сообщения теперь находятся в буфере
"древние" устройства считывания /var/log/messages, причем в нем находятся
с перфокарт, редко размещавшиеся в одной сообщения не только из ядра, но и от
комнате с процессорной стойкой). Концепция различных демонов, работающих в
драйвера как отдельного сменного модуля пользовательском пространстве. К тому же,
оформилась не сразу. Некоторые версии UNIX этот файл обычно нельзя читать от имени
и по сию пору практикуют полную обычного пользователя. Поэтому для
перекомпиляцию ядра при замене какого-либо непосредственного разбора сообщений,
драйвера, что совершенно не похоже на находящихся в кольцевом буфере ядра,
обращение с драйверами в Linux, Windows и предоставляется утилита пользовательского
MS DOS. Кстати, именно MS DOS ввела в пространства dmesg, которая выводит дамп
массовое обращение понятие драйвера, как буфера в стандартный выходной поток. На
легко сменяемой насадки, позволяющей рис.7 показаны фрагменты вывода в
моментально (сразу после очередной стандартный выходной поток.
перезагрузки) улучшить качество жизни 33Журнал сообщений ядра. Рис.7:
пользователя. Журналирование сообщений ядра.
3Общие понятия. Касаясь характерных 34Язык С ядра — чистый С. Для любой
черт драйвера (работающего с полномочиями функции ядра требуется обработка ошибок,
компонента ядра) для разных операционных как правило, возвращаемых в виде
систем - именно, Windows и Linux - целочисленного типа, причем возвращаемое
остановимся на трех неслучайных значение должно соответствовать следующему
совпадениях. Наблюдение 1. В операционных правилу. При ошибке мы возвращаем
системах MS DOS, Windows, Unix и всех отрицательное число: минус добавляется
клонах Linux принят способ работы с макросом, находящимся в заголовке ядра
драйверами как с файлами. То есть при Linux linux/errno.h, который включает в
доступе к драйверу используются функции себя заголовки различных ошибок в исходном
либо совпадающие (лексически), либо весьма коде ядра, а именно - asm/errno.h,
похожие на функции для работы с файлами asm-generic/errno.h,
(open, close, read, write, CreateFile...). asm-generic/errno-base.h. При успешном
Данный порядок неудивителен для систем завершении в случае, когда не должна
юниксоидного ряда, поскольку в них вся предоставляться некоторая дополнительная
действительность воспринимается в виде информация, наиболее распространенным
файлов (что является изначальной возвращаемым значением будет ноль. В
концепцией данной ветви операционных случае, когда возвращается положительное
систем). Например, директорию (каталог значение, то оно будет указывать
файлов) можно открыть как файл и считывать дополнительную информацию, например,
оттуда блоки данных, соответствующие количество байтов, возвращаемых функцией.
информации о каждом хранящемся в этой 35Язык С ядра — чистый С. Стандартный
директории файле. язык С является только языком
4Общие понятия. В директории /dev/ программирования. Заголовочные файлы не
можно открыть файл, соответствующий мышке являются его частью. Это часть стандартных
и считывать постепенно байты данных, библиотек, собранных для программистов на
появляющиеся в нем в точном соответствии с языке C и реализующих концепцию повторного
ее перемещениями. В Windows предлагается использования кода. Разработчики ядра
точно такой же механизм. Для доступа к разработали свой собственный набор
драйверу из своего приложение пользователь необходимых функций, которые являются
прибегает к помощи функции CreateFile. частью кода ядра. Функция printk является
Правда, имя файла, который предполагается лишь одной из них. Аналогичным образом
"открыть", выглядит странно, как многие функции, предназначенные для работы
"\\\\.\\myDevice". (Операционная со строками, функции работы с памятью и
система понимает его как символьную ссылку многое другое, являются частью исходного
для идентификации конкретного драйвера, кода ядра; они расположены различных
привлекаемого к работе.) И хотя дальнейшие директориях kernel, ipc, lib и так далее,
операции, сформулированные создателем вместе с соответствующими заголовочными
пользовательского приложения как вызовы файлами, которые находятся в директории
read()-write(), все-таки преобразуются include/linux.
операционной системой в специальные 36Символьные драйверы Linux. Нереально
запросы к драйверу, необходимо признать: за несколько лекций пересказать книгу
формально процесс похож на работу с "Драйверы устройств Linux"
файлом. Джонатана Корбета, Алессандро Рубини и
5Общие понятия. Наблюдение 2. Драйверы Грега Кроа-Хартмана (Linux Device Drivers
стали легко заменяемой запасной частью в Jonathan Corbet, Alessandro Rubini, Greg
операционной системе. Если раньше и были Kroah-Hartman). Русского перевода 3го
различия между продуктами Microsoft и издания нет, есть второй. И тем не менее
юниксоидными системами (драйверы в Все о символьных драйверах Если мы пишем
операционных системах Microsoft изначально драйверы для байт-ориентированных операций
были "подвижно-сменными", но в (или, на жаргоне языка C,
UNIX и ранних версиях Linux при их замене символьно-ориентированных операций), то мы
надо было заново выполнять перекомпиляцию называем их символьными драйверами.
ядра), то сейчас такие различия исчезли. Поскольку большинство устройств является
При сохранении некоторых особенностей байт-ориентированными, то большинство
инсталляции, драйверы теперь повсеместно драйверов устройств являются символьными
могут быть удалены/добавлены в систему драйверами.
редактированием одной записи в специальных 37Символьные драйверы Linux. Возьмем, к
системных файлах. Более того, загрузка примеру, драйверы последовательного порта,
"по требованию" (по запросу аудио драйверы, и драйверы базового
пользовательской программы) становится ввода/вывода. На самом деле, все драйверы
практически общей чертой устройств, которые не являются ни
Windows/Unix/Linux. Даже операционные драйверами устройств хранения данных, ни
системы реального времени, например, QNX драйверами сетевых устройств, будут
также используют методику сменных символьными драйверами некоторого вида.
драйверов. Давайте рассмотрим общие особенности этих
6Общие понятия. Наблюдение 3. Концепция символьных драйверов. Как показано на
существования режима ядра (с большими рис.8, для любого приложения
функциональными возможностями и пользовательского пространства,
относительной бесконтрольности) и предназначенного для работы с
пользовательского режима (с жестким байт-ориентированным устройством (в
контролем со стороны системы) присутствует пространстве аппаратных средств), следует
в Windows/Unix/Linux с незапамятных использовать соответствующий драйвер
времен. Если внимательно посмотреть на то, символьного устройства (в пространстве
как в Linux реализуется драйвер, то ядра). Использование символьных драйверов
увидим, что это всего лишь модуль ядра, осуществляется через соответствующие файлы
который имеет некое (дополнительное) символьных устройств, которые
отражение в виде файла в директории /dev/. прикомпонованы к виртуальной файловой
Если посмотреть теперь на драйвер (режима системе (VFS).
ядра) в операционной системе Windows, то 38Символьные драйверы Linux. Рис.8:
становится понятно: это не просто драйвер, Общий взгляд на символьный драйвер.
это возможность войти в режим ядра со 39Символьные драйверы Linux. Это
своим программным кодом. Завершая означает, что приложение выполняет обычные
мини-экскурс в сравнительный анализ файловые операции с файлом символьного
драйверов разных популярных ОС, нельзя не устройства. Эти операции будут
упомянуть и об общем для всех систем перетранслированы виртуальной файловой
механизме воздействия на драйвер при системой VFS в соответствующие функции в
помощи IOCTL запросов. прикомпонованном драйвере символьного
7Общие понятия. Итак, драйвер устройства. Затем для того, чтобы получить
управляет, контролирует, следит за работой нужные результаты, с помощью этих функций
объекта, который подчиняется командам осуществляется окончательный
драйвера. Драйвер шины управляет работой низкоуровневый доступ к реальному
шины, драйвер устройства управляет работой устройству. Обратите внимание, что если
устройства (частью оборудования, приложение выполняет обычные файловые
подключенного к компьютеру), например, операции, их результат не должен
мышью, клавиатурой, монитором, жестким отличаться от обычных случаев. Просто для
диском и многим другим. Управление того, чтобы выполнить эти операции, в
определенной частью аппаратных средств драйвере устройства будут использоваться
может осуществляться некоторой частью соответствующие функции. Например,
программного обеспечения (драйвером операция записи с последующей операцией
устройства), или может осуществляться чтения может, в отличие от работы с
другим устройством, управление которым, в обычными файлами, не получить то, что
свою очередь, может выполняться программой только что было записано в файл
— драйвером устройства. В последнем символьного устройства.
случае, такое управляющее устройство 40Символьные драйверы Linux. Помните,
обычно называется контроллером устройств. что это обычное явление для файлов
Для него, поскольку оно само является устройств. Давайте в качестве примера
устройством, необходим драйвер, который возьмем файл аудио устройства. То, что мы
обычно называют bus driver или драйвер записываем в него, является аудиоданными,
шины. которые мы хотим воспроизвести, скажем,
8Общие понятия. К числу примеров через громкоговоритель. Однако при чтении
контроллеров устройств относятся данных мы получим аудио данные, которые мы
контроллеры жестких дисков, контроллеры записываем, например, через микрофон.
дисплеев и контроллеры аудиоустройств, с Записанные данные не обязательно должны
помощью которых осуществляется управление быть теми, которые мы воспроизводили. В
устройствами, подключаемыми к этом полном подключении из приложения к
контроллерам. В качестве более подробных устройству участвуют следующие четыре
технических примеров можно рассмотреть основных компонента: Приложение Файл
контроллер IDE, контроллер PCI, символьного устройства Драйвер символьного
USB-контроллер, контроллер SPI, контроллер устройства Символьное устройство.
I2C и т.д. Графически, вся эта концепция 41Символьные драйверы Linux. Приложение
может быть изображена так, как показано на подключается к файлу устройства при помощи
рис.1. Контроллеры устройств, как правило, системного вызова open, открывающего файл
подключаются к процессору через шины, устройства. Файлы устройств подключаются к
имеющие определенное название (набор драйверу устройства с помощью специального
физических линий подключения) - например, механизма регистрации, что осуществляется
шина PCI, шина IDE, и т.д. В современном драйвером. Драйвер связывается с
мире встроенных технологий мы чаще устройством с помощью специальных
сталкиваемся с микроконтроллерами, а не низкоуровневых операций, характерных для
процессорами; это те же самые процессоры и конкретного устройства. Таким образом, мы
плюс контроллеры различных устройств, формируем полное соединение. При этом,
реализованные на одном чипе. В таких обратите внимание, что файл символьного
случаях шины интегрированы в сам чип. устройства не является реальным
Меняет ли это что-либо для драйверов или, устройством, это просто специальная
в более общем случае, в используемом методика (place-holder) подключения
программном обеспечении? реального устройства. Старший и младший
9Общие понятия. Рис.1: Взаимодействие номера файлов устройств При подключении
устройств и драйверов. приложения к файлу устройства используется
10Общие понятия. Ответ на этот вопрос не имя файла устройства. Но при подключении
так уж сложен — разве что драйверы шин для файла устройства к драйверу устройства
контроллеров соответствующих встроенных используется номер файла устройства, а не
устройств будут теперь разрабатываться под имя файла.
зонтиком конкретной архитектуры. Драйверы 42Символьные драйверы Linux. В
состоят из двух частей В драйверах шин результате приложение пользовательского
предоставляются специальные аппаратные пространства может использовать для файла
интерфейсы для соответствующих аппаратных устройства любое имя, а в пространстве
протоколов оборудования и эти драйверы ядра для связи между файлом устройства и
являются самыми нижними горизонтальными драйвером устройства можно использовать
программно реализуемыми слоями тривиальный механизм индексации. Таким
операционной системы (ОС). Над ними номером файла обычно является пара
расположены драйверы конкретных устройств. <major, minor>, то есть старший и
Они работают с лежащими ниже устройствами младший номера файла устройства. Ранее
через горизонтальный слой интерфейсов и (вплоть до ядра 2.4) каждый старший номер
разрабатываются для каждого конкретного использовался в качестве указания на
устройства. Тем не менее, сама идея отдельный драйвер, а младший номер
написания таких драйверов позволяет использовался для указания на конкретное
предоставить пользователю абстрагированный подмножество функциональных возможностей
доступ и, тем самым, реализовать на другом драйвера. В ядре 2.6 такое использование
"конце" интерфейс (который будет номеров не является обязательным; с одним
варьироваться в зависимости от ОС). и тем же старшим номером может быть
11Общие понятия. Короче говоря, драйвер несколько драйверов, но, очевидно, с
устройства состоит из двух частей, одна из различными диапазонами младших номеров.
которых а) является специфической для 43Символьные драйверы Linux. Стандартные
конкретного устройства, а другая б) старшие номера обычно резервируются для
является специфической для ОС. Смотрите вполне определенных конкретных драйверов.
рис.2. Часть драйвера устройства, Например, 4 — для последовательных
характерная для конкретного устройства, интерфейсов, 13 - для мышей, 14 — для
будет одной и той же во всех операционных аудио-устройств и так далее. С помощью
системах и в большей мере она связана с следующей команды можно будет выдать
анализом и пониманием спецификаций список файлов различных символьных
устройства, а не с программированием. устройств, имеющихся в вашей системе: $ ls
Спецификации устройства представляют собой -l /dev/ | grep "^c"
документ, в котором описываются Использование чисел <major, minor> в
технические особенности устройства, в том ядре 2.6 Тип (определен в заголовке ядра
числе его функционирование, пропускную linux/types.h): dev_t - содержит старший и
способность, программирование и т.д. - в младший номера Макрос (определен в
общем, это - руководство пользователя заголовке ядра linux/kdev_t.h):
устройства. MAJOR(dev_t dev) - из dev извлекается
12Общие понятия. Рис.2: Отдельные части старший номер MINOR(dev_t dev) - из dev
драйвера Linux. извлекается младший номер MKDEV(int major,
13Общие понятия. Та часть драйвера, int minor) - из старшего и младшего
которая зависит от ОС, тесно номеров создается dev.
взаимодействует с механизмами ОС, 44Символьные драйверы Linux. Подключение
реализующими пользовательский интерфейс, файла устройства к драйверу устройства
и, поэтому, она будет отличаться в осуществляется за два шага: Выполняется
драйверах устройств для Linux, в драйверах регистрация файлов устройств для диапазона
устройств для Windows и в драйверах <major, minor> Подключение операций,
устройств для MacOS. Вертикали В Linux выполняемых над файлом устройства, к
драйвер устройства предоставляет функциям драйвера устройства. Первый шаг
пользователю интерфейс "системного выполняется с помощью одного из следующих
вызова"; в Linux это граница между двух API, определенных в заголовке ядра
так называемым пространством ядра и linux/fs.h: int
пользовательским пространством, что и register_chrdev_region(dev_t first,
показано на рис.2. На рис.3 представлена unsigned int cnt, char *name); int
более подробная классификации. Если alloc_chrdev_region(dev_t *first, unsigned
рассматривать интерфейс драйвера с учетом int firstminor, unsigned int cnt, char
специфики использования драйверов в ОС, то *name); С помощью первого API число cnt
в системе Linux драйверы можно по регистрируется как среди номеров файлов
вертикали грубо разделить на три группы: устройств, которые начинаются с first и
14Общие понятия. Пакетно-ориентированная именем файла name .
или сетевая вертикаль 45Символьные драйверы Linux. С помощью
Блочно-ориентированная вертикаль или второго API динамически определяется
вертикаль хранения данных свободный старший номер и регистрируется
Байт-ориентированная вертикаль или число cnt среди номеров файлов устройств,
вертикаль работы с символами Вертикаль начинающиеся с <the free major,
процессора и вертикаль памяти, firstminor>, с заданным именем файла
рассматриваемые вместе с этим тремя name. В любом случае в директории
вертикалями, дают полное представление о /proc/devices указывается список имен с
ядре Linux, соответствующее определению зарегистрированным старшим номером. С
ОС, которое есть в любом учебнике: "В учетом этой информации очередная версия
операционной системе реализуется 5 нашего драйвера будет иметь следующий вид.
основных функций управления: управление Повторим обычные шаги, которые узнали при
процессором / процессом, памятью, сетью, изучении первого драйвера: Соберем драйвер
средствами хранения данных, устройствами (файл .ko), выполнив команду make.
ввода / вывода". Хотя эти вертикали Загрузим драйвер с помощью команды insmod.
процессора и памяти можно классифицировать Выдадим список загруженных модулей с
как драйверы устройств, где процессор и помощью команды lsmod (Рис.9).
память будут соответствующими 46Символьные драйверы Linux. Рис.9:
устройствами, их, по ряду причин, трактуют Сборка и установка драйвера Linux.
по-другому. 47Символьные драйверы Linux. Перед
15Общие понятия. Рис.3: Общая схема ядра выгрузкой драйвера с помощью команды rmmod
Linux. заглянем в директорий /proc/devices для
16Общие понятия. Таковы основные того, чтобы с помощью команды cat
функциональные возможности любой ОС, будь /proc/devices найти зарегистрированный
то микроядро или монолитное ядро. Чаще старший номер с именем "Andy".
всего добавление кода именно в эти области Он там был. Тем не менее, мы не сможем в
представляет собой основную часть работы директории /dev найти ни одного файла
по портированию Linux, что обычно делается устройств с таким же старшим номером, т.к.
для нового процессора и архитектуры. Более он создан вручную с помощью команды mknod,
того, код в этих двух вертикалях нельзя, в а затем попытаемся выполнить операции
отличие от трех других вертикалей, чтения и записи. Все эти действия показаны
загружать или выгружать "на на рис.10. Обратите внимание, что в
лету". Так что когда мы теперь будем зависимости от номеров, уже используемых в
говорить о драйверах устройств в Linux, мы системе, старший номер 249 может
будем говорить только о тех трех варьироваться от системы к системе. На
вертикалях, которые расположены на рис.3 рис.10 также показаны результаты, которые
справа. Давайте заглянем глубже внутрь мы получили при чтении и записи одного из
этих трех вертикалей. Сетевая вертикаль файлов устройств. Очевидно, что все еще не
состоит из двух частей: а) стек сетевых сделан второй шаг подключения файла
протоколов и б) драйверы устройств карт устройства к драйверу устройства, при
сетевых интерфейсов (NIC) или просто котором операции над файлом устройства
драйверы сетевых устройств, которые могут связываются с функциями драйвера
предназначаться для Ethernet, Wi-Fi или устройства.
любой другой сетевой горизонтали. 48Символьные драйверы Linux. Рис.10:
Вертикаль хранения данных, опять же, Эксперименты с файлом символьного
состоит из двух частей: устройства.
17Общие понятия. а) драйверов файловых 49Файлы символьных устройств. Даже при
систем, предназначенных для декодирования регистрации диапазона устройств <major,
разнообразных форматов данных в различных minor>, файлы устройств в директории
разделах файловых систем, и б) драйверов /dev не создаются — мы должны были создать
блочных устройств для различных их вручную с помощью команды mknod. Но
(аппаратных) протоколов хранения данных, файлы устройств можно создавать
т.е. горизонталей, таких как IDE, SCSI и автоматически с помощью демона udev. Также
т.д. В действительности из-за огромного необходим второй шаг подключения файла
количества драйверов в этой вертикали, для устройства к драйверу устройства —
драйверов, предназначенных для работы с связывание операций над файлом устройства
символьными устройствами, используется с функциями драйвера устройства.
дополнительная подклассификация - так что Автоматическое создание файлов устройств
у вас есть драйверы терминалов, драйверы Ранее, в ядре 2.4, автоматическое создание
ввода/вывода, драйверы консоли, драйверы файлов устройств выполнялось самим ядром в
фрейм-буфера, звуковые драйверы и т.д. devfs с помощью вызова соответствующего
Типичными горизонталями здесь будут RS232, API. Однако, по мере того, как ядро
PS/2, VGA и т.д. развивалось, разработчики ядра поняли, что
18Общие понятия. Драйверы со файлы устройств больше связаны с
множественными вертикалями Последнее пользовательским пространством и,
замечание относительно полной картины следовательно, они должны быть именно там,
(размещения всех драйверов в экосистеме а не в ядре.
драйверов Linux): такие горизонтали, как 50Файлы символьных устройств. Исходя из
USB, PCI и т.д., расширяются ниже на этого принципа, теперь для
несколько вертикалей. Может быть USB рассматриваемого устройства в ядре в /sys
Wi-Fi, флешка USB и преобразователь только заполняется соответствующая
USB-последовательный порт, но все эти информация о классе устройства и об
устройства USB попадают в три различные устройстве. Затем в пользовательском
вертикали! В Linux драйвера шин или пространстве эту информацию необходимо
горизонтали часто подразделяются на две проинтерпретировать и выполнить
части, или даже на два драйвера: а) соответствующее действие. В большинстве
контроллер конкретного устройства и б) настольных систем Linux эту информацию
абстрактный слой, находящийся над ним и собирает демон udev, и создает,
используемый в качестве интерфейсам к соответственно, файлы устройств. Демон
вертикалям, обычно называемыми ядрами. udev можно с помощью его конфигурационных
Классическим примером могут быть драйвера файлов настроить дополнительно и точно
USB-контроллера ohci, ehci и т.д. и указать имена файлов устройств, права
USB-абстракция - usbcore. доступа к ним, их типы и т. д. Так что
19Динамическая загрузка драйверов. касается драйвера, требуется с помощью API
Динамически загружаемые драйвера чаще моделей устройств Linux, объявленных в
всего называют модулями, которые <linux/device.h>, заполнить в /sys
собираются в виде отдельных модулей с соответствующие записи. Все остальное
расширением .ko (объект ядра). В каждой делается с помощью udev. Класс устройства
системе Linux в корне файловой системы (/) создается следующим образом:
есть стандартное место для всех 51Файлы символьных устройств. struct
предварительно собранных модулей. Они class *cl = class_create(THIS_MODULE,
организованы аналогично древовидной "<device class name>");
структуре исходных кодов ядра и находятся Затем в этот класс информация об
в директории устройстве (<major, minor>)
/lib/modules/<kernel_version>/kernel заносится следующим образом:
где <kernel_version> результат device_create(cl, NULL, first, NULL,
вывода системной команды uname -r "<device name format>",
(см.рис.4). ...); Здесь, в качестве first указывается
20Динамическая загрузка драйверов. dev_t. Соответственно, дополняющими или
21Динамическая загрузка драйверов. Чтобы обратными вызовами, которые должны
динамически загружать и выгружать вызыватся в хронологически обратном
драйверы, воспользуйтесь следующими порядке, являются: device_destroy(cl,
командами, которые находятся в директории first);class_destroy(cl); В случае, если
/sbin и должны выполняться с привилегиями указаны несколько младших номеров minor,
пользователя root: lsmod — список модулей, API device_create() и device_destroy()
загруженных в текущий момент insmod могут вызываться в цикле и в этом случае
<module_file> — добавление / окажется полезной строка <device name
загрузка указанного файла модуля modprobe format> (<формат имени
<module> — добавление / загрузка устройства>).
модуля вместе со всеми его зависимостями 52Файлы символьных устройств. Например,
modinfo <module> — получение вызов функции device_create() в цикле с
информации о модуле rmmod <module> — использованием индекса i будет иметь
удаление / выгрузка модуля. следующий вид: device_create(cl, NULL,
22Динамическая загрузка драйверов. MKNOD(MAJOR(first), MINOR(first) + i),
Давайте в качестве примера рассмотрим NULL, "mynull%d", i); Операции с
соответствующие драйвера файловой системы файлами Независимо от того, что системные
FAT. На рис.5 показан весь процесс нашего вызовы применяются к обычным файлам, их
эксперимента. Файлы с модулями будут также можно использовать и с файлами
fat.ko, vfat.ko и т.д., находящиеся в устройств. Если смотреть из
директории fat (в vfat для старых версий пользовательского пространства, то в Linux
ядра) в /lib/modules/`uname -r`/kernel/fs. почти все является файлами. Различие - в
Если они представлены в сжатом формате пространстве ядра, где виртуальная
.gz, вам нужно будет распаковать их с файловая система (VFS) определяет тип
помощью команды gunzip, прежде чем вы файла и пересылает файловые операции в
сможете выполнить операцию insmod. Модуль соответствующий канал, например, в случае
vfat зависит от модуля fat, так что первым обычного файла или директория - в модуль
должен быть загружен модуль fat.ko. Чтобы файловой системы, или в соответствующий
автоматически выполнить распаковку и драйвер устройства в случае использования
загрузку зависимостей, воспользуйтесь файла устройства. Мы будем рассматривать
командой modprobe. Обратите внимание, что второй случай.
когда вы пользуетесь командой modprobe, вы 53Файлы символьных устройств. Теперь,
не должны в имени модуля указывать чтобы VFS передала операции над файлом
расширение .ko. Команда rmmod используется устройства в драйвер, ее следует об этом
для выгрузки модулей. проинформировать. Это называется
23Динамическая загрузка драйверов. регистрацией драйвером в VFS файловых
Рис.5: Операции с модулями Linux. операций. Регистрация состоит из двух
24Динамическая загрузка драйверов. Здесь этапов. Занесем нужные нам файловые
также вызывается команда dmesg (сокр. от операции (my_open, my_close, my_read,
англ. display message или англ. driver my_write, …) в структуру, описывающую
message) — команда, используемая в файловые операции (struct file_operations
UNIX-подобных операционных системах для pugs_fops) и ею инициализируем структуру,
вывода буфера сообщений ядра в стандартный описывающую символьное устройство (struct
поток вывода (stdout) (по умолчанию на cdev c_dev); используем для этого
экран). Буфер содержит все сообщения ядра, обращение cdev_init(). Передадим эту
начиная со времени загрузки ОС. Для структуру в VFS с помощью вызова
проверки последних событий в ОС вывод cdev_add(). Обе операции cdev_init() и
команды «dmesg» перенаправляют на фильтр cdev_add() объявлены в
«tail», чтобы отфильтровать только <linux/cdev.h>. Естественно, что
последние 3 строки буфера: Вывод lsmod также надо закодировать фактические
перенаправляется на фильтр head для вывода операции с файлами (my_open, my_close,
первых 5 строк. my_read, my_write).
25Первый драйвер для Linux. Драйвер 54Файлы символьных устройств. Теперь,
никогда не работает сам по себе. Он похож чтобы VFS передала операции над файлом
на библиотеку, загружаемую из-за функций, устройства в драйвер, ее следует об этом
которые будут вызваны из работающего проинформировать. Это называется
приложения. Он написан на языке C, но в регистрацией драйвером в VFS файловых
нем отсутствует функция main(). Кроме операций. Регистрация состоит из двух
того, он будет загружаться / компоноваться этапов. Занесем нужные нам файловые
с ядром, поэтому он должен компилироваться операции (my_open, my_close, my_read,
аналогично тому, как было откомпилировано my_write, …) в структуру, описывающую
ядро, и вы можете в качестве заголовочных файловые операции (struct file_operations
файлов использовать только те, что есть в pugs_fops) и ею инициализируем структуру,
исходном коде ядра, а не из стандартного описывающую символьное устройство (struct
директория /usr/include. Интересный факт, cdev c_dev); используем для этого
касающийся ядра, это то, что оно обращение cdev_init(). Передадим эту
представляет собой структуру в VFS с помощью вызова
объектно-ориентированную реализацию на cdev_add(). Обе операции cdev_init() и
языке C. В любом драйвере есть конструктор cdev_add() объявлены в
и деструктор. Когда модуль успешно <linux/cdev.h>. Естественно, что
загружается в ядро, то вызывается также надо закодировать фактические
конструктор модуля, а дескруктор модуля операции с файлами (my_open, my_close,
вызывается, когда команде rmmod удается my_read, my_write).
успешно выгрузить модуль. 55Файлы символьных устройств. Итак, для
26Первый драйвер для Linux. Это в начала, давайте все это сделаем как можно
драйвере две обычные функции, разве что проще - скажем, максимально просто в виде
они называются init и exit, "null драйвера". Повторим
соответственно, и вызываются с помощью обычный процесс сборки, добавив при этом
макросов module_init() и module_exit(), некоторые новые проверочные шаги, а
которые определены в заголовков ядра именно: Соберем драйвер (файл .ko) с
module.h. С учетом вышесказанного это помощью запуска команды make. Загрузим
полный код нашего первого драйвера; драйвер с помощью команды insmod. С
назовем его mfd.c. Обратите внимание, что помощью команды lsmod получим список всех
отсутствует заголовок stdio.h (заголовок загруженных модулей. С помощью команды cat
пользовательского пространства), вместо /proc/devices. получим список используемых
него мы используем аналог kernel.h старших номеров major. Поэкспериментируем
(заголовок пространства ядра). Функция с "null драйвером" (подробности
printk() эквивалентна функции printf(). смотрите на рис.11). Выгрузим драйвер с
Разница лишь в том, что при помощью команды rmmod.
программировании ядра, нам не потребуется 56Файлы символьных устройств. Рис.11:
беспокоиться о плавающих форматах %f, %lf Эксперименты с "null драйвером"
и тому подобном. Но, в отличие от команды 57Файлы символьных устройств. В своем
printf, команда printk не предназначена драйвере мы использовали свои собственные
для выдачи дампа своих данных в вызовы (my_open, my_close, my_read,
какую-нибудь консоль. Кроме того, для my_write), но они, в отличие от любых
обеспечения совместимости версии модуля с других вызовов файловой системы, работают
ядром, в которое будет загружен модуль, таким необычным образом: что бы мы не
добавлен заголовок version.h. С помощью записывали, при чтении мы ничего не можем
макроса MODULE_* заполняется информация, получить. Заметим, что возврат значения из
относящаяся к модулю, которая будет функций my_open() и my_close() тривиален,
использована как "подпись" типы возвращаемых значений - int, и обе
модуля. функции возвращают нулевое значение, что
27Сборка первого драйвера. Так как у нас означает успешное завершение. Но типы
есть код на языке C, настало время его возвращаемых значений обоих функций
скомпилировать и создать файл модуля my_read() и my_write() не int, а -
mfd.ko. Для этого мы используем систему ssize_t. При дальнейшем исследовании
сборки ядра. В приведенном ниже файле заголовков ядра, оказалось, что
Makefile происходит обращение к системе возвращаемое значение должно быть словом
сборки ядра из исходных кодов, а файл со знаком. Итак, если возвращается
Makefile ядра, в свою очередь, обращается отрицательное число , то обычно это
к файлу Makefile нашего нового драйвера с ошибка. Но неотрицательное возвращаемое
тем, чтобы собрать драйвер. Чтобы собрать значение будет иметь дополнительный смысл.
драйвер для Linux, у вас в системе должен 58Файлы символьных устройств. Для
быть исходный код ядра (или, по крайней операции чтения, оно будет указывать
мере, заголовки ядра). Предполагается, что количество читаемых байтов, а для операции
исходный код ядра будет находиться в записи, оно будет указывать количество
директории /usr/src/linux. Если в вашей записываемых байтов. Чтение файла
системе он находится в каком-нибудь другом устройства Когда пользователь выполняет
месте, то укажите это место в переменной чтение из файла устройства /dev/mynull,
KERNEL_SOURCE в файле Makefile. Если этот системный вызов поступает в слой
исходные коды отсутствуют, их необходимо виртуальной файловой системы (VFS),
установить, например: rpm -Uhv находящийся в ядре. VFS декодирует пару
ftp://rpmfind.net/linux/centos/6.3/centosp <major, minor> и выясняет, что нужно
us/x86_64/Packages/ перенаправить системный вызов в функцию
kernel-2.6.32-279.1.1.el6.centos.plus.x86_ драйвера my_read(), которая
4.rpm. зарегистрирована в виртуальной системе.
28Сборка первого драйвера. Версию ядра Так что с этой точки зрения функция
можно определить утилитой uname –a Найти my_read() вызывается у нас, писателей
пакет можно на драйверов устройств, как запрос на чтение.
http://rpmfind.net/linux/rpm2html/ И, следовательно, возвращаемое значение
search.php?query=kernel Можно будет указывать лицу, сделавшему запрос
устанавливать не все исходные коды, а (например, пользователю), сколько байтов
только заголовки с помощью утилиты yum: они получают при запросе на чтение.
yum install kernel-devel Содержимое 59Файлы символьных устройств. В нашем
Makefile лежит здесь. Расширения у него не примере null-драйвера мы возвратили ноль -
должно быть, а имя – регистрозависимое. это означает, что доступных байтов данных
Когда есть код на языке C (mfd.c) и готов нет или что, другими словами, был
файл Makefile, то все, что нам нужно достигнут конец файла. И, следовательно,
сделать для сборки нашего первого драйвера когда читается файл устройства, то
(mfd.ko), это вызвать команду make. # make независимо от того, что в него было
-C /usr/src/linux SUBDIRS=$PWD modules Как записано, результат будет отсутствовать.
только у нас будет файл mfd.ko, мы в роли На самом деле, функция my_read() должна
пользователя root выполним обычные записать данные в буфер buf (переменная —
действия. # su # insmod mfd.ko # lsmod | буфер, которая является вторым параметром
head -10 Команда lsmod должна вам сообщить функции my_read() и указывается
о том, что драйвер mfd загружен (Рис. 6): пользователем) в соответствие со значением
29Сборка первого драйвера. Рис.6: len (третий параметр функции), количеством
Загрузка драйвера Linux. байтов, запрашиваемых пользователем. Если
30Журнал сообщений ядра. Команда printk более конкретно, число байтов,
не предназначена для выдачи дампа своих записываемых в буфер buf, должно быть
данных в какую-нибудь консоль. На самом меньше или равно значению len, а
деле, она не может это делать; это нечто, количество записанных байтов должно быть
что сидит в фоновом режиме и выполняется передано обратно в качестве возвращаемого
точно также, как библиотека, только тогда, значения.
когда она запускается либо из пространства 60Файлы символьных устройств. Нет, это
аппаратных средств, либо из пространства не опечатка - в операции чтения писатели
пользователя. Все вызовы команды printk драйверов устройств "записывают"
помещают свои выходные данные в кольцевой данные в буфер, который предоставляется
буфер (журнал) ядра. Затем демон syslog, пользователем. Мы (возможно) читаем данные
работающий в пользовательском из соответствующего устройства, а затем
пространстве, берет их для окончательной записываем эти данные в пользовательский
обработки и перенаправляет на различные буфер, так что пользователь может его
устройства в соответствие с тем, что прочитать. Запись в файл устройства
задано в файле конфигурации Операция записи действует наоборот.
/etc/syslog.conf. В вызовах printk вы Пользователь предоставляет значение длины
должны были обратить внимание на макрос len (третий параметр функции my_write()),
KERN_INFO. Это, в действительности, указывающий количество байтов данных,
строковая константа, которая объединяется которые должны быть записаны и которые
в одну строку со строкой формата, идущей расположены в буфере buf (второй параметр
за ней. Обратите внимание, что между ними функции my_write()). Функция my_write()
нет запятой (,), это не два отдельных будет читать эти данные и, возможно,
аргумента. В исходном коде ядра есть записывать их на соответствующее
восемь таких макросов, которые определены устройство, и возвратит число, равное
в linux/kernel.h, а именно: количеству байтов, которые были успешно
31Журнал сообщений ядра. #define записаны.
KERN_EMERG "<0>" /* system 61Файлы символьных устройств. Изменим
is unusable */ #define KERN_ALERT my_read() и my_write() следующим образом,
"<1>"/*action must taken добавив статический глобальный символьный
immediately*/ #define KERN_CRIT массив. Так как драйвер работает в
"<2>" /* critical пространстве ядра, то он отграничен от
conditions */ #define KERN_ERR адресного пространства пользователя. А нам
"<3>" /* error conditions хотелось бы иметь возможность вернуть
*/ #define KERN_WARNING некий результат. Для этого используется
"<4>" /* warning функция put_user(). Она как раз и
conditions */ #define KERN_NOTICE занимается тем, что перекидывает данные из
"<5>"/*normal significant пространства ядра в пользовательское.
condition*/ #define KERN_INFO Наоборот действует функция get_user(). Обе
"<6>" /* informational */ они прописаны в файле включения
#define KERN_DEBUG "<7>" <asm/uaccess.h>. Теперь действия по
/* debug-level messages*/ Теперь, в записи данных в устройство и чтения из
зависимости от этих уровней журналирования него приведут к результату, показанному на
(то есть первых трех символов в строке рис. 12. Все, что нам осталось – это
формата), демон пользовательского написать пользовательское приложение,
пространства syslog перенаправляет каждое работающее с нашим драйвером.
сообщения в соответствие с заданной 62Файлы символьных устройств. Рис.12:
конфигурацией. Обычно местом, куда Работа с "null драйвером"
перенаправлются сообщения всех уровней
Драйверы LINUX.ppt
http://900igr.net/kartinka/informatika/drajvery-linux-186553.html
cсылка на страницу

Драйверы LINUX

другие презентации на тему «Драйверы LINUX»

«Linux и Windows» - В 1992 году появилась версия Windows NT 3.0, а в 1994 году - Windows NT 3.5. Сравнение Windows и Linux. Папка Панель управления. Windows 98 усовершенствовала отображение экранных шрифтов вашего компьютера. Действительно быстрая операционная система. Эффективность. В 50 годах прошлого века корпорация AT&T (глобальный монополист на.

«Linux» - XFCE. XFCE полностью русифицирован. EduMandriva 2010 One LXDE. RAM: рабочий минимум - 256 Mb, рекомендуется 512 Mb или больше. Легкий Линукс. EdUbuntu. Отличия Linux от других ОС. Edumandriva 2010 Spring Addon. Особенность – весьма совершенная система управления пакетами (dpkg и apt). EduMandriva 2010.

«Система Linux» - История Linux и ПСПО. Определение свободного программного обеспечения (СПО). Родился 28 декабря 1969 в Хельсинки — финский программист, хакер. Линус Бенедикт Торвальдс. Типы программного обеспечения. Ubuntu — дистрибутив операционной системы Linux, основанный на Debian GNU/Linux. Свойства операционной системы Linux.

«Операционная система Linux» - Пакет офисных приложений Почтовый клиент Программы для работы в Интернете Программы для работы с графикой Современные средства коммуникаций Мультимедиа-центр Игры И многое другое. Работу с файлами и каталогами. Современные дистрибутивы Linux включают: Файловая система Linux. Операционная система Linux разработана в 90-х годах молодым студентом Хельсинского университета Линусом Торвальдсом (Linus Torvalds) в рамках дипломного проекта.

«ОС Linux» - Ядро является главным исполняемым файлом системы. Отличия касаются не столько интерфейса, сколько внутренней организации работы ОС. В задачи ядра входит наблюдение за всеми процессами. От дистрибутива до рабочего стола. Операционная система Линукс. ОС Линукс. Операционные системы Unix/Linux принципиально отличаются от семейства Windows.

«GPS для Android» - Программа Skyriver GPS. Контроль посещения торговых точек (ТТ). Планы по развитию программы. Тревожная кнопка. Почему Android. Примеры использования. Обзор функционала. Назначение программы. Контроль посещения торговых точек. Диспетчерское ПО. GPS трекер. Skyriver GPS для Android.

Linux

12 презентаций о Linux
Урок

Информатика

130 тем
Картинки