Пытаюсь разобраться с принципом работы 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 очень сильно повязаны друг на друга?