GRUB

Grand Unified Bootloader (GRUB)1 - это х86-загрузчик, используемый для загрузки Linux. GRUB 2 на момент написания книги находился в процессе портирования на РРС. Соответствующая документация, включающая его историю и особенности дизайна, находится на www.gnu.org/software/grub. GRUB распознает файловые системы на загрузочных дисках, а ядро может быть загружено из указанного файла, диска и раздела, где оно расположено. GRUB является двухэтапным загрузчиком (two-stage bootloader). Этап 1 инсталлируется в MBR и вызывается из BIOS. Этап 2 вначале загружает этап 1, а по его завершении загружается из файловой системы. Остановки и события, возникающие на каждом из этих этапов, перечислены далее.
Этап 1
1. Инициализация.
Этап 2
1. Загрузка остатка этапа 2.
2. Переход в загруженный код.
Доступ к GRUB можно получить через интерактивную командную строку или интерфейс с набором меню. При использовании интерфейса с меню должен быть создан файл конфигурации. Далее приведена строка из конфигурационного файла GRUB, загружающего ядро Linux.

/boot/menu.1st
title Kernel 2.6.7, test kernel
root (hd0,0)
kernel /boot/bzImage-2.6.7-mytestkernel root=/dev/hdal ro

Пункт title хранит метку для настройки; root устанавливает текущее корневое устройство в hdO, раздел 0; kernel загружает первичный загрузочный образ ядра из указанного файла. Оставшаяся информация о записях ядра передается в качестве параметров во время загрузки ядра.
Некоторые аспекты загрузки, такие, как месторасположение загружаемого и распаковываемого образа ядра, конфигурируется в аппаратно-зависимом разделе кода ядра Linux. Давайте рассмотрим arch/i386/boot/setup.S, где хранятся такие настройки для х86.

arch/i836/boot/setup.S
61 INITSEG = DEF_INITSEG # 0x9000, перемещаем загрузчик сюда с дороги
62 SYSSEG = DEF_SYSSEG # 0x1000, система загружается из 0x10000 (65536).
63 SETUPSEG = DEF_SETUPSEG # 0x9020, это текущий сегмент

Эта конфигурация указывает, какой образ Linux загружать в линейный адрес 0x9000, и переходит по адресу 0x9020. В этой точке распакованная часть ядра Linux распаковывает запакованную часть по адресу 0x10000 и начинает инициализацию ядра.
GRUB основан на Многозагрузочной спецификации(МиШЬооС Specification). На момент написания книги Linux еще не обладал всеми структурами, необходимыми для многозагрузочной компиляции, но обсудить многозагрузочные требования все-таки стоит.