Драйверы устройств операционной системы linux

Добавление драйвера устройства в Linux

Обычно в системах Unix и Linux установка драйверов для новых устройств не вызывает трудностей. Даже для неопытных пользователей этих систем. Но это в том случае, если производители устройства (и/или разработчики драйверов) позаботились об этом. И оснастили пакет драйвера специальными установочными и конфигурационными скриптами. А также протестировали всё это в нескольких системах. Однако бывают случаи, когда «удобной» возможности установить драйвер устройства нет, но есть исходные коды драйвера. В таком случае можно попытаться собрать драйвер самостоятельно. Конечно, это далеко не так просто, нужно поэкспериментировать. Но успешный результат возможен с высокой вероятностью. И главное, что для этого требуется — это знать и понимать общий порядок действий в случае ручной сборки драйвера. С такими задачами часто сталкиваются администраторы систем, обслуживающих технологические процессы на производствах, хостинг-площадки и т. д.

Способы установки драйверов

Для Linux-систем установка драйверов устройств происходит тремя основными способами:

  • установка патча для определённых версий ядра;
  • использование специальных сценариев для установки и конфигурации драйвера;
  • с помощью загружаемого модуля ядра.

Надо признать, что для Linux ручная установка драйверов представляет собой довольно сложную и трудоёмкую работу. Поэтому разработчики стремятся всё чаще обеспечивать автоматическую установку и настройку для своих драйверов/устройств. Ведь они заинтересованы в максимально эффективном распространении своих разработок. По этой причине самым распространённым способом установки драйверов является использование сценариев установки. Для самых популярных типов устройств, например для видеокарт, аудиоустройств и даже для сетевого оборудования в настоящее время трудно найти драйверы без автоматической установки.Установка таких драйверов ничем не отличается от установки обычных пакетов. Вся инструкция описана в файле README, подробнее об установке из исходников читайте здесь.

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

Если в качестве драйвера используются патчи ядра, то установить их (собственно и сам драйвер) можно выполнив следующие команды:

$ cd каталог_исходных_кодов_ядра $ patch -p1 < файл_патча

Расположение «каталог_исходных_кодов_ядра» зависит от системы, в CentOS это /usr/lib/modules//kernel, Например

/usr/lib/modules/3.10.0-862.el7.x86_64/kernel

В случае с ручной установкой, необходимо для начала интегрировать драйвер некоего устройства (исходные коды) в дерево каталогов исходных кодов ядра.

Ручная установка драйвера

Для примера, пусть требуется добавить в ядро драйвер некоего сетевого устройства netdevice. Драйвер этого устройства нужно (как уже известно) поместить в один из каталогов с исходными кодами ядра. А именно — в каталог drivers, внутри которого может быть следующее содержимое:

$ ls -F каталог_исходных_кодов_ядра/drivers

Драйверы чаще всего помещаются в подкаталоги scsi, char, block, net, а также sound и usb. Эти подкаталоги отражают схему размещения драйверов в зависимости от их типа: блочные — для дисков IDE, символьные — для последовательных портов например, для сетевых устройств, звуковых плат и USB-устройств — USB-адаптеры, USB-модемы и т. д. Другие подкаталоги служат для размещения драйверов других категорий, в частности для системных и разного рода шин (pci, pcie, nubus, zorro), а также для платформенно-зависимых драйверов — acorn, macintosh.

Читайте также:  Alpine linux install package

Таким образом, драйверы для сетевого устройства netdevice следует поместить в следующий каталог:

каталог_исходных_кодов_ядра/drivers/net/netdevice

Исходные коды драйвера представляют собой набор файлов *.c, *.cpp и *.h, которые могут быть объединены в дерево каталогов, в зависимости от того, как составлен проект «исходников» драйвера.

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

  • /drivers/net/Makefile – для сборки самого драйвера;
  • /drivers/net/Kconfig – для того, чтобы имя нового устройства было доступно для конфигурирования.

Файлы Makefile и Kconfig содержатся в каждом каталоге дерева каталогов с исходными кодами ядра Linux. Это необходимо для организации универсальной разработки и расширения функционала и возможностей ядра при его сборке из исходных кодов путём независимого дополнения новым кодом. В данном случае кодом драйвера для устройства netdevice.

В файл Makefile следует добавить следующий код:

obj-$(CONFIG_NETDEVICE_DEV) += netdevice/

Таким образом, при сборке ядра в его составе будет собран и сам драйвер netdevice. После дополнения файла Kconfig следующим кодом:

config NETDEVICE_DEV tristate 'Netdevice support'

устройство netdevice будет доступно для использования конфигурационным макросом (необходимо на этапе конфигурирования сборки ядра). Здесь команда config использует ключевое слово NETDEVICE_DEV, которое обязательно должно совпадать с фразой, следующей после CONFIG, которое ранее было указано в файле Makefile.

Команда tristate указывает, что драйвер может быть собран как загружаемый модуль, если это поддерживается. Если нет, то вместо tristate следует указать bool – драйвер будет частью ядра. Фраза ‘Netdevice support’ будет отображаться в выводе конфигурационного скрипта на этапе конфигурирования сборки ядра. Это может быть любой текст, идентифицирующий устройство, для которого добавляется драйвер.

Использование нового драйвера

В современных версиях ядра Linux задействование новых драйверов существенно упрощено. В отличие версий, выпущенных раньше 2.6. Тогда это было настоящей головоломкой и требовало знаний в программировании. Но архитектурные изменения в модели драйверов и устройств, пришедшие в версии 2.6 позволяют теперь связывать драйверы с ядром на более высоком «общепользовательском» уровне. Для этого используется специальный конфигурационный макрос MODULE_DEVICE_TABLE. Он создаёт соответствия, которые позволяют утилите modprobe (и ей подобным) задействовать новые драйверы ядра.

Читайте также:  Запуск сервера майнкрафт линукс

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Похожие записи:

Источник

Драйверы и файлы устройств в Linux

Архитектура операционной системы (ОС) Linux устроена таким образом, что весь её потенциал и полноценная работа всецело поддерживаются файловой системой (ФС) даже, когда такая закономерность не очевидна. Одним из таких случаев является, взаимодействие системы с оборудованием. Хотя подобное явление кажется нестандартным. Однако для Linux это основная архитектурная особенность — взаимодействие системы с составляющими её компонентами, оборудованием (его драйверами) происходит посредством ФС. Ключевым объектом взаимодействия, являются специальные файлы для работы оборудования (или устройств) — файлы устройств.

Что такое драйверы и файлы устройств?

При помощи специального системного программного обеспечения (ПО). Система «знает» как получить аппаратные ресурсы оборудования, т. е. «железа». Таким ПО являются драйверы. Основная задача — управление устройствами по командам системы (и/или микропрограммы самого устройства), трансляция команд между девайсом и программным интерфейсом приложения (API) системы. Благодаря драйверам системное ядро может разрабатываться независимо от оборудования. Но при этом разработчикам оборудования следует следить за изменениями и особенностями системных платформ.

Для современных ядер Linux не легко найти несовместимое из-за отсутствия драйверов оборудование. Поскольку многие «железные» новинки довольно быстро осваиваются членами огромного сообщества разработчиков Linux. Сами производители оборудования охотно идут на контакт, предоставляя необходимую информацию для создания ПО девайсов. Поэтому уже разработчиками ядра драйверы включаются в состав ядра Linux, являясь его неотъемлемыми компонентами. Однако, в качестве драйвера может служить пользовательская программа. Таким образом, драйвер может использоваться как из ядра, так и с помощью пользовательских инструкций в виде специальной программы. При использовании пользовательских драйверов (т. е., тех, которые не являются компонентами ядра). В каталоге /dev создаются и используются специальные файлы устройств. Действия, выполняемые с этими файлами отображаются на работу с оборудованием через программное обеспечение. Системное ядро интерпретирует работу с файлом конкретного девайса как специальные команды — вызовы функций драйвера.

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

Читайте также:  Посмотреть файл через консоль linux

Взаимодействие системы с файлами устройств

Как уже было отмечено, Linux в каталоге /dev для устройств хранит соответствующие специальные файлы. Система связывает с каждым устройством специальные номера — старший, младший. С помощью этих номеров ядро определяет тип девайса, само устройство в системе, используя полученные данные, транслирует действия над файлом девайса в функции вызова этого устройства, задействовав соответствующий драйвер. Тип оборудования связан со старшим номером, конкретное девайса для данного типа (или драйвера) — с младшим, который еще называют номером модуля.

Файлы устройств подразделяются на два типа:

  • блочные — чтение/запись файла производится блоками, размеры которых обычно кратны 512 байтам;
  • символьные — чтение/запись осуществляется побайтово.

Для реализации взаимодействия с ядром, драйвера обычно используют стандартный интерфейс, которого достаточно для выполнения всех системных функций, самыми распространёнными являются: ioctl, probe, select, read, write, receive, close, stop, transmit и другие.

В момент, когда над файлом устройства производятся какие-либо операции, ядро их перехватывает в зависимости от типа этих операций вызывает соответствующую системную функцию и далее управление, работа с этой функцией передаются программному обеспечению. Таким образом, Linux работа с оборудованием сводится, по сути, к работе с файлами.

Установка драйверов в Linux

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

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

mknod имя_файла тип старший младший

Здесь указывается тип девайса: b – блочное устройство, c – символьное. В качестве параметров старший и младший определяются старший и младший номера файла оборудования соответственно.

Для Linux существует специальная система udev. Которая автоматически отслеживает изменения аппаратного обеспечения ОС и выполняет соответствующие действия (по-умолчанию создаёт файлы). Основой udev является демон udevd. Который прослушивает все сообщения от системного ядра. Которые содержат информацию о статусе оборудования. Используя эти данные, а также инструкции из конфигурации, хранящихся в каталогах /etc/udev/ и /lib/udev. Демон udev выполняет добавление, удаление или базовую настройку аппаратного обеспечения системы.

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Похожие записи:

Источник

Оцените статью
Adblock
detector