Системное программное обеспечение - Учебное пособие (Терехин А.Н.)

3.7      начальная загрузка. формирование о и 1 процессов.

 Рассмотрим подробнее, что происходит в момент начальной загрузки OC UNIX. Начальная загрузка – это загрузка ядра системы в основную память и ее запуск. Нулевой блок каждой файловой системы предназначен для  записи короткой программы, выполняющей начальную загрузку. Начальная загрузка выполняется в несколько этапов.

1.Аппаратный загрузчик читает нулевой блок системного устройства.

2.После чтения этой программы она выполняется, т.е. ищется и считывается в память файл  /unix, расположенный в корневом каталоге и который содержит код ядра системы.

3.Запускается на исполнение  этот файл.

В самом начале ядром выполняются определенные действия по инициализации системы, а именно, устанавливаются системные часы (для генерации прерываний), формируется диспетчер памяти, формируются  значения некоторых структур данных (наборы буферов блоков, буфера индексных дескрипторов) и ряд других. По окончании этих действий происходит инициализация процесса с номером "0". По понятным причинам для этого невозможно использовать методы порождения процессов, изложенные выше, т.е. с использованием функций fork()  и exec(). При инициализации этого процесса резервируется память под его контекст и формируется нулевая запись в таблице процессов. Основными отличиями нулевого процесса являются следующие моменты:

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

Он является чисто системным процессом, т.е. существует в течении всего времени работы системы  и считается, что он активен, когда работает ядро ОС.

 Далее ядро копирует "0" процесс и создает "1" процесс.  Алгоритм создания этого процесса напоминает стандартную процедуру, хотя и носит упрощенный характер. Сначала процесс "1" представляет собой полную копию процесса "0" , т.е. у него нет области кода. Далее происходит увеличение его размера и во вновь созданную кодовую область копируется программа, реализующая системный вызов exec(), необходимый для  выполнения программы /etc/init.  На этом завершается подготовка первых двух процессов. Первый из них представляет собой структуру данных, при помощи которой ядро организует мультипрограммный режим и управление процессами. Второй –  это уже подобие реального процесса. Далее ОС переходит к выполнению программ диспетчера. Диспетчер наделен обычными функциями и на первом этапе у него нет выбора – он запускает exec(), который заменит команды процесса "1" кодом, содержащимся в файле /etc/init. Получившийся процесс, называемый init, призван настраивать структуры процессов системы. Далее он подключает интерпретатор команд к  системной консоли. Так возникает однопользовательский режим, так как консоль регистрируется с корневыми привилегиями и доступ по каким-либо другим линиям связи невозможен. При выходе из однопользовательского режима init создает многопользовательскую среду. С этой целью для каждого активного канала связи, т.е. каждого терминала, init создает отдельный процесс, выполняющий команду getty. Эта программа ожидает входа в систему кого-либо по каналу связи.  Далее, используя системный вызов exec(),  getty передает управление программе login,  проверяющей пароль. Во время работы ОС процесс init  ожидает завершения одного из порожденных им процессов (т.е. окончания сессии работы с системой), после чего он активизируется и создает для соответствующего терминала новый процесс getty  взамен завершившегося . Таким образом, процесс init поддерживает многопользовательскую структуру во время функционирования системы.  Схема  описанного “круговорота” представлена на Рис. 13

Рис. 13 Поддержка многопользовательской работы в ОС UNIX.