Классическая модель доступа к драйверам
В файловой системе Unix существуют специальные объекты - файлы устройств. Как правило, они создаются в каталоге /dev, но могут сбыть созданы и в любом другом каталоге. Каждый специальный файл - это точка доступа к драйверу устройства. Если драйвер предоставляет операции чтения/записи, то файл устройства может быть открыт как обычный файл cat /dev/modem > /dev/null. Для выполнения других операций с устройством (например выдвижение лотка CDROM) требуется отправка команд драйверу через системный вызов ioctl(). Файлам устройств права доступа назначаются так же , как и обычным файлам.
ВНИМАНИЕ: сетевые карты не отображаются в файлы устройств в /dev. Все сетевые интерфейсы живут в своём пространстве имён.
Команда создания специального файла:
mknod <name> <type> <major> <minor>
- name - имя в файловой системе,
- type - b|c - блочный или посимвольный тип устройства,
- major, minor - номер драйвера в таблице драйверов и номер устройства в таблице устройств, обслуживаемых этим драйвером.
Имя устройства не имеет значения для функционирования ОС и выбирается по некоторым мнемоническим правилам. Например, SCSI диск может иметь следующие имена:
- Linux - /dev/sda1 - первый раздел (1) на первом (a) SCSI диске
- Solaris - /dev/dsk/c0t2d0s3 - контроллер 0, устройство 2 (SCSI ID), логическое устройство 0 (LUN Logical Unit Number - обычно 0), слайс 3 (Номер раздела)
- Solaris - /devices/pci@0,0/pci-ide@7,1/ide@0/cmdk@0,0:a - диск на контроллере ide, подключенном по шине pci
Функциональность файла устройства определяется парой чисел major/minor, которые должны соответствовать номерам в некой таблице регистрации драйверов в ядре ОС. Назначение minor, обычно, определяется логикой работы драйвера. Для согласованного назначения номера major драйверам и специальным файлам существует несколько способов :
- Статические номера major. Разработчики драйверов регистрируются у мантейнеров ядра и получают фиксированные номера major. . Разработчики дистрибутива добавляют в поставку скрипт для создания соответствующих специальных файлов в каталоге /dev.
- Инициализация драйвера на основе специального файла. При инициализации драйвера в ядре он просматривает каталог /dev, обнаруживает по имени свой специальный файл и читает из него major/minor.
- Динамическое назначение major/minor. При обнаружении нового устройства ядро инициализирует драйвер и назначает ему major/minor. Специальный сервис (udev) получает через сокет уведомление о найденном устройстве (тип, шина, производитель, идентификатор) и его major/minor. На основании этой информации и набора правил генерации имён сервис, создаёт для устройства специальный файл.