Вы здесь

Доступ к устройствам в Linux

Классическая модель доступа к драйверам

В файловой системе 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. На основании этой информации и набора правил генерации имён сервис, создаёт для устройства специальный файл.
Яндекс.Метрика