Читаем Операционная система UNIX полностью

Каждая подключенная файловая система представлена на независимом уровне в виде структуры vfs, аналоге записи таблицы монтирования дисковой файловой системы. Структуры vfs всех подключенных файловых систем организованы в виде односвязного списка, в совокупности обеспечивая информацию, необходимую для обслуживания всего иерархического дерева, а также информацию о реальной файловой системе, которые не изменяются на протяжении работы. Первой записью списка всегда является корневая файловая система. В дальнейшем, список vfs мы будем называть устоявшимся термином — таблица монтирования. Поля структуры vfs приведены в табл. 4.3.

Таблица 4.3. Поля структуры vfs

struct vfs *vfs_nextСледующая файловая система в списке монтирования.
struct vfsops *vfs_opОперации файловой системы.
struct vnode *vfs_vnodecoveredvnode, перекрываемый файловой системой.
int vfs_flagФлаги: только для чтения, запрещен бит SUID и т.д.
int vfs_bsizeРазмер блока файловой системы.
caddr_t vfs_dataУказатель на специфические данные, относящиеся к реальной файловой системе.

Поле vfs_data содержит указатель на данные реальной файловой системы. Например, для дисковой файловой системы s5fs, это поле указывает на суперблок, размещенный в памяти.

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

Таблица 4.4. Операции файловой системы

int (*vfs_mount)()Подключает файловую систему. Обычно операция включает размещение суперблока в памяти и инициализацию записи в таблице монтирования.
int (*vfs_unmount)()Отключает файловую систему. Операция включает актуализацию данных файловой системы на накопителе (например, синхронизацию дискового суперблока и его образа в памяти).
int (*vfs_root)()Возвращает корневой vnode файловой системы.
int (*vfs_statfs)()Возвращает общую информацию о файловой системе, в частности: размер блока хранения данных, число блоков, число свободных блоков, число inode.
int (*vfs_sync)()Актуализирует все кэшированные данные файловой системы.
int (*vfs_fid)()Возвращает файловый идентификатор (fid — file Identifier), однозначно адресующий файл в данной файловой системе. В качестве fid может, например, выступать номер inode реальной файловой системы.
int (*vfs_vget)()Возвращает указатель на vnode для файла данной файловой системы, адресованного fid.

Для инициализации и монтирования реальной файловой системы UNIX хранит коммутатор файловых систем (File System Switch), адресующий процедурный интерфейс для каждого типа файловой системы, поддерживаемой ядром. UNIX System V для этого использует глобальную таблицу, каждый элемент которой соответствует определенному типу реальной файловой системы, например s5fs, ufs или nfs. Элемент этой таблицы vfssw имеет поля, указанные в табл. 4.5.

Таблица 4.5. Коммутатор файловых систем

char *vsw_nameИмя типа файловой системы
int (*vsw_init)()Адрес процедуры инициализации
struct vfsops *vsw_vfsopsУказатель на вектор операций файловой системы
long vsw_flagФлаги

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

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

Перейти на страницу:

Похожие книги

Архитектура операционной системы UNIX (ЛП)
Архитектура операционной системы UNIX (ЛП)

Настоящая книга посвящена описанию внутренних алгоритмов и структур, составляющих основу операционной системы (т. н. «ядро»), и объяснению их взаимосвязи с программным интерфейсом. Таким образом, она будет полезна для работающих в различных операционных средах. При работе с книгой было бы гораздо полезнее обращаться непосредственно к исходному тексту системных программ, но книгу можно читать и независимо от него.  Во-вторых, эта книга может служить в качестве справочного руководства для системных программистов, из которого последние могли бы лучше уяснить себе механизм работы ядра операционной системы и сравнить между собой алгоритмы, используемые в UNIX, и алгоритмы, используемые в других операционных системах. Наконец, программисты, работающие в среде UNIX, могут углубить свое понимание механизма взаимодействия программ с операционной системой и посредством этого прийти к написанию более эффективных и совершенных программ.

Морис Дж Бах , Морис Дж. Бах

ОС и Сети, интернет / ОС и Сети / Книги по IT