Шрифт:
Основные поля vnode приведены в табл. 4.1.
Таблица 4.1. Поля vnode
Поле | Описание |
---|---|
u_short vflag | Флаги vnode |
u_short v_count | Число ссылок на vnode |
struct filock *v_filocks | Блокировки файла |
struct vfs *v_vfsmountedhere | Указатель на подключенную файловую систему, если vnode является точкой монтирования |
struct vfs *v_vfsp | Указатель на файловую систему, в которой находится файл |
enum vtype v_type | Тип vnode: обычный файл, каталог, специальный файл устройства, символическая связь, сокет |
caddr_t v_data | Указатель на данные, относящиеся к реальной файловой системе |
struct op | Операции vnode |
Каждый vnode содержит число ссылок
Поле
Поле
Набор операций над vnode указан полем
Таблица 4.2. Операции с vnode виртуальной файловой системы
int (*vn_open) | Открыть vnode. Если операция предусматривает создание клона (размножение), то в результате будет размещен новый vnode. Обычно операции такого типа характерны для специальных файлов устройств. |
int (*vn_close) | Закрыть vnode. |
int (*vn_read) | Чтение данных файла, адресованного vnode. |
int (*vn_write) | Запись в файл, адресованный vnode. |
int (*vn_ioctl) | Задание управляющей команды. |
int (*vn_getaddr) | Получить атрибуты vnode: тип vnode, права доступа, владелец-пользователь, владелец-группа, идентификатор файловой системы, номер inode, число связей, размер файла, оптимальный размер блока для операций ввода/вывода, время последнего доступа, время последней модификации, время последней модификации vnode, число занимаемых блоков. |
int (*vn_setaddr) | Установить атрибуты vnode. Могут быть изменены UID, GID, размер файла и времена доступа и модификации. |
int (*vn_access) | Проверить права доступа к файлу, адресованному vnode. При этом производится отображение между атрибутами доступа файлов UNIX и атрибутами реальной файловой системы (например, DOS). |
int (*vn_lookup) | Произвести трансляцию имени файла в соответствующий ему vnode. |
int (*vn_create) | Создать новый файл и соответствующий ему vnode. |
int (*vn_remove) | Удалить имя файла в указанном vnode каталоге. |
int (*vn_link) | Создать жесткую связь между именем файла и vnode. |
int (*vn_mkdir) | Создать новый каталог в указанном vnode каталоге. |
int (*vn_rmdir) | Удалить каталог. |
int (*vn_readdir) | Считать записи каталога, адресованного vnode. |
int (*vn_symlink) | Создать символическую связь между новым именем и именем файла, расположенном в указанном vnode каталоге. |
int (*vn_readlink) | Чтение файла — символической связи. |
int (*vn_fsync) | Синхронизировать содержимое файла — записать все кэшированные данные. |
int (*vn_inactive) | Разрешить удаление vnode, т.к. число ссылок на vnode из виртуальной файловой системы стало равным нулю. |
Взаимосвязь между независимыми дескрипторами (vnode) и зависимыми от реализации метаданными файла показана на рис. 4.8.
Рис. 4.8. Метаданные файла виртуальной файловой системы
Монтирование файловой системы
Прежде чем может состояться работа с файлами, соответствующая файловая система должна быть встроена в существующее иерархическое дерево.
Только после этого ядро сможет выполнять файловые операции, такие как создание, открытие, чтение или запись в файл. Эта операция встраивания получила название подключения или монтирования файловой системы.
Каждая подключенная файловая система представлена на независимом уровне в виде структуры
Таблица 4.3. Поля структуры vfs
struct vfs *vfs_next | Следующая файловая система в списке монтирования. |
struct vfsops *vfs_op | Операции файловой системы. |
struct vnode *vfs_vnodecovered | vnode, перекрываемый файловой системой. |
int vfs_flag | Флаги: только для чтения, запрещен бит SUID и т.д. |
int vfs_bsize | Размер блока файловой системы. |
caddr_t vfs_data | Указатель на специфические данные, относящиеся к реальной файловой системе. |
Поле
Поле