LINUX.ORG.RU

Как под низом работают device files?


0

1

Пытаюсь разобраться с принципом работы device files, но после продолжительного гугления немного запутался.

Прошу глянуть на мои текущие предположения, и указать, где я (не)прав:

  • В ядре загружен кусок кода, который реализует драйвер некоторого устройства
  • Этому куску кода присвоен какой-то идентификатор, который хранится в некотором подобии таблицы
  • Согласно текущему положению дел, этот идентификатор может представлять собой либо major number, либо какую-то строку (название драйвера)
  • Существует аналогичная таблиц(а|ы) для minor numbers, которые заполняют сами драйвера
  • После загрузки ядра имеем пустой /dev (вопрос, откуда взялся корень ФС с эим самым /dev пока не рассматриваем)
  • Далее, этот /dev начинает кем-то наполняться
  • Этим кем-то раньше был функционал самого ядра
  • Потом это стал devfs
  • Потом (в случае Linux) это стал udev
  • Потом (в случае Linux) devtmpfs

Случай с devfs

  • Во первых, devfs - файловая система, которая как-то монтируется в /dev
  • Когда некоторый процесс делает системный вызов, чтобы запросить данные о содержимом /dev (или же совершает любое другое взаимодействие с /dev или «файлов» в нём), ядро передаёт обработку sycall'a своей подсистеме - VFS'у
  • Всё что делает VFS - находит драйвер соответствующей FS (в нашем случае - devfs) и пробрасывает обработку вызова ему
  • Никакой специальной/дополнительной обработки запроса VFS не делает, не глядя на то, что работа происходит с /dev
  • Фактически, VFS и не может ничего делать, т.к. для ядра /dev - всего лишь обычная ветка в общей файловой системе. Т.е., ядро само по себе не ведёт учёт созданных /dev файлов.
  • Когда запрос дошёл до devfs, оно действует по обстоятельствам
  • Например, если мы хотим получить список файлов, то devfs вытягивает его из заранее сохранённого (скажем, в памяти) списка устройств. Сам список был построен при инициализации devfs, путём изучения таблиц с идентификаторами (major/minor numbers), согласно стандартным правилам наименования устройств
  • Если же мы хотим прочитать/записать в device файл, то devfs передаёт обработку запроса драйверу устройства (который сама devfs найдёт по major number'у), передав ему, помимо прочего, minor number.

Некоторые вопросы:

  • Что будет происходить под низом, если попытаться создать device file на, скажем, ext3?
  • Как работали device files до появления devfs?
  • Например, кем обрабатывался mknod на создание device file? Кодом, намертво зашитым в VFS?
  • Как работает mknod в случае udev? Насколько я понимаю, udev всего лишь daemon, отвечающий за заполнение /dev, но он не является файловой системой, в отличие от devfs.
  • Правильно ли я понимаю, что каждая миграция на более новую систему сопровождалась значительными изменениями в ядре, т.к. ядро/devfs/udev очень сильно повязаны друг на друга?
★★★

Как под низом

На днище?

devfs

Сейчас devtmpfs и поверх udev.

Что будет происходить под низом, если попытаться создать device file на, скажем, ext3?

man 2 mknod

Как работали device files до появления devfs?

Как и после. devtmpfs нужна, чтобы файлы создавались динамически ядром.

Как работает mknod в случае udev? Насколько я понимаю, udev всего лишь daemon, отвечающий за заполнение /dev, но он не является файловой системой, в отличие от devfs.

mknod — системный вызов, udev — юзерспейсная прога, которая создаёт симлинки в devtmpfs, они никак не связаны. Раньше udev ещё сам делал mknod(), получая сообщения из ядра.

anonymous ()

Как работали device files до появления devfs?

Так же как до, во время, и после. Файл устройства это запись в inode (major,minor). При открытии такого файла ядро проверяет major/minor, находит в списке устройств нужную запись, и дергает нужные функции соответствующего драйвера (обслуживающий устройство драйвер указан в записи об устройстве в таблице девайсов).

Как видишь сам, здесь просто нет места для драйвера файловой системы (точнее, он его работа заканчивается предъявлением inode с типом char/block).

Например, кем обрабатывался mknod на создание device file?

Драйвером ФС. На ФС добавляет запись об inode с типом char/block,major,minor.

Что будет происходить под низом, если попытаться создать device file на, скажем, ext3?

То же самое, что и с таким же файлом на ext2. ext4, reiserfs, btrfs, tmpfs и т.д., поскольку реально драйвер ФС в работе с устройство на которое ссылается специальный файл не используется. inode прочитан, файл специальный -> операции больше не идут с ФС.

devfs давно мертв, devtmpfs это практически тот же tmpfs.

no-dashi ★★★★★ ()
Ответ на: комментарий от no-dashi

Спасибо за пояснения, теперь я знаю, в чём была причина моего непонимания.

runtime ★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.