Последовательность действий при монтировании
Утилита монтирования - mount. Демонтирования – umont. Аргументы – точка монтирования.
Аргументы:
- тип ФС;
- точка монтирования;
- дополнительны данные, связанные с реальной ФС;
- флаг (если требуются).
Для QNX: mount dos /dev/mnt/fd0. Для UNIX: mount dos /dev/fd0/mnt
Точка монтирования.
При монтировании осуществляются следующие действия:
1) Поиск vnode (lookup(), name_i()), соответствующей точке монтирования.
2) Проверяется, является ли vnode каталогом и не используется ли другими ФС данная (.) монтир-ия.
3) Поиск элемента-коммутатора ФС vfssw, который соответствует типу монтируемой ФС.
4) Процедура инициализации этого элемента (размещение специальных данных) – init().
5) Ядро размещает структуру vfs и помещает указатель vfs в список подключённых ФС.
6) Заполнение поля *vfs_vnodecovered. Сюда записывается ссылка на точку монтирования. Вычисление этого указателя производится с учетом всех путей. Если ФС – корневая (root) – записывается 0.
7) Заполнение поля *vfs_op – указатель на список операции, определённых для данной ФС.
8) Указатель на данный элемент (vfs) сохраняется в *v_vfsmountedhere/
9) Вызов функции vfs_mount() для данной ФС, он имеет возможность формировать реальную ФС.
Происходит проверка прав монтирования ФС:
- размещение и инициализация файлов данного типа;
- размещение vnode для корневого каталога, подключённого для данной ФС, доступ к которому возможен с помощью операции vfs_root.
10) После подключения ФС, она м.б. адресована по имени точки монтирования (/mnt либо /dev/fd0).
30. Файловые дескрипторы и трансляция имён
Прикладные процессы работают с файлами и модифицируют их. При работе с фалами мы работаем либо с файловыми дескрипторами, либо с именами. Ядро же различает файлы по индексному дескриптору => требуется установка соответствия между файловыми дескрипторами и индексными дескрипторами. В большинстве случаев используется трансляция имен.
Системные вызов, требующие трансляции имен: exec(), chown(), chgrp(), chmod(), rmdir, mkdir, mknode, open(), link()…
Для трансляции имен существенно указывать полный или относительный путь к файлу.
Если есть точка монтирования, то для проведения трансляции необходимо выполнить vfs_root() для перехода через точку монтирования, в результате которого получается vnode корневой системы.
Трансляция продолжается до тех пор, пока не будут просмотрены все имена. В результате завершения операции трансляции – возвращении виртуального дескриптора.
Доступ к ФС из процесса.
В системной таблице содержится следующая информация:
F_flag = fread;
F_cont=2;
F_vnode=03564; *
F_offset=0x32;
F_flag = fwrite;
F_cont=1;
F_vnode=03304; **
F_offset=0x16;
Окончательная таблица.
Виртуальная ФС позволяет пройти от пользовательского процесса до устройства.
Файловые дескрипторы получаются процессом в результате системных вызовов из пользовательских приложений. Файловый дескриптор – индекс в таблице файловых дескрипторов каждого из процессов. Хранится эта таблица в u_area каждого процесса.
Существует системная таблица, в которую переписывается информация из всех таблиц ФД всех активных процессов. Поскольку эта системная таблица одна на всех – возможны повторения. Каждая активная запись представляет открытый файл и адресует область таблицы. Существует суммарная таблица виртуальных дескрипторов, где каждый файл упоминается 1 раз. Делается соответствующая запись и по этим записям имеется возможность обратиться к реальной ФС, используя вышеописанные структуры.