Операционные системы. Управление ресурсами

       

Базовая файловая система



7.5. Базовая файловая система.

Дескриптор файла

Выше мы уже неоднократно упоминали дескриптор файла, и читатель, наверное, уже сделал правильный вывод о том, что эта структура данных является ключевой при переводе виртуального представления файла в реальное. Дескриптор однозначно связан с физическим файлом, но храниться может как вместе с файлом, так и отдельно от него. В любом случае, однако, дескриптор файла является прозрачным для процессов пользователей, он обрабатывается только ОС. Дескриптор содержит информацию о физической природе файла и информацию о его использовании и защите. Естественно, что формат дескриптора определяется спецификациями конкретной ОС, и мы можем дать только приблизительное перечисление его полей. В общем случае в дескриптор файла могут входить следующие составляющие:

  • тип файла (файл данных, косвенный файл, каталог, файл-устройство и т.п.);
  • тип данных файла (текст, объектный модуль, программа и т.п.);
  • сведения об организации файла (для перехода от логической структуры к физической);
  • размер файла;
  • план (layout) размещения файла на устройстве внешней памяти;
  • список прав доступа;
  • время (создания, последней модификации, последнего доступа);
  • счетчик алиасов файла;
  • и т.д., и т.п.

Некоторые из входящих в состав дескриптора подструктуры данных мы рассмотрим ниже более подробно. В основном содержимое дескриптора формируется при создании файла или каталога (системные вызовы createFile, createDirectory ), некоторые поля изменяются при работе с файлом. Предоставляем читателю самому проследить, как системные вызовы, описанные выше, работают с дескрипторами файлов/каталогов.

Наиболее важным для дескриптора файла является системный вызов open , он производит активизацию дескриптора. Для файлов на устройствах внешней памяти при этом производится считывание дескриптора в оперативную память и построение его расширения, называемого дескриптором открытого файла. Для устройств, представляемых в виде виртуальных файлов, файловых дескрипторов на внешней памяти не существует, но в оперативной памяти открытие такого виртуального файла вызывает построение дескриптора открытого файла, отличающегося от дескриптора открытого файла на внешней памяти, как правило, содержимым полей, но не их форматом. Для каталогов системный вызов open не выполняется явным образом, но при выполнении функций поиска по заданному пути в логической ФС активизируются дескрипторы всех каталогов, входящих в путь.

В расширение дескриптора открытого файла в оперативной памяти могут входить:

  • счетчик открытий файла (файл может одновременно использоваться несколькими процессами);
  • замок (lock) разделяемого доступа;
  • режим обработки;
  • режим буферизации;
  • текущее положение файлового курсора;
  • идентификация устройства, на котором расположен файл;
  • информация, зависящая от типа файла.

Так, например, при подключении тома к ФС в виде ветви общего дерева каталогов, в памяти создается дескриптор для псевдокаталога, которым представлен подключенный том. Этот дескриптор содержит признак, описывающий его, как "точку монтирования", и ссылку на элемент специальной системной таблицы монтирования. Элемент же таблицы содержит описание тома и указатели как на корневой каталог тома, так и обратно - на "точку монтирования", что позволяет проходить эту точку при движении по дереву в обоих направлениях.

Очевидно, что некоторые поля дескриптора должны изменяться автоматически при работе с файлом. Все изменения, выполненные в дескрипторе в ходе работы с открытым файлом, запоминаются в его копии на внешней памяти при выполнении системного вызова close .

Обычно ОС предоставляют также в составе своего API тот или иной набор системных вызовов, сводящихся к двум типам: getFileInfo, setFileInfo - получить или установить информацию о файле. Выполнение вызовов этой группы позволяет прочитать/записать значения отдельных полей файловых дескрипторов.

Управление доступом

В некоторых ОС одной из важнейших функций базовой ФС является контроль за доступом пользователей к файлам. Мы говорим "в некоторых", так как в ряде ОС проблема контроля доступа решается на общесистемном уровне, и доступ к файлам - ее частный случай. Такие ОС рассматриваются нами в главе 10, здесь же мы остановимся на случае, когда доступ к файлам контролируется базовой ФС, и рассмотрим его на примере ОС Unix.

В Unix возможны следующие режимы доступа к файлам: r - чтение, w - запись, x - выполнение. Возможны также их комбинации.

Пользователи подразделяются на следующие категории:

  • владелец - пользователь, который создал файл;
  • группа - пользователи, входящие в ту же группу, что владелец файла;
  • все остальные пользователи.

Для каждого файла определяется допустимый режим доступа для каждой из этих трех групп. Так, например, если для файла доступ закодирован в виде: rwxr-x--x,

то это означает, что владелец имеет право читать, писать и выполнять файл (rwx), остальные члены группы владельца имеют право читать и выполнять файл (r-x), все другие пользователи - только выполнять (--x).

Идентификаторы владельца и группы владельца входят в состав файлового дескриптора. Для кодировки прав доступа достаточно трех 3-битных позиционных кодов, которые также включаются в дескриптор.

Каждая активизация файлового дескриптора базовой ФС включает в себя проверку прав доступа. В ходе проверки определяется идентификатор владельца процесса, открывающего файл. Этот идентификатор сравнивается с идентификатором владельца файла и с идентификатором группы владельца файла. В зависимости от результатов сравнения определяется категория пользователя, открывающего файл и выбирается соответствующий 3-битный код доступа. Режим доступа, запрашиваемый при открытии, сравнивается с кодом доступа, и при несоответствии их происходит отказ в доступе.

Как мы отмечали выше, с точки зрения базовой ФС каталоги практически ничем не отличаются от файлов, следовательно, все, что говорилось выше о правах доступа, относится и к каталогам.

Поскольку логическая ФС при поиске обращается к базовой ФС для чтения информации из каталогов, а базовая ФС производит при этом проверку прав доступа, то файл может быть доступен для данного пользователя только, если для него доступны все подкаталоги, входящие в путь к файлу.

Как определяется доступ к алиасам и косвенным файлам? Что касается алиасов, то ответ зависит от того, связываются ли права доступа с именем или с файлом. До сих пор мы говорили о том, что права доступа хранятся в файловом дескрипторе, поскольку физическому файлу соответствует единственный файловый дескриптор, права доступа к файлу по всем алиасам будут одинаковы. Возможно, однако, хранение прав доступа не в дескрипторе, а в элементе каталога, в этом случае разные алиасы могут обеспечивать разные права доступа к одному файлу. Возможны два варианта реализации прав доступа к косвенному файлу. В первом варианте в псевдодескрипторе, содержащем ссылку указываются права доступа, как для обычного файла, при соответствии конкретного режима доступа этим правам проверка прав доступа заканчивается. Во втором случае проверка прав доступа продолжается и для всех каталогов, входящих в путь, указанный в ссылке.



Содержание раздела