<<
>>

Инициализация файловой системы

Оставшуюся часть файла main, с составляют функции инициализации, выполняемые при запуске системы. Основную роль здесь играет функция fs_init, вызываемая файловой подсистемой на этапе запуска всей системы еще до входа в главный цикл.
Рассматривая в главе 2 планирование процессов, на рис. 2.22 мы показали начальную очередь процессов при запуске MINIX 3. Файловая система помещается в очередь с более низким приоритетом, чем менеджер процессов, поэтому можно быть уверенными в том, что менеджер процессов будет запущен раньше. Инициализация менеджера процессов была рассмотрена нами в главе 4. Создавая собственную часть таблицы процессов, менеджер процессов добавляет в загрузочный образ записи о себе и других процессах. При формировании каждой записи он посылает файловой системе сообщение, чтобы она могла инициализировать соответствующую запись в своей таблице процессов. Теперь мы можем ознакомиться со второй частью этого взаимодействия.

Когда файловая система начинает работу, она незамедлительно запускает собственный цикл в f s_init (строки 24189-24202).

Первой инструкцией цикла является вызов receive для получения сообщения, которое было отправлено функцией инициализации менеджера процессов pm_init в строке 18235. Каждое сообщение содержит номер и идентификатор процесса. Номер процесса используется в качестве индекса таблицы процессов файловой системы, а идентификатор сохраняется в поле fp_pid каждой ее записи. Далее для каждой записи устанавливаются реальные и эффективные идентификаторы пользователя и группы суперпользователя, а в поле umask всем битам присваивается единичное значение. При получении сообщения, содержащего символьное значение NONE в поле номера процесса, выполнение цикла прекращается, а менеджеру процессов отправляется сообщение о том, что все прошло успешно.

Затем завершается инициализация файловой системы. Сначала проверяется корректность значений важных констант; далее вызывается ряд других функций с целью подготовить кэш блоков и таблицу устройств, при необходимости загрузить виртуальный диск, а также загрузить суперблок корневого устройства. На этом этапе имеется доступ к корневому устройству, и часть таблицы процессов, принадлежащая файловой системе, считывается в цикле, чтобы каждый процесс из загрузочного образа получил информацию о своем корневом каталоге и установил его в качестве текущего (строки 24228-24235).

После завершения взаимодействия с менеджером процессов функция Г вызывает функцию Ьи:Е_роо1, формирующую списки для кэширования блоков (строка 24132). На рис. 5.32 было представлено нормальное состояние кэша,

где все блоки связаны друг с другом в ЬКи-список и хешированы. Полезно разобраться в том, как возникла ситуация, показанная на рисунке. Сразу после инициализации процедурой Ьи:Е_роо1 все буферы находятся в списке и все они связаны в нулевую хеш-цепочку (рис. 5.35, а). Когда запрашивается буфер, структура приходит в состояние, показанное на рис. 5.35, б, и остается в нем, пока буфер используется. На этом рисунке мы можем видеть, что блок исключен из ЬКи-списка и помещен в отдельную хеш-цепочку.

Обычно же блок освобождается и возвращается в ЬКи-список немедленно (рис. 5.35, в). Здесь блок, хотя и не используется более, все еще содержит информацию и при необходимости может быть извлечен из хеш-цепочки. После того как система поработает некоторое время, почти все блоки, скорее всего, окажутся случайно распределенными между различными цепочками. Ь1Ш-список при этом будет выглядеть так, как показано на рис. 5.32.

Следующую функцию, ЬиИс1_(±пар, мы опишем позже, когда пойдет речь о функциях, работающих с файлами устройств. После этого вызывается функция 1оас1_ гаш, которая, в свою очередь, использует функцию 1деЬетл (строка 2641).

Последняя получает от ядра численный идентификатор, передавая ему в качестве аргумента параметр загрузки. Если вы пользовались командой гузетл для просмотра параметров загрузки работающей системы М1№Х 3, вы видели, что информация отображалась в виде строк, подобных следующей:

rootdev=912

Файловая система использует числа для идентификации устройств. Эти числа вычисляются по формуле:

256 х главный номер + вспомогательный_номер.

Здесь главный_номер и вспомогательный_номер — соответственно главный и вспомогательный номера устройств. В приведенном примере главный номер равен 3, а вспомогательный — 144, что соответствует устройству /dev/cOdlpOsO, на которое обычно устанавливают М1МХ 3 в системах с двумя дисками.

Функция load_ram (строка 24260) выделяет память для виртуального диска и загружает в него корневую файловую систему, если этого требуют загрузочные параметры. С помощью функции 1деЬетл она считывает параметры rootdev, ramimagedev и гашз1ге, установленные в окружении загрузки (строки 24278- 24280). Если в параметрах загрузки указана следующая строка, корневая файловая система блок за блоком, начиная с загрузочного блока, копируется с устройства ramimagedev на виртуальный диск:

rootdev=ram

При этом различные структуры файловой системы не интерпретируются. Если значение параметра гашз1ге меньше объема корневой файловой системы, виртуальный диск увеличивается, чтобы вместить ее. Если же виртуальный диск вмещает всю корневую файловую систему и на нем еще остается место, производится подстройка с целью подогнать размер диска под объем файловой системы (строки 24404-24420). Это — единственный случай, когда файловая система осуществляет запись в суперблок, однако, как и при чтении последнего, кэш блоков не используется и данные пишутся непосредственно на устройство с помощью функции dev_io.

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

Заинтересованным читателям мы предлагаем обратиться к коду файла fs /cdprobe. с, который можно найти на компакт-диске и веб-сайте MINIX 3. Второй момент: независимо от используемого MINIX 3 размера обычных блоков, размер загрузочного блока всегда равен 1 Кбайт, а суперблок загружается из второго килобайта дискового устройства. Любые другие варианты оказались бы сложными, поскольку размер блока можно узнать, лишь загрузив суперблок.

Функция load_ram выделяет пространство под пустой виртуальный диск, если указан ненулевой размер ramsize, при этом виртуальный диск не используется в качестве корневой файловой системы. Виртуальный диск будет можно задействовать как файловую систему лишь после инициализации командой mkfs, поскольку структуры файловой системы не скопированы в него. В качестве альтернативы такой виртуальный диск можно сделать вторичным кэшем, если соответствующая поддержка интегрирована в файловую систему.

Последняя функция файла main, с, функция load_super (строка 24426), инициализирует таблицу суперблоков и считывает в нее суперблок корневого устройства.

5.7.4.

<< | >>
Источник: Э. ТАНЕНБАУМ, А. ВУДХАЛЛ. ОПЕРАЦИОННЫЕ СИСТЕМЫ Разработка и реализация 3-е издание. 2007

Еще по теме Инициализация файловой системы:

  1. § 39 Классификация договоров в отдельных видах. – Римская классификация. – Система прусского закона, французского и австрийского кодекса. – Система русского свода. – Система настоящего изложения.
  2. Тема 15 Правова система і система права. Система законодавства та систематизація нормативно-правових актів
  3. Глава 4. Система права и система законодательства
  4. §5. Система военных судов в РФ как часть системы судов общей юрисдикции
  5. Единство и взаимосвязь правовой системы и системы правового общества
  6. § 1.3. Система трудового права і система трудового законодавства
  7. § 33 Общее правило о переходе наследства к детям. – Отличие отделенных от неотделенных. – Право представления. – Право родительское. – Право боковых родственников. – Римская система определения прав по классам и степеням. – Германская система определения прав по линиям и коленам.
  8. § 14 Отношения супругов по имуществу. – Германское начало общения имуществ в браке и римская система приданого. – Особое имущество жены. – Разнообразные системы западных законодательств. – Раздел имуществ по прекращении брака. – Ограничения брачных договоров и сделок между супругами. – Английский закон об отношениях супругов по имуществу.
  9. § 34 Смешанные системы в новейших законодательствах. – Происходящее от различия сих систем различие в порядке раздела и в допущении права представления. – Ограничение наследственного права пределами родства. – Ограничение женщин. – Разделение наследства между родами. – Возвращение подаренного родителями. – Наследование супругов и незаконных детей и родителей. – Закон наследования в Англии.
  10. Э. ТАНЕНБАУМ, А. ВУДХАЛЛ. ОПЕРАЦИОННЫЕ СИСТЕМЫ Разработка и реализация 3-е издание, 2007
  11. СИСТЕМА