Главная страница  Межпроцессное взаимодействие (состязание) 

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 [ 179 ] 180 181 182 183 184 185 186 187

открытия каждого из типов устройств в системе. Для дисковых устройств, будь то дисководы, жесткие диски или устройства в памяти, процедура единая - 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. Как указывалось в тексте, работа с монолитными файлами приводит к фрагментации диска, поскольку теряется некоторая часть дискового пространства в последних блоках файлов, чья длина не кратна целому числу блоков. Является эта фрагментация внутренней или внешней? Приведите аналогию с вопросом, обсуждавшимся в предыдущей главе.



1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 [ 179 ] 180 181 182 183 184 185 186 187

© 2000 - 2018 ULTRASONEX-AMFODENT.RU.
Копирование материалов разрешено исключительно при условии цититирования.