Загрузка ОС / Booting OS
Загрузка ОС
Первоначальная загрузка ОС происходит в сл. последовательности:
POST-> BIOS -> загрузчик(и)-> загрузчик ОС –> ОС
После нажатия кнопки питания запускается POST для первичной проверки устройств, затем загружается BIOS
, которая последовательно проходит по списку загрузочных устройств в поисках первого загрузочного (у которого два последних байта первого сектора 0xAA55
). Найдя загрузочное устройство, BIOS загружает загрузочный сектор в память (по адресу 0x7C00
) и передает управление загрузочному коду, в случае, если устройство HDD, то этот код, вероятнее всего, Master Boot Record (MBR)
.
Ограничение на размер первоначального загрузчика не позволяют его сделать богатым по функционалу. Этот первоначальный раздел, называемый главной загрузочной записью (MBR), ограничен 512
байтами и находится в самом начале диска, а непосредственно сам загрузчик занимает 446
байт, т.к. помимо него в MBR также присутствует Partition table
– таблица разделов (партиций) диска. MBR проверяет список разделов диска в поисках раздела, обозначенного как загрузочный, т.е. того, у которого установлен флаг активный
.
Особенности разметки диска в MBR:
-диск может иметь максимум 63
партиции
- из них только 4
могут быть primary (первичными)
- Только одну из primary можно разделить на logical
партиции, т.е. сделать из нее extended
партицию
- таким образом, получится 3
primary патриции + возможность создать до 59
logical патриций внутри одной extended
- Максимальный размер одного HDD около 2 Тб
Восстановление MBR
на Windows XP:
fixmbr
из Recovery Console
Windows Vista и выше:
– bootrec /FixMbr
из Recovery Eviroment
На Linux:
grub-install
записывает GRUB в MBR
Найдя загрузочный раздел, MBR загружает загрузочный сектор из него (chain loading
). Этот загрузочный сектор содержит либо ОС-независимый загрузчик, либо загрузчик самой ОС, для которого главная задача – загрузить ядро ОС, которое уже продолжит загрузку самой ОС.
Загрузчик может быть как один, так и несколько, которые последовательно загружают один другого по цепочке (chain loading) полностью передавая управление новому. Применительно к загрузчику GRUB, необходимость загрузки по цепочке возникает для ОС, не поддерживающихся GRUB.
Загрузчики могут быть разными:
- GNU GRUB (Linux)
- BOOTMGR (Vista и новее)
- NTLDR (XP и ранее)
В них присутствуют настройки, позволяющие загружать разные ОС, либо различные режимы одной ОС. Либо передавать цепочку управления загрузкой следующему загрузчику (GRUB -> BOOTMGR
).
Загрузка различных ОС.
Загрузка Windows
Загрузчик системы:
NTLDR
– XP и ранееBOOTMGR
– начиная с Vista
Далее загрузчик ищет ОС:
NTLDR
считывает файл boot.iniBOOTMGR
- Boot Configuration Data (BCD) БД, которая сохраняется либо вEFI System Partition
(UEFI) либо в\Boot\Bcd
(BIOS), разделе с системой. Помимо загрузки с локального диска BOOTMGR поддерживает также загрузку из VHD файла сохраненного на NTFS разделе
Загружается ядро системы (ntoskrnl.exe
). Загрузка необходимых для загрузки ОС драйверов (файловой системы и пр.), во время этого процесса можно нажать F8
для выбора различных режимов загрузки (безопасного и пр.). После загрузки ядра и необходимых драйверов ему передается управление.
Система подготавливается и запускается Windows Logon Manager (winlogon.exe
) процесс позволяющий ввести учетные данные пользователя.
Загрузка Linux
Один из загрузчиков Linux – GRUB (представляет также возможность загрузки разных ОС) загружает ядро и передает ему дальнейшее управление по загрузке ОС. GRUB располагается на разделе с системой и загружается вызовом из MBR. Он обладает необходимыми драйверами для файловых систем ext.
Ядро подгружает необходимые драйвера, пользуясь initial RAM disk (initrd
) – временной файловой системой. Как только становится доступна основная файловая система, ядро переключается на нее и настраивает систему перед загрузкой первого процесса – init
.
Init подготавливает дальше систему и предоставляет пользователю возможность входа. Init работает до самого выключения системы, при котором он выключает все компоненты пользовательского окружения, завершается сам, после чего выключается ядро.
Однако, если ядро собрано со всеми необходимыми для доступа к корневой файловой системе драйверами, то initrd в этом случае не нужен.