Да, файловые системы в Linux могут быть реализованы как модули ядра. Но есть также интерфейс FUSE (Файловая система в USErspace), который позволяет обычному процессу пользовательского пространства выступать в роли драйвера файловой системы. Если вы создаете прототип новой файловой системы, ее реализация вначале с использованием интерфейса FUSE может упростить тестирование и разработку. Как только внутренняя часть файловой системы будет разработана в форме FUSE, вы можете приступить к реализации оптимизированной по производительности версии модуля ядра.
Вот некоторая базовая информация о реализации файловой системы в пространстве ядра. Он довольно старый (с 1996 года!), Но это должно, по крайней мере, дать вам базовое представление о том, что вам нужно делать.
Если вы решите пойти по маршруту FUSE, вот libfuse, эталонная реализация пользовательской части интерфейса FUSE.
Драйвер файловой системы как модуль ядра
По сути, функция инициализации модуля драйвера вашей файловой системы должна просто вызвать register_filesystem()
функцию и дать ей в качестве параметра структуру, включающую указатель функции, который идентифицирует функцию в драйвере вашей файловой системы, которая будет использоваться в качестве первого шага при идентификации вашей файловой системы. введите и установите его. На этом этапе больше ничего не происходит.
Когда файловая система монтируется, и либо тип файловой системы задается в соответствии с вашим драйвером, либо выполняется автоматическое определение типа файловой системы, слой Virtual FileSystem ядра (для краткости VFS) будет вызывать эту функцию. Он в основном говорит: «Вот указатель на представление уровня ядра стандартного блочного устройства Linux. Посмотрите на него, посмотрите, справится ли это с чем-то, а затем скажите мне, что вы можете с ним сделать».
В этот момент ваш драйвер должен прочитать все, что ему нужно, чтобы убедиться, что это правильный драйвер для файловой системы, а затем вернуть структуру, содержащую указатели для дополнительных функций, которые ваш драйвер может выполнять с этой конкретной файловой системой. Или, если драйвер файловой системы не распознает данные на диске, он должен вернуть соответствующий результат ошибки, а затем VFS либо сообщит о сбое в пространство пользователя, либо - если выполняется автоматическое определение типа файловой системы - запросит другую файловую систему. Драйвер попробовать.
Другие драйверы в ядре будут обеспечивать стандартный интерфейс блочного устройства, поэтому драйверу файловой системы не потребуется реализовывать аппаратную поддержку. По сути, драйвер файловой системы может читать и записывать дисковые блоки, используя стандартные функции уровня ядра, с указанием указателя устройства.
Уровень VFS ожидает, что драйвер файловой системы сделает ряд стандартных функций доступными для уровня VFS; некоторые из них являются обязательными для того, чтобы слой VFS делал что-либо значимое с файловой системой, другие являются необязательными, и вы можете просто вернуть NULL вместо указателя на такую дополнительную функцию.