Архитектура операционной системы (ОС) Linux устроена таким образом, что весь её потенциал и полноценная работа всецело поддерживаются файловой системой (ФС) даже, когда такая закономерность не очевидна. Одним из таких случаев является, взаимодействие системы с оборудованием. Хотя подобное явление кажется нестандартным. Однако для Linux это основная архитектурная особенность — взаимодействие системы с составляющими её компонентами, оборудованием (его драйверами) происходит посредством ФС. Ключевым объектом взаимодействия, являются специальные файлы для работы оборудования (или устройств) — файлы устройств.
Что такое драйверы и файлы устройств?
При помощи специального системного программного обеспечения (ПО). Система «знает» как получить аппаратные ресурсы оборудования, т. е. «железа». Таким ПО являются драйверы. Основная задача — управление устройствами по командам системы (и/или микропрограммы самого устройства), трансляция команд между девайсом и программным интерфейсом приложения (API) системы. Благодаря драйверам системное ядро может разрабатываться независимо от оборудования. Но при этом разработчикам оборудования следует следить за изменениями и особенностями системных платформ.
Для современных ядер Linux не легко найти несовместимое из-за отсутствия драйверов оборудование. Поскольку многие «железные» новинки довольно быстро осваиваются членами огромного сообщества разработчиков Linux. Сами производители оборудования охотно идут на контакт, предоставляя необходимую информацию для создания ПО девайсов. Поэтому уже разработчиками ядра драйверы включаются в состав ядра Linux, являясь его неотъемлемыми компонентами. Однако, в качестве драйвера может служить пользовательская программа. Таким образом, драйвер может использоваться как из ядра, так и с помощью пользовательских инструкций в виде специальной программы. При использовании пользовательских драйверов (т. е., тех, которые не являются компонентами ядра). В каталоге /dev создаются и используются специальные файлы устройств. Действия, выполняемые с этими файлами отображаются на работу с оборудованием через программное обеспечение. Системное ядро интерпретирует работу с файлом конкретного девайса как специальные команды — вызовы функций драйвера.
При выборе оборудования следует обращать внимание на официальную информацию разработчиков, касательно поддержки оборудования для целевой системы. В систему можно устанавливать только специально разработанные поддерживаемые драйверы, т. е. для конкретного типа версии системы. Иногда можно также воспользоваться результатами работы энтузиастов, которые изучили работу устройства и смогли собрать для него неофициальную версию драйвера.
Взаимодействие системы с файлами устройств
Как уже было отмечено, 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 выполняет добавление, удаление или базовую настройку аппаратного обеспечения системы.