Чтобы расширить принятый ответ ...
Когда компьютер x86 запускается, его ЦП работает в 16-битном реальном режиме и выполняет код, сохраненный в BIOS. После того, как BIOS выполнит POST и начальную настройку, он считывает первые 512 байт с начала загрузочного диска и передает туда выполнение - это исходный код загрузчика, который должен делать все остальное.
Теперь посмотрим, что отдыхает. В простейшем случае загрузчик должен быть в состоянии найти и загрузить образ ядра и передать туда выполнение. Более старый де-факто стандартный загрузчик Linux, lilo
, хранил непрерывную карту всех секторов, в которых хранилось ядро. Но с тех пор картина немного изменилась: стало больше файловых систем, стало привычным хранить ядро на RAID-устройстве, на логическом диске LVM или в стеке всего этого. На компьютерах появилось больше подключаемых дисков, что означает произвольный порядок их инициализации и, следовательно, проблемы с именами. Теперь учтите, что в наши дни для создания универсальной системы на базе Linux требуются некоторые ранее доступные инструменты пользовательского пространства , которые хранятся в так называемых "initrd" (исходный RAM-диск) или "initramfs" (исходная файловая система RAM), так что фактически загрузчик загружает не только ядро Linux, но и соответствующие initramfs для него.
Итак, задача загрузчика:
- Сам Bootstrap - эти 512 байтов могут только разумно найти и загрузить что-то более сложное.
- Найдите и инициализируйте все слои, необходимые для доступа к загрузочной файловой системе (файловой системе, содержащей ядро и его initramfs).
- Загрузите все это и затем передайте управление ядру.
Теперь учтите, что большинству людей полезно иметь возможность каким-то образом визуализировать и контролировать этот процесс, поэтому существует требование, чтобы загрузчик имел возможность представлять своего рода меню и возможность настраивать то, что будет загружено, и каким образом. Возможность загрузить альтернативное ядро также может быть бонусом (например, новое ядро, установленное из репозитория обновлений безопасности Debian, никогда не удаляет существующее ядро - скорее, оно остается в стороне и доступно для загрузки, если обнаружена регрессия). в новом).
Итак, как можно видеть, если мы не имеем дело с какой-то встроенной системой с очень жесткими требованиями к памяти / пространству хранения и в которой никто не контролирует загрузку ядра, неразумно помещать эту функциональность прямо в ядро, тем более , поскольку загрузчик является неотъемлемой частью программного обеспечения, зависящего от аппаратной платформы. Вот почему существует загрузчик и почему в общей системе необходимость его использования в основном неизбежна.