Главная страница Межпроцессное взаимодействие (состязание) открытия каждого из типов устройств в системе. Для дисковых устройств, будь то дисководы, жесткие диски или устройства в памяти, процедура единая - dev opcL В строке mess ptr->PROC NR = fp - fproc; вычисляется номер вызывающего процесса. Фактически работа выполняется функцией call task, которой передается указатель на сообщение и номер процесса. Эту функцию мы рассмотрим далее. Дополнительно dev opcl применяется и для закрытия устройств. Практически, с высоты этой функции единственная разница между открытием и закрытием состоит в том, что будет происходить после вызова calLtask. Среди прочих функций, вызываемых посредством dmap, следует упомянуть tty open и tty colse, обслуживающие последовательные линии, и ctty open и ctty close, работающие с консолью. Последняя из них, ctty close, практически представляет собой функцию-заглушку, так как она без оглядки на что-либо возвращает статус ОК . Выполнение системного вызова setsid требует некоторого участия файловой системы, что обеспечивается функцией do setsid. Один из системных вызовов, ioctl, обслуживается по большей части в файле device.c, так как он тесно связан с интерфейсом задач. Когда вызывается ioctl, функция dojoctl формирует сообщение и отправляет его соответствующей задаче. Программы, написанные с учетом требований POSIX, должны для управления терминалом использовать функции, объявленные в файле include/termios.h. Стандартная библиотека С в MINIX преобразует вызовы этих функций в вызовы ioctl. Системный вызов ioctl применяется и для выполнения множества разнообразных действий с устройствами, не являющимися терминалами. Многие из этих операций описаны в главе 3. Следующая функция в рассматриваемом нами файле объявлена как PRIVATE. Это небольшая вспомогательная процедура find dev, извлекающая из полного номера устройства старший и младший номера. Как уже было сказано ранее, чтение с большинства устройств и запись на них проходят через руки функции calljask. Она направляет сообщение нужной задаче в ядре при помощи sendrec. Попытка перенаправить сообщение может провалиться, если задача пытается перезапустить процесс в ответ на предыдущий запрос. Это, скорее всего, будет не тот процесс, запрос которого передается. Если calljask получает неинтерпретируемое ей сообщение, она выводит его на консоль. При нормальной работе MINIX подобных сообщений на консоли появляться не должно, но при разработке нового драйвера они вполне могут возникнуть. Устройство /dev/tty физически не существует, это просто имя, по которому пользователь в многопользовательской системе может обращаться к своему терминалу, не выясняя, какой именно терминал находится в его распоряжении. Когда необходимо отправить сообщение /dev/tty, вызывается функция call ctty, она определяет младший и старший номера для терминала и подставляет их в сообщение, прежде чем передать его calljask. Наконец, мы дошли до последней функции в файле, no dev. Ее адрес записывается в те ячейки таблицы, для которых не существует устройства. Например, она вызывается при попытке обратиться к сети с машины без сетевой поддержки. Данная функция возвращает код ошибки ENODEV и предотвращает крах системы при попытке доступа к несуществующим устройствам. 5.7.8. Инструменты общего назначения в файловой системе есть несколько используемых в разных местах многоцелевых утилит. Они собраны в файле utility.c. Первая процедура носит название clockjime. Она, чтобы узнать текущее реальное время, отправляет сообщение задаче часов. Следующая функция, fetch name, своим существованием обязана тому, что многие из системных вызовов одним из аргументов принимают имя файла. Если имя короткое, оно непосредственно включается в сообщение файловой системе, но имя длинное располагается в адресном пространстве пользователя, а в сообщении передается указатель на него. Функция fetch name проверяет, каким из способов передано имя, и получает его. Две другие функции работают с основными классами ошибок. Функция no sys обрабатывает ошибку, возникающую при вызове несуществующего системного вызова. Когда в системе происходит что-либо непоправимое, функция panic печатает сообщение и предлагает ядру прекратить работу. Две оставшиеся функции помогают MINIX решать проблему различного порядка байтов на различных машинах (в частности, Intel и Motorola). Функции conv2 и conv4 применяются при записи на диск структуры данных, например f-узла, или при считывании ее с диска. Порядок байтов, с которым создавалась файловая система, фиксируется в ее суперблоке. Если он отличается от порядка, используемого процессором, данные необходимо конвертировать, переставляя байты. Преобразование происходит прозрачно для остальной системы. Последний файл, содержащий две процедуры, носит имя putk.c. Обе они предназначены для печати сообщений. Стандартные библиотечные процедуры применять нельзя, так как они отправляют сообщения файловой системе. Данные же процедуры общаются напрямую с задачей терминала. Мы уже видели практически идентичную пару функций, когда рассматривали подобный файл в менеджере памяти. Резюме Со стороны файловая система представляется как коллекция файлов, каталогов и действий над ними. Можно считывать или записывать файлы, создавать и уничтожать каталоги и перемещать файлы из одного каталога в другой. В большинстве современных файловых систем поддерживается иерархическая структура каталогов, когда в один каталог может быть вложен второй и т. д., до бесконечности. Вопросы 553 Если же смотреть изнутри, открывается совершенно другая картина. Разработчики файловой системы должны заботиться о том, как выделяется место, и отслеживать, какой блок какому файлу соответствует. Мы увидели, что в разных файловых системах структура каталога различается. Надежность и производительность файловой системы тоже имеет существенное значение. Исключительно важны как для пользователей, так и для разработчиков системы вопросы безопасности и защиты. Мы обсудили известные уязвимости старых систем и общие проблемы, вероятные у многих других. Размышляя о защите, мы также рассмотрели аутентификацию, с паролем и без, списки управления доступом и другой вид пропускных систем - мандатные, а также матричную модель защиты. Наконец, мы подробно изучили файловую систему MINIX. Ее код велик, но не очень сложен. Файловая система принимает запросы от пользовательских процессов, находит в таблице системных вызовов адрес процедуры и вызывает эту процедуру, чтобы обслужить запрос. Благодаря модульной структуре и тому, что файловая система вынесена из ядра, ее можно легко выделить из MINIX, превратив в самостоятельный сетевой файловый сервер, внеся лишь незначительные поправки. При обращении к файлу MINIX буферизует блоки в кэше и пытается делать упреждающее чтение при последовательном режиме работы с файлом. Если кэш достаточно велик, то при операциях, когда многократно происходят обращения к одному и тому же набору программ (например, в процессе компиляции), нужный файл уже с высокой вероятностью окажется в памяти. Вопросы 1. Создайте пять различных путей к файлу /etc/passwd. Подсказка: используйте элементы каталога . и .. . 2. В системах, поддерживающих последовательный доступ, всегда имеется операция для перемотки файлов. Нужна ли такая операция в системах, поддерживающих файлы произвольного доступа? 3. В некоторых операционных системах предоставляется системный вызов rename, позволяющий сменить имя файла. Есть ли разница между использованием этого системного вызова и копированием файла с новым именем с последующим удалением старого файла? 4. Рассмотрите дерево каталогов на рис. 5.5. Если /usr/jim является рабочим каталогом, как будет выглядеть абсолютный путь для файла с относительным путем ../ast/x? 5. Как указывалось в тексте, работа с монолитными файлами приводит к фрагментации диска, поскольку теряется некоторая часть дискового пространства в последних блоках файлов, чья длина не кратна целому числу блоков. Является эта фрагментация внутренней или внешней? Приведите аналогию с вопросом, обсуждавшимся в предыдущей главе.
|
© 2000 - 2024 ULTRASONEX-AMFODENT.RU.
Копирование материалов разрешено исключительно при условии цититирования. |