Этот способ описывается для каждого типа файловой системы в структуре vnodeops, состав которой приведен на рисунке 5.7.
Для того, чтобы обращение к специфическим функциям не зависело от типа файловой системы, для каждой операции в vnodeops определен макрос с общим для всех типов файловых систем именем, например, VOP_OPEN, VOP_CLOSE, VOP_READ и т.п.
Эти макросы определены в файле <sys/vnode.h> и соответствуют системным вызовам.
Если файловая система какого-либо конкретного типа не поддерживает определенную операцию над своими файлами, она должна все равно обработать вызов и вернуть код ошибки.
Работа ядра с файлами во многом основана на использовании структуры vnode, поля которой представлены на рисунке 5.8. Поля vnode:
v_vfsp -используется ядром для связи файла с определенным типом файловой системы
v_op -используется ядром для связи файла с конкретными реализациями файловых операций
v_pages -используется для указания на таблицу физических страниц памяти в случае, когда файл отображается в физическую память.
В vnodeтакже содержится тип файла и указатель на зависимую от типа файловой системы часть описания характеристик файла - структуру inode, обычно содержащую адресную информацию о расположении файла на носителе и о правах доступа к файлу.
vnode используется ядром для хранения информации о блокировках (locks), примененных процессами к отдельным областям файла.
Ядро в своих операциях с файлами оперирует для описания области файла парой vnode, offset, которая однозначно определяет файл и смещение в байтах внутри файла.
Рис. 5.8. Описатель файла - vnode
При каждом открытии процессом файла ядро создает в системной области памяти новую структуру типа file, которая, как и в случае традиционной файловой системы s5, описывает как открытый файл, так и операции, которые процесс собирается производить с файлом (например, чтение). Структура file содержит такие поля, как:
flag- определение режима открытия (только для чтения, для чтения и записи и т.п.);
struct vnode * f_vnode - указатель на структуру vnode (заменивший по сравнению с s5 указатель на inode);
offset- смещение в файле при операциях чтения/записи;
struct cred * f_cred - указатель на структуру, содержащую права процесса, открывшего файл (структура находится в дескрипторе процесса);
а также указатели на предыдущую и последующую структуру типа file, связывающие все такие структуры в список.
Рис. 5.9. Связь процесса с его файлами
В отличие от структур типа file структуры типа vnode заводятся операционной системой для каждого активного (открытого) файла в единственном экземпляре, поэтому структуры file могут ссылаться на одну и ту же структуру vnode.
Структуры vnode не связаны в какой-либо список.
Все операции с файлами в UNIX System V Release 4 производятся с помощью связанной с файлом структуры vnode. Когда процесс запрашивает операцию с файлом (например, операцию open), то если структуры vnode, описывающей нужный файл, нет в оперативной памяти, то зависимая часть заводит для него новую структуру vnode.
Для ускорения доступа к файлам в UNIX System V Release 4 используется механизм быстрой трансляции имен файлов в соответствующие им ссылки на структуры vnode. Этот механизм основан на наличии кэша, хранящего максимально 800 записей об именах файлов и указателях vnode.