Поддерживает логическую организацию файлов в виде последовательности байт. Различают обычные файлы, каталоги и специальные файлы. Имеет иерархическую структуру, каталог верхнего уровня всегда располагается на системном устройстве и называется root.
Для связи иерархии файлов, расположенных на разных носителях, используется вмонтирование и исполняется системным вызовом mount.
Используется три типа имени файлов – краткое, полное, относительное.
Привилегии доступа к файлу делятся на три категории: владелец, член группы владельца и все остальные. Так же в системе существует привилегированный пользователь , имеющий полные права доступа ко всем файлам системы.
Определенно три вида доступа к файлу – чтение, запись и выполнение. В общем случае файл может располагаться в несмежных блоках дисковой памяти и задается последовательностью блоков из 13ти элементов.
Вся информация о файле (кроме его символьного имени) хранится в специальной системной таблице – индексном дескрипторе inode-файлов. Индексные дескрипторы последовательно пронумерованы и хранятся в отдельной области файловой системы. Номер индексного дескриптора является уникальным именем файла. В дескрипторе ведется учет ссылок на этот файл из всех каталогов. Когда количество ссылок 0, дескриптор уничтожается.
Нулевой блок содержит загрузчик операционной системы. 1 блок – «супер блок» - содержит общие сведения о файловой системе: размер ФС (сколько занимает), размер области индексных дескрипторов, число дескрипторов, список свободных блоков, список свободных дескрипторов.
В области индексных дескрипторов они упорядочены по номерам.
1. Проверяется, существует ли файл и, если нет, то можно ли его создать.
2. Проверяются права доступа.
3. Если с файлом уже не ведется работа, то его индексный дескриптор копируется в ОП.
4. В области ядра создается структура типа File, отображающая текущее состояние и операции обмена данными с файлом.
5. Делается отметка в контексте процесса, совершившего системный вызов на операцию с данным файлом.
Информация о файловой системе и файлах разбивается на две части: зависимая от типа ФС и независимая. Ядро оперирует только независимой частью, а VFS транслирует его запросы в конкретные операции ФС. Независимая информация хранится в структуре ядра vnode, зависимая – inode.
Поддерживаются обычные файлы, каталоги, именованные конвейеры, символьные связи и отображения в памяти. Поддерживаемые ФС описываются массивом структур vfssw [].
Struct vfssw yfssw [] = {
{0, 0, 0, 0},
{“vxfs”, vxinit, &vx_ops, 0},
{“s5”, vx_init, &vx_ops, 0},
{“cdfs”, cdfsinit, &cdfs_ops, 0},
…
}
1- Символьное имя ФС, 2 – указатель на функцию инициализации, 3- указатель на структуру, описывающую функции, реализующие абстрактные операции ФС vfs над конкретной ФС, 4- флаги.
Функции инициализации вызываются во время инициализации ОС и отвечают за создание внутренней среды ФС каждого типа.
Абстрактные операции над файлами описываются в структуре vnodeops, и для каждой из них определен макрос с общим для всех типов ФС именем: vop_open, vop_read, ….
Работа ядра с файлами основана на использовании структуры vnode.
V_op используется для связи файла с конкретными реализациями файловых операций.
V_vfsp связывает файл с определенным типом ФС.
V_type – тип файла
V_pages – указывает на таблицу физических страниц памяти, если файл в неё отображен.
V_filockes - блокировки, примененные процессами к отдельным областям файлов.
V_data – это указатель на структуру inode.
Структуры vnode не связаны между собой, но каждый процесс содержит двунаправленный список своих файлов.
Поля структуры file:
flag – это режим открытия (только для чтения, для чтения и записи и тд)
struct vnode* f_vnode – это указатель на структуру vnode
offset – смещение в файле при операциях чтение/записи
struct cred* f_cred – указатель на структуру, содержащую права процесса, открывшего файл (в дескрипторе находится)
file* f_next, f_last – указатель предыдущий ина следующий файл