3. Что происходит, когда вы включаете компьютер?

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

Процесс приведения операционной системы в готовность называется загрузка (booting) (первоначально использовалось слово bootstrapping и намекало на процесс поднимания самого себя за шнурки «by your bootstraps»). Ваш компьютер знает, как загрузиться, потому что инструкции для загрузки встроены в один из его чипов, в чип BIOS (Basic Input/Output System) (основная система ввода/вывода).

BIOS указывает ему, где искать специальную программу-загрузчик (в Linux это Grub или LILO) — в закреплённом за ней месте, обычно на жёстком диске, имеющем наименьший порядковый номер (загрузочный диск). Загрузчик извлекается, помещается в память и начинает выполняться. Работа загрузчика состоит в том, чтобы запустить настоящую операционную систему.

Чтобы это сделать, загрузчику надо найти ядро (kernel), загрузить его в память, и дать ему старт. Когда вы загружаете Linux и видите на экране монитора надпись "LILO" с бегущей вереницей точек после неё, это загружается ядро. (Каждая точка означает, что с диска загружен очередной блок данных (disk block) кода ядра.

(Вы можете удивиться, почему BIOS не загружает ядро напрямую — зачем нужен двухшаговый процесс с использованием загрузчика? Что ж, BIOS не очень умна. На поверку, она очень бестолкова, и Linux после загрузки не использует её вовсе. Первоначально, BIOS была написана для примитивных 8-битовых PC с крошечными дисками, и буквально не может получить достаточный доступ к диску для прямой загрузки ядра. Используя загрузчик, вы также имеете возможность выбрать одну из нескольких операционных систем, размещённых на разных частях вашего диска, в случае, если Unix недостаточно хороша для вас.)

Стартовав, ядро осматривается, обнаруживает все аппаратное обеспечение и делает все необходимые приготовления для запуска программ. Оно делает это, опрашивая не обычные адреса памяти, а правильные порты ввода/вывода (I/O ports) — специальные адреса шин, которые могут прослушивать контроллеры для получения команд. Ядро не опрашивает случайные адреса; у него есть встроенные знания о том, что и где искать и как карты контроллеров отвечают, если они присутствуют. Этот процесс называется автопробы (autoprobing).

Большинство сообщений, которые вы видите во время загрузки, — это ответы портов ввода/вывода на запросы ядра в результате автопроб вашего аппаратного обеспечения, ядро вычисляет, что имеется в наличии и адаптирует само себя к вашей машине. Ядро Linux чрезвычайно хорошо с этим справляется, лучше, чем большинство других Unix и значительно лучше, чем DOS или Windows. Многие ветераны Linux полагали, что искусность проб (probe) Linux при загрузке (что, соответственно, сделало её простой в установке), стало важной причиной её распространения и, по сути, привело к тому, что Linux перестала быть набором для экспериментов со свободной Unix и привлекла критическую массу пользователей.

Но полная загрузка ядра и его запуск — это не конец процесса загрузки; это только первая ступень (иногда называемая уровень выполнения 1 (run level 1). После этой первой фазы ядро передаёт управление специальному процессу, называемому «init», который порождает несколько процессов, занимающихся домашним хозяйством.

Обычно, первая работа процесса init — это проверка, в порядке ли ваши диски. Дисковые файловые системы — хрупкие вещи; если они повредились вследствие аппаратного сбоя или внезапного перебоя в сети электропитания, то это хороший повод сделать несколько шагов для их восстановления, прежде чем загрузить вашу Unix полностью. Мы обратимся к этой теме позже, когда будем говорить о неисправностях файловых систем.

Следующий шаг init — это запуск нескольких демонов (daemons). Демоны (сервисы, службы) — это такие программы как диспетчер печати, почтовый агент или сервер WWW, которые выполняются в фоновом режиме, ожидая наступления определённых событий для того, чтобы приступить к работе. Часто это специальные программы, координирующие обработку нескольких отдельных запросов, которые могут конфликтовать друг с другом. Они демоны (работают как черти), потому что проще написать одну программу, которая выполняется в постоянном режиме и знает все о запросах, чем пытаться убедиться, что табун копий программы (каждая из которых обрабатывает отдельный запрос и все они выполняются одновременно) не мешают друг другу. Набор демонов, которые запускаются при загрузке вашей системы, может варьироваться, но диспетчер печати (привратник вашего принтера) почти всегда там будет.

Следующий шаг — приготовиться к работе с пользователем. Init запускает копию программы под названием getty, которая ожидает ввода с вашей консоли (и возможно другие копии этой программы, которые ожидают подключения удалённых пользователей через последовательные порты). Результат работы этой программы — приглашение login на вашей консоли (на экране вашего монитора). После запуска всех демонов и процессов getty для каждого терминала, мы переходим на 2-ой уровень выполнения (run level 2). На этом уровне вы можете войти в систему и запускать программы.

Но мы ещё не закончили. Следующий шаг — запуск различных демонов, поддерживающих работу с сетью и другие устройства. После того как это будет сделано, мы переходим на уровень выполнения 3 (run level 3) и теперь система полностью готова к использованию.