Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Вопросы и ответы по ОС.doc
Скачиваний:
37
Добавлен:
27.08.2019
Размер:
3.35 Mб
Скачать

Уровень виртуальной файловой системы

VFS действует как корневой уровень интерфейса файловой системы. VFS следит за всеми поддерживаемыми и всеми смонтированными на данный момент файловыми системами.

Файловые системы в Linux можно динамически добавлять и удалять с помощью нескольких функций регистрации. В ядре хранится список поддерживаемых файловых систем, который можно просмотреть из пространства пользователя посредством файловой системы /proc. В этом виртуальном файле также показаны устройства, связанные на текущий момент с файловыми системами. Для того, чтобы добавить новую файловую систему в Linux, вызывается register_filesystem. Эта команда имеет один аргумент - ссылку на структуру файловой системы (file_system_type), которая определяет название файловой системы, набор атрибутов и две функции системных блоков. Файловая система также может быть незарегистрированной.

Регистрация новой файловой системы заключается в добавлении этой системы и относящейся к ней информации в список file_systems (см. рисунок 2 и linux/include/linux/mount.h). Этот список определяет поддерживаемые файловые системы. Просмотреть его можно, введя в командной строке cat /proc/filesystems.

Рисунок 2. Файловая система, зарегистрированная в ядре

Другой структурой, поддерживаемой VFS, являются смонтированные файловые системы (см. рисунок 3). Она предоставляет список смонтированных на данный момент файловых систем (см. linux/include/linux/fs.h). Она ссылается на структуру системного блока superblock, о котором я расскажу ниже.

Рисунок 3. Список смонтированных файловых систем

Системный блок

Системным блоком (superblock) называется структура, представляющая файловую систему. В нее входит информация, необходимая для управления файловой системой во время работы. К такой информации относится название файловой системы (например, ext2), размер файловой системы и ее состояние, ссылку на блочное устройство и информацию метаданных (например, списки свободных блоков и т.п.). Как правило, системный блок хранится на носителе, но если его нет, он может быть создан в реальном времени. Структуру системного блока (см. рисунок 4) можно найти в ./linux/include/linux/fs.h.

Рисунок 4. Структура системного блока и работа узлов inode

Одним из важнейших элементов системного блока является определение его операций. Эта структура определяет набор функций для управления узлами inodes файловой системы. Например, inodes могут выделяться с помощью alloc_inode и удаляться с помощью destroy_inode. Вы можете считывать и записывать inodes с помощью команд read_inode и write_inode и синхронизировать файловую систему с помощью команды sync_fs. Структура super_operations расположена в ./linux/include/linux/fs.h. В каждой файловой системе имеются собственные методы inode, которые реализуют работу и выполняют общую абстракцию на уровень VFS.

Узлы inode и dentry

Узел inode представляет объект файловой системы с уникальным идентификатором. Каждая файловая система предоставляет методы преобразования имен файлов в уникальные идентификаторы inode и затем – в ссылки на inode. На рисунке 5 показана часть структуры inode вместе с несколькими связанными структурами. Обратите внимание, в частности, на inode_operations и file_operations. Каждая из этих структур ссылается на отдельные операции, которые могут выполняться с inode. Например, inode_operations определяет операции, которые работают напрямую с inode, а file_operations относится к методам, которые работают с файлами и директориями (стандартные системные вызовы).

Последние использованные узлы inodes и записи dentries хранятся в кэше inode и кэше директорий соответственно. Обратите внимание, что каждому inode в кэше inode соответствует запись dentry в кэше директорий. Структуры inode и dentry определены в ./linux/include/linux/fs.h.

Рисунокк 5. Структура inode и связанные с ней операции

Буферный кэш

За исключением отдельных реализаций файловых систем (которые можно найти в ./linux/fs), в нижней части уровня файловой системы располагается буферный кэш. Здесь хранятся запросы на чтение и запись от отдельных файловых систем и физических устройств (посредством драйверов устройств). Из соображений производительности в Linux предусмотрен кэш запросов, позволяющий не обращаться по каждому запросу к физическому устройству. Вместо этого в нем кэшируются последние использованные буферы (страницы), которые могут быть быстро предоставлены отдельным файловым системам.