Ю. Вахалия - UNIX изнутри (2003) (1114670), страница 86
Текст из файла (страница 86)
Синтаксис вызова л)оипт в эЧК4 выглядит следующим образом: всэпс (ярес, 41г, Ладя. 1уре. датарсг, оа:а)еп); где ярес является именем файла устройства, представляющим файловую систему, Жт — задает полное имя каталога, являющегося точкой монтирования, 1уре — строка, определяющая типа файловой системы, да1ар1т — указатель на дополнительные аргументы, зависящие от файловой системы, а 4а1а1еп является общей длиной блока этих дополнительных параметров.
В данном разделе мы опишем, как системный вызов л)овп1 реализуется ядром. 8.9.1. Виртуальный переключатель файловых систем Если в системе сконфигурированы файловые системы различных типов, то встает вопрос корректного соединения чподе и ч)я в таких реализациях. Ядру необходим некий механизм, подсказывающий ему, как правилыю осуществлять доступ к интерфейсным функциям каждой файловой системы. В ОС 3'ч'й4 для этой цели используется технология, получившая название виртуального переключателя файловых систем, являющегося глобальной таб. 8.9. йдонтирование файловой системы 367 лицей, в которой содержится по одному элементу для каждого типа файловой системы. Элементы таблицы описываются при помощи структуры чТввтч.
5ггцст чГ55ы ( спаг чГз павге; !* имя типа файловой системы *! тлт (*чГв тлт1)(): !* адрес процедуры инициализации *! зсгцсс чГворз *чГз чГзорз: !* вектор операций чГз для втой файловой системы *! ) чгззыг] 8.9 .2 . Реализация вызова йтйоип1 Системный вызов птоцпс запрашивает объект чпос(е для каталога, являющегося точкой монтирования при помощи функции (оо(гцррпО. Вызов удостоверяется, что структура чпот(е представляет каталог, и никакая другая файловая система не была раньше смонтирована на этот каталог. (Заметим, что функция (оо(гцррп() запрашивает ссылку на каталог, которая освобождается только после размонтировання системы.) Затем происходит поиск в таблице чТввгыЦ на предмет обнаружения элемента, совпадающего с именем дуре, После обнаружения необходимого элемента переключателя ядро загружает для него операцию чвтч тптс.
Этот вызов является операцией, зависящей от конкретной используемой файловой системы. Он производит размещение структур данных и ресурсов, необходимых для функционирования файловой системы. Затем ядро размещает новую структуру чТв и инициализирует ее. 1. Добавляет структуру в связанный список с головным элементом гоосчТв. 2. Задает в поле чТв ор ссылку на вектор чТзорв, указанный в элементе переключателя. 3.
Задает в поле чТз чпот(есочегед ссылку на чпот(е каталога, являющегося точкой монтирования. Затем ядро сохраняет указатель на структуру чТв в поле ч чТвгпоцпсед(тете структуры чпог(е покрываемого каталога. Процесс монтирования завершается вызовом Нг5 МОО)тТ применительно к чЬ, которая выполняет часть действий вызова гпоцпт, зависящих от типа подключаемой файловой системы. 8.9.3. Действия операции ЧРЗ МОАБИТ Каждая файловая система обладает собственной реализацией операции Нг5 ИОйм(Т. Эта функция должна выполнять следующие операции: + проведение проверки привилегий на операцию; + размещение и инициализация закрытого объекта данных файловой системы; + сохранение указателя на него в поле чТв г(ага объекта чТз; 8.10.
Операции иад файлами Збб + доступ к корневому каталогу файловой системы и инициализация его структуры чподе в памяти. Единственным способом доступа ядра к корню монтированной файловой системы является применение операции Нг5 кООТ. Часть чТз, зависящая от типа файловой системы, должна поддерживать информацию, необходимую для обнаружения корневого каталога. Локальные файловые системы обычно реализуют Нг5 МО()г(Т путем чтения метаданных файловой системы (таких как суперблок для з5гз) с диска, в то время как распределенные варианты систем могут посылать запрос на монтирование файл-серверу. 8.10.
Операции над файлами В этом разделе будет рассмотрена реализация некоторых файловых операций в архитектуре члоу/чеь Вы увидите описание системных вызовов орел и гезб, а начнем мы разговор с методики преобразования полных имен файлов. 8.10.1. Преобразование полных имен Независимая от файловой системы функция (оо)гцррп() преобразует полное имя файла и возвращает указатель на чпос)е выбранного файла. Функция также запрашивает ссылку на объект чпог)е. Начальная точка поиска зависит от того, является ли полное имя относительным или абсолютным. Если имя— относительное, то вызов (оо)сцррпО приступит к поиску в текущем каталоге, получая указатели чподе из поля ц сг)(г области ц.
Если задано абсолютное имя, процесс начнется с корневого каталога. Указатель на чподе для такого каталога является глобальной переменной, имеющей имя гооЫг'. Функция (оо)гцррп() запрашивает ссылку на начальный объект чподе (увеличивая тем самым для него значение счетчика ссылок) и затем входит в цикл, за каждую итерацию которого происходит просмотр одного полного имени. Цикл включает в себя определенную последовательность шагов.
Проверка, относится ли объект чпог)е к каталогу (до тех пор, пока не будет достигнут последний компонент). Эта информация содержится в поле ч ~уре структуры члене. ' Изменить корневой каталог (а также некоторые другие настройки) процесс может при помощи вызова сйгооь Это повлияет на интерпретацию ядром абсолютных имен для процесса. Вызывать смоот умеют большинство сценариев входа в систему в зависимости от того или иного процесса. Эта возможность может быть использована также и администраторами системы, ограничивающими доступ пользователей к дереву каталогов.
В этом случае (ооквррвб проверяет поле п.п го1г области п; если оно окажется равным нулю, то следующим шагом станет проверка переменной гоотг)гг, 8.10. Операции иад файлами 369 1. Если найденный компонент окажется «..», а текущий каталог является системным корневым каталогом — переход к следующему компоненту, Корневой каталог является прародителем самого себя. 2. Если найденный компонент окажется «..», а текущий каталог является корнем моитироваииой файловой системы — получение доступа к каталогу, являющемуся точкой монтирования. Флаг ЧкООТ всех корневых каталогов является установленным.
Поле ч чТзр указывает иа структуру чав файловой системы, в свою очередь содержащую указатель иа точку моитироваиия в поле чТз чпо6егесочеге6. Вызов для этого объекта чло6е операции ЧОР ЕООКОР. В результате произойдет вызов функции 1ооКцр для данной файловой системы (иалример, э5(ооКир(), цТэ (оойир() и т. д.). Функция ищет в каталоге комлоиеит и, если находит таковой, возвращает указатель иа чпо6е этого файла (размещая структуру в ядре, если это ие было сделало ранее).
Функция также запрашивает ссылку иа объект чло6е. 3. Если компонент ие найден, проверка, ие является ли ол лоследиим Если так, возврат с удачным кодом завершения (то есть вызывающий может создать файл), а также возврат указателя ла родительский каталог без освобождения ссылки иа него. В противоположном случае завершение выполнения с ошибкой ЕМОЕМТ, 4. Если новый комлолеит является точкой молтироваиия (поле ч чТэ гпоцп~е66еге != КОЕЕ), следование за указателем иа объект чТз моитированной файловой системы и вызов чВ гоо1 для возврата корневого объекта оноаге файловой системы. 5. Если новый компонент является символической ссылкой (ч 1уре == ЧЕМК), вызывается ЧОР 5УМЕ1МК для преобразования символической ссылки.
Добавление оставшейся части лолиого имени в содержимое ссылки и начало новой итерации. Если ссылка содержит абсолютное имя, процедура должна продолжиться с кориевого системного каталога. Вызывающий (ооКцррпо может передать функции флаг, запрещающий определение символической ссылки для последнего компонента полного имени. Эта возможность используется для некоторых системных вызовов, например, Ыа1, которым ие нужно просматривать символические ссылки в конце полных имен. Общее количество символических ссылок, просматриваемых функцией 1оойцррпо, ограничивается глобальной леремеииой МАХ5УМЕ1КК5 (по умолчанию равной 20). Переменная защищает от зависания в бесконечном цикле при неверно заданных символических ссылках, например в том случае, когда /х/у является ссылкой иа /х.
б. Освобождение каталога, в котором только что был завершен поиск Ссылка иа него была запрошеиа при проведении операции ЧОР ЕООКОР. С начальной точки ссылка в принудительном порядке была получена функцией 1ооКцррпо. 370 Глава 8. Базовые элементы и интерфейс файловой системы 7. В завершение — переход в начало цикла и продолжение поиска со следующего компонента каталога, представленного уже новым объектом чпойе. 8. Завершение выполнения, если компонентов больше не осталось. Если поиск оказался удачным, не освобождать ссылку на последнем объекте члоу и вернуть указатель на него процессу, инициировавшему процедуру поиска. 8.10.2. Кэш просмотра каталогов Кэш подстановки имен файлов — это основополагающий ресурс ОС, доступный любым реализациям файловых систем, желающим воспользоваться им, Он представляет собой кэш объектов (построенный по принципу (.К(), то есть в порядке «последнего недавно использовавшегосяь), содержащих указатель на чподе каталога, имени файла в этом каталоге, а также указатель на чпопе для этого файла.