Сетевые операционные системы

       

Реализация файловой системы VFS


UNIX System V Release 4 имеет массив структур vfssw [ ], каждая из которых описывает файловую систему конкретного типа, которая может быть установлена в системе. Структура vfssw состоит из четырех полей:

  • символьного имени файловой системы;

  • указателя на функцию инициализации файловой системы;

  • указателя на структуру, описывающую функции, реализующие абстрактные операции VFS в данной конкретной файловой системе;

  • флаги, которые не используются в описываемой версии UNIX.

    Пример инициализированного массива структур vfssw:

    struct vfssw vfssw[] = {

    {0, 0 , 0 ,0 }, - нулевой элемент не используется

    {"spec", specint, &spec_vfsops, 0}, - SPEC

    {"vxfs", vx_init, &vx_vfsops, 0}, - Veritas

    {"cdfs", cdfsinit, &cdfs_vfsops, 0}, - CD ROM

    {"ufs", ufsinit, &ufs_vfsops, 0}, - UFS

    {"s5", vx_init, &vx_vfsops, 0}, - S5

    {"fifo", fifoinit, &fifovfsops, 0}, - FIFO

    {"dos", dosinit, &dos_vfsops, 0}, - MS-DOS

    Функции инициализации файловых систем вызываются во время инициализации операционной системы. Эти функции ответственны за создание внутренней среды файловой системы каждого типа.



    Структура vfsops, описывающая операции, которые выполняются над файловой системой, состоит из 7 полей, так как в UNIX System V Release 4 предусмотрено 7 абстрактных операций над файловой системой:

    VFS_MOUNT монтирование файловой системы,

    VFS_UNMOUNT размонтирование файловой системы,

    VFS_ROOT получение vnode для корня файловой системы,

    VFS_STATVFS получение статистики файловой системы,

    VFS_SYNC выталкивание буферов файловой системы на диск,

    VFS_VGET получение vnode по номеру дескриптора файла,

    VFS_MOUNTROOT монтирование корневой файловой системы.

    Рис. 5.6. Монтирование файловых систем в VFS

    Операция VFS_MOUNT выполняет традиционное для UNIX монтирование файловой системы на указанный каталог уже смонтированной файловой системы для образования общего дерева, а операция VFS_UNMOUNT отменяет монтирование.
    Операция VFS_ROOT используется при разборе полного имени файла, когда встречается дескриптор vnode, который связан со смонтированной на него файловой системой. Операция VFS_ROOT помогает найти vnode, который является корнем смонтированной файловой системы. Операция VFS_STATVFS позволяет получить независимую от типа файловой системы информацию о размере блока файловой системы, о количестве блоков и количестве свободных блоков в единицах этого размера, о максимальной длине имени файла и т.п. Операция VFS_SYNC выталкивает содержимое буферов диска из оперативной памяти на диск. Операция VFS_MOUNTROOT позволяет смонтировать корневую файловую систему, то есть систему, содержащую корневой каталог / общего дерева. Для указания того, какая файловая система будет монтироваться как корневая, в UNIX System V Release 4 используется переменная rootfstype, содержащая символьное имя корневой файловой системы, например "ufs".

    Таким образом, в UNIX System V Release 4 одновременно в единое дерево могут быть смонтированы несколько файловых систем различных типов, поддерживающих операцию монтирования (рисунок 5.6).

    VOP_OPEN- открыть файл

    VOP_CLOSE- закрыть файл

    VOP_READ- читать из файла

    VOP_WRITE- записать в файл

    VOP_IOCTL- управление в/в

    VOP_SETFL- установить флаги статуса

    VOP_GETATTR- получить атрибуты файла

    VOP_SETATTR- установить атрибуты файла

    VOP_LOOKUP- найти vnode по имени файла

    VOP_CREATE- создать файл

    VOP_REMOVE- удалить файл

    VOP_LINK- связать файл

    VOP_MAP- отобразить файл в память



    Рис. 5.7. Абстрактные операции над файлами

    Кроме операций над файловой системой в целом, для каждого типа файловой системы (s5, ufs и т.д.), установленной в ОС, необходимо описать способ реализации абстрактных операций над файлами, которые допускаются в VFS. Этот способ описывается для каждого типа файловой системы в структуре vnodeops, состав которой приведен на рисунке 5.7. Как видно из состава списка абстрактных операций, они образованы объединением операций, характерных для наиболее популярных файловых систем UNIX.


    Для того, чтобы обращение к специфическим функциям не зависело от типа файловой системы, для каждой операции в vnodeops определен макрос с общим для всех типов файловых систем именем, например, VOP_OPEN, VOP_CLOSE, VOP_READ и т.п. Эти макросы определены в файле <sys/vnode.h> и соответствуют системным вызовам. Таким образом, в структуре vnodeops скрыты зависящие от типа файловой системы реализации стандартного набора операций над файлами. Даже если файловая система какого-либо конкретного типа не поддерживает определенную операцию над своими файлами, она должна создать соответствующую функцию, которая выполняет некоторый минимум действий: или сразу возвращает успешный код завершения, или возвращает код ошибки. Для анализа и обработки полного имени файла в VFS используется операция VOP_LOOKUP, позволяющая по имени файла найти ссылку на его структуру vnode.

    Работа ядра с файлами во многом основана на использовании структуры 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 показан на рисунке 5.9.

    В отличие от структур типа file структуры типа vnode заводятся операционной системой для каждого активного (открытого) файла в единственном экземпляре, поэтому структуры file могут ссылаться на одну и ту же структуру vnode.

    Структуры vnode не связаны в какой-либо список. Они появляются по требованию в системном пуле памяти и присоединяются к структуре данных, которая инициировала появление этого vnode, с помощью соответствующего указателя. Например, в случае структуры file в ней используется указатель f_vnode на соответствующую структуру vnode, описывающую нужный файл. Аналогично, если файл связан с образом процесса (то есть это файл, содержащий выполняемый модуль), то отображение сегмента памяти, содержащего части этого файла, осуществляется посредством указателя vp (в структуре segvn_data) на vnode этого файла.

    Все операции с файлами в UNIX System V Release 4 производятся с помощью связанной с файлом структуры vnode. Когда процесс запрашивает операцию с файлом (например, операцию open), то независимая от типа файловой системы часть ОС передает управление зависимой от типа файловой системы части ОС для выполнения операции. Если зависимая часть обнаруживает, что структуры vnode, описывающей нужный файл, нет в оперативной памяти, то зависимая часть заводит для него новую структуру vnode.

    Для ускорения доступа к файлам в UNIX System V Release 4 используется механизм быстрой трансляции имен файлов в соответствующие им ссылки на структуры vnode.Этот механизм основан на наличии кэша, хранящего максимально 800 записей о именах файлов и указателях vnode.


    Содержание раздела