Реализация файловой системы. Общая структура файловой системы

 

Файловые системы хранятся на дисках. Большинство дисков делится на ряд разделов с независимой файловой системой на каждом разделе. Сектор «0» диска называется главной загрузочной записью (MBR, Master Boot Record) и используется для загрузки компьютера. В конце главной загрузочной записи содержится таблица разделов, в которой хранятся начальные и конечные адреса (номера блоков) каждого раздела. Один из разделов помечен в таблице как активный. При загрузке компьютера BIOS считывает и исполняет MBR-запись, после чего загрузчик в MBR-записи определяет активный раздел диска, считывает его первый блок, называемый загрузочным, и исполняет его. Программа, находящаяся в загрузочном блоке, загружает операционную систему, которая находится в этом разделе. Каждый дисковый раздел начинается с загрузочного блока, даже если в нем не содержится загружаемой операционной системы, которая в дальнейшем может быть установлена. Остальное строение раздела диска зависит от типа операционной системы.

 


Ряд файловых систем содержат элементы, показанные на рис. 4.6. Один из таких элементов, суперблок содержит ключевые параметры файловой системы и считывается в память при загрузке компьютера или при первом обращении к файловой системе. Типичная информация, хранящаяся в суперблоке, включает числовой идентификатор файла, позволяющий различать системные файлы, количество блоков в файловой системе, а также другую ключевую административную информацию:

- тип файловой системы;

- размер файловой системы в блоках;

- размер массива индексных узлов;

- размер логического блока.

Описанные структуры данных создаются на диске в результате его форматирования (например, утилитами format, makefs и др.). В файловых системах современных операционных систем для повышения устойчивости поддерживается несколько копий суперблока. В некоторых версиях Unix суперблок включал также и структуры данных, управляющие распределением дискового пространства, в результате чего суперблок непрерывно подвергается модификации, что снижало надежность файловой системы в целом. Поэтому в современных операционных системах структуры данных, описывающих дисковое пространство, выделяют в отдельный раздел.

Далее располагается информация о свободных блоках файловой системы (например, в виде битового массива или списка указателей) и массив индексных узлов (ilist), который содержит список индексов, соответствующих файлам данной файловой системы. Размер массива индексных узлов определяется администратором при установке системы. Максимальное число файлов, которые могут быть созданы в файловой системе, определяется числом доступных индексных узлов. Следом расположена область корневого каталога, содержащего вершину дерева файловой системы. Остальное место дискового раздела занимают подкаталоги и файлы.

Реальные данные файлов хранятся в блоках данных. Размер логического блока данных может задаваться при форматировании файловой системы. Заполнение диска содержательной информацией предполагает использование блоков хранения данных для файлов директорий и обычных файлов и имеет следствием модификацию массива индексных узлов и данных, описывающих пространство диска. Отдельно взятый блок данных может принадлежать только одному файлу в файловой системе.

Для организации хранения информации на диске пользователь последовательно выполняет следующие действия:

- форматирование – выделяя на диске место для структур данных, которые описывают состояние файловой системы в целом;

- создание структуры каталогов (директорий), которые являются списками вложенных каталогов и файлов;

- заполнение дискового пространства файлами, приписывая их конкретному каталогу.

Система хранения данных на дисках может быть структурирована следующим образом (рис. 4.7.). Нижний уровень – оборудование: магнитные диски с подвижными головками, представляющие собой пакеты магнитных пластин, между которыми на одном рычаге двигается пакет магнитных головок. Шаг движения головок дискретный. Каждому положению пакета головок логически соответствует цилиндр магнитного диска – группа дорожек одного радиуса, расположенных на поверхностях магнитных дисков. Цилиндры делятся на дорожки (треки). Каждая дорожка размечается на одинаковое количество секторов – блоков фиксированного размера. Размер сектора (объем поля данных) устанавливается контроллером или драйвером. Физический адрес сектора на диске определяется с помощью трех координат: номера цилиндра, номера рабочей поверхности диска, номера сектора на дорожке (например: диск 2, цилиндр 74, сектор 10). К секторам диска файловой системой организуется прямой доступ.


Непосредственно с дисками взаимодействует система ввода-вывода, которая предоставляет в распоряжение файловой системы дисковое пространство в виде непрерывной последовательности блоков фиксированного размера. Файловая система имеет дело с логическими блоками, каждый из которых имеет номер (от 0 или 1 до N). Размер логических блоков файла совпадает или является кратным размеру физического блока диска и может быть задан равным размеру страницы виртуальной памяти, поддерживаемой аппаратурой компьютера совместно с операционной системой. В структуре системы управления файлами выделяют:

- базисную подсистему – подсистему, которая отвечает за выделение дискового пространства конкретным файлам;

- логическую подсистему – подсистему более высокого уровня, которая использует структуру дерева директорий для предоставления базисной подсистемы информации, исходя из полного имени файла, и которая отвечает за авторизацию доступа к файлам.

Стандартный запрос на открытие (open) или создание (creat) файла поступает от прикладной программы посредством интерфейса системных вызовов к логической подсистеме. Логическая подсистема, используя структуру директорий, проверяет права доступа и вызывает базовую подсистему для получения доступа к блокам файла. После этого файл считается открытым, он содержится в таблице открытых файлов, и прикладная программа получает в свое распоряжение дескриптор[3] (операционная система Unix) или handle[4] (операционная система Microsoft) этого файла.

Дескриптор файла (описатель файла) является ссылкой на файл в таблице открытых файлов и используется в запросах прикладной программы на чтение-запись из этого файла. Запись в таблице открытых файлов указывает через систему выделения блоков диска на блоки данного файла. Если к моменту открытия файл уже используется другим процессом (содержится в таблице открытых файлов), то после проверки прав доступа к файлу может быть организован совместный доступ. Новому процессу также возвращается дескриптор.

Современные операционные системы предоставляют пользователю возможность работать сразу с несколькими файловыми системами (рис. 4.8.), например, Linux работает с Ext2fs, FAT и др. Диспетчер файловых систем (manager filesystem) связывает запросы прикладной программы с конкретной файловой системой. Драйвер файловой системы на этапе инициализации регистрируется у диспетчера файловых систем, сообщая ему точки входа, для последующих обращений к данной файловой системе.

Современная файловая система имеет многоуровневую структуру (рис. 4.8.), на верхнем уровне которой располагается диспетчер файловых систем (filesystem manager). Он обеспечивает интерфейс между запросами приложения и конкретной файловой системой, к которой обращается это приложение. Диспетчер преобразует запросы в формат, воспринимаемый уровнем файловых систем. Каждый компонент уровня файловых систем выполнен в виде драйвера соответствующей файловой системы и поддерживает определенную организацию файловой системы. Диспетчер файловых систем является единственным модулем, который может обращаться к драйверу файловой системы. Каждый драйвер файловой системы в процессе собственной инициализации регистрируется у диспетчера, передавая ему таблицу точек входа, которые будут использоваться при последующих обращениях к файловой системе.

 
 

 

Для выполнения своих функций драйверы файловых систем обращаются к подсистеме ввода-вывода, образующей следующий слой файловой системы новой архитектуры. Подсистема ввода-вывода – это составная часть файловой системы, которая отвечает за загрузку, инициализацию и управление всеми модулями низших уровней файловой системы. Обычно эти модули представляют собой драйверы портов, которые непосредственно занимаются работой с аппаратными средствами. Кроме этого подсистема ввода-вывода обеспечивает некоторый сервис драйверам файловой системы, что позволяет им осуществлять запросы к конкретным устройствам. Подсистема ввода-вывода должна постоянно присутствовать в памяти и организовывать совместную работу иерархии драйверов устройств.

Многоуровневый механизм работы файловой системы реализован посредством цепочек вызовов. В ходе инициализации драйвер устройства может добавить себя к цепочке вызова некоторого устройства, определив при этом уровень последующего обращения. Подсистема ввода-вывода помещает адрес целевой функции в цепочку вызова устройства, используя заданный уровень для того, чтобы должным образом упорядочить цепочку. По мере выполнения запроса, подсистема ввода-вывода последовательно вызывает все функции, ранее помещенные в цепочку вызова.

Поддержка нескольких файловых систем может реализовываться по-другому, например, исходя из концепции виртуальной файловой системы. Виртуальная файловая система (vfs) представляет собой независимый от реализации уровень и опирается на реальные файловые системы (ufs, ѕ5 и FFS (UNIX); FAT и NTFS (Windows); Ext2fs (Linux)). При этом возникают структуры данных виртуальной файловой системы типа виртуальных индексных узлов vnode, которые обобщают индексные узлы конкретных систем.

Реализация файловой системы связана с вопросами связывания имени файла и блоков его данных; с разделением файлов и управлением дисковым пространством; с логическими блоками диска.