Заочная Школа Программистов

Студия "Unix изнутри"

http://iunix.narod.ru

(С) Вьюшков Александр, 2002

Процесс первоначальной загрузки.

Часть 1. Передача ядра ОС в память.

1. Включение компьютера.

Сразу после включения компьютера в действие вступает так называемое Firmware или BIOS - как принято называть его на платформе x86. Управление передается на заранее известный адрес в ПЗУ. Для x86 это адрес F000:FFF0.

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

2. Загрузка операционной системы.

Этот этап первоначальной загрузки состоит из нескольких подэтапов. Сначала загружается самый простой загрузчик, потом загрузчик посложнее и т.п. - в конце концов в память переносится и ядро. Как правило, в Unix-подобных ОС встречаются 1-2 вспомогательных загрузчика - бут-сектор и lilo; в Windows 9x их три. (сначала загружается DOS в 2 этапа, потом запускается win.com).

Рис 1. Cхема загрузки

NetBSD macppc

HDD

Linux

x86

HDD

Linux

x86

Дискета

Windows

9x

NetBSD

powerpc

сеть

Open Firmware

|

Bootxx

|

Ofwboot

|

Ядро (netbsd)

BIOS

|

Boot-sector

|

Lilo, Grub

|

Ядро(vmlinuz)

BIOS

|

boot-sector

|

ядро(vmlinuz)

BIOS

|

boot-sector

|

command.com

|

win.com

|

OC

Open Firmware

|

Ofwboot

|

ядро(netbsd)

2.1 Загрузка загрузчика первой стадии.

Как правило объем ПЗУ ограничен; да и невозможно предусмотреть все возможные форматы и типы носителей ядра. DOS загружается в одной последовательности, Windows в другой; если вы напишете свою ОС, у вас будет своя последовательность загрузки и свой формат ядра. Для того чтобы иметь возможность загружать любую операционную систему, реализован следующий механизм. С выбранного носителя в память переносится загрузчик первой стадии. Заранее известно, где этот загрузчик должен находится на жестком диске или дискете. На размер загрузчика первой стадии, как правило, налагаются жесткие требования (не более одного сектора на диске).

После передачи загрузчика в память управление передается его на первую инструкцию.

2.2 Загрузчик второй стадии

Функциональность загрузчика первой стадии очень ограничена из-за ограничения по длине. Как правило, деятельность этого загрузчика сводится к копированию определенных секторов диска (жестко запрограммированных в его коде) в память и передача управления загрузчику второй стадии.

Загрузчик второй стадии обычно имеет гораздо менее жесткие ограничения по объему, поэтому обладают несравненно более широкими возможностями. Именно он и осуществляют всю работу по загрузке и подготовке к запуску ядра операционной системы. Иногда бывает с графическим интерфейсом (например PQ Magic или XOSL).

2.3 Загрузчики последующих стадий

Если на компьютере установлена только одна операционная система, то надобности в загрузчике третьей стадии обычно нет. Однако, когда на компьютере установлены например Linux и Windows, бывает, что загрузчики “каскадируются” – например, NT loader загружает lilo, из которого уже непосредственно загружается ядро linux, или наоборот – из lilo запускается NT Loader, который загружает Windows NT.

Рис. 2 – “Каскадированные” загрузчики x86, Linux

BIOS

|

boot-sector

|

NT-loader

|

Lilo

|

Ядро Linux

BIOS

|

boot-sector

|

lilo

|

ядро Linux

BIOS

|

boot-sector

|

lilo

|

NT-loader

|

Win NT (Win 2000)

2.4 Загрузка операционной системы

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

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

ПРИМЕР 1.

В качестве иллюстрации к вышесказанному рассмотрим загрузку ядра Linux c жесткого диска для платформы x86.

Процесс загрузки Linux на платформе x86 состоит из 3 стадий (или больше – если есть промежуточные загрузчики от Windows, см раздел 2.3). Рассмотрим типичную схему – загрузки при помощи LILO (Linux boot Loader). Работа других загрузчиков принципиально такая же, хотя может иметь большее число стадий.

Стадия 1. MBR

Загрузчик первой стадии содержится в первом секторе жесткого диска, называемом главной загрузочной записью (MBR – master boot record). Стандартная программа, устанавливаемая fdisk’ом загружает в память первый сектор активного раздела (одного из тех, которые получились при разбивке винчестера на несколько логических дисков).

Linux при установке меняет программу в MBR на свою. Задача этой программы – загрузить вторую часть LILO, которая и выполняет основную работу по загрузке ОС.

Стадия 2. LILO

Вторая часть LILO читает с диска сведения обо всех доступных операционных системах и выводит приглашение, позволяющая пользователю выбрать одну из имеющихся ОС. После того, как то или иное ядро выбрано, загрузчик копирует в оперативную память либо загрузочный сектор соответствующего раздела и передает ему управление (см раздел 2.3 “каскадирование загрузчиков”), либо непосредственно копию образа выбранного ядра. Это обеспечивает возможность загрузки как Linux, так и других операционных систем – в отличие, скажем, от стандартного загрузчика Windows 9x.

Стадия 3. Ядро.

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

ПРИМЕР 2.

В качестве еще одной иллюстрации к вышесказанному рассмотрим загрузку ядра NetBSD для макинтош. Очень похожий процесс происходит и на платформе x86.

Процесс загрузки NetBSD/макинтош с диска может быть логически разделен на 3 стадии. На каждой стадии загружается и исполняется все более большая и сложная программа. Мы будет идентифицировать каждую стадию по имени загружаемой программы. Это "bootxx", "ofwboot" и "netbsd" соответственно.

Стадия 1. bootxx, размер - 1K

bootxx - это самый простой загрузчик в цепочке. Его загружает BIOS (на макинтошах он называется Open Firmware). Задача bootxx - просто загрузить программу-загрузчик второй стадии - "ofwboot". Физическое месторасположение "ofwboot" жестко запрограммировано внутри "bootxx", таким образом ему не нужно ничего знать о файловой системе - он просто переносит указанные сектора диска в память. Поэтому, при перекомпиляции "ofwboot" необходимо переустановить "bootxx" командой "installboot".

"installboot" собирает информацию обо всех физических секторах диска, в которых хранится "ofwboot" и заносит информацию о них в статическую часть исполняемого файл "bootxx", после чего помещает "bootxx" в сектор диска, в котором ему и положено быть.

Стадия 2. ofwboot, размер ~63K

Итак мы попали в загрузчик второй стадии. Он уже умеет гораздо больше своего предшественника - он может работать в интерактивном режиме, а значит пользователь может указать корневой раздел и передать ядру параметры. Кроме того, ofwboot умеет загружать файлы в формате ELF и понимает файловую систему FFS (родная система для операционных систем из ряда BSD) или NFS - если загружаться по сети.

После того, как пользователь выбрал носитель, с которого загружать ядро и указал флаги, ядро переносится в память - и наступает третья стадия.

Стадия 3. netbsd, размер ~2Mb

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

Ссылки по теме

  1. “An In-depth Study of NetBSD Bootstrapping and a Few Speedy Enhancements”, http://www.10k.org/~jake/pub/sb
  2. http://www.linuxgazette.com/issue70/ghosh.html “Bootstrapping a Linux system – an Analysis”
  3. http://gazette.linux.ru.net/lg70/articles/rus-ghosh2.html “Bootstrapping, или как Linux сам себя ставит на ноги. Анализ процесса начальной самозагрузки”
  4. Techhelp 6.0
Hosted by uCoz