Запуск сервера — длинная и сложная последовательность действий, зависящая от аппаратной составляющей, настроек и используемого программного обеспечения. Многие, даже опытные и квалифицированные системные администраторы, плохо себе представляют, что именно происходит в процессе запуска сервера, поэтому мы решили разобрать этот процесс детально.
Чтобы не разбирать все возможные случаи, мы рассмотрим загрузку при следующих условиях:
- 64-х битный процессор Intel;
- режим загрузки Legacy;
- дисковая разметка MBR;
- загрузчик GRUB2.
Проснись и пой
Включение сервера инициируется разными способами, среди которых нажатие кнопки Power On — чаще всего встречающийся, но не единственный. Другой вариант через команду по сети (Wake-on-LAN) либо через команды с внешних устройств (Wake-on-PCIe, Wake-on-Keyboard, Wake-on-Mouse). Команды выполняются только если включены соответствующие параметры в BIOS Setup Utility, о котором мы поговорим чуть позже.
Отдельным устройством считается BMC-модуль, который предоставляет расширенные возможности по управлению сервером. Подробнее об этой технологии читайте в нашем блоге.
Предыдущие способы являются интеллектуальными и требуют отправки специально сформированной команды по шинам данных. Более простой способ: включение при подаче электроэнергии на блок питания. В настройках BIOS этот параметр называется AC Power Loss и принимает одно из трех состояний:
- Power Off — сервер останется выключенным.
- Power On — сервер включится.
- Last State — сервер включится только если на момент потери питания он был включен.
Использование этих способов одинаково приводит к отправке процессору сигнала Reset и началу процедуры запуска.
Загрузка первой программы
Первым этапом запуска сервера является включение блока питания и установка сигнала Reset для процессора. При наличии сигнала Reset генератор частоты процессора не работает, а регистры процессора сбрасываются до значений, установленных производителем процессора.
При запуске в блоке питания происходят переходные процессы, из-за которых выходное напряжение может оказаться вне допустимых пределов, что негативно скажется на работающем процессоре. Поэтому сигнал Reset не снимается до полной стабилизации поступающего питания.
После стабилизации напряжения блок питания устанавливает сигнал Power Good. Этот сигнал означает, что материнская плата может запускать все компоненты сервера. Далее чипсет отображает в адресное пространство все подключенные устройства, в том числе ПЗУ (постоянное запоминающее устройство) с кодом Basic Input/Output System (BIOS). Следом снимается сигнал Reset и запускается генератор частоты процессора.
BIOS — система, предоставляющая API для работы с оборудованием и подключаемыми устройствами. Одной из важных целей BIOS является инициализация и тестирование оборудования при запуске.
Вне зависимости от количества процессоров в системе при запуске сервера пробуждается только одно ядро одного процессора, а остальные ядра остаются в режиме сна. Пробужденное ядро обозначается Bootstrap Processor (BSP, далее — процессор). После исчезновения сигнала Reset регистры процессора заполнены таким образом, что процессор функционирует в специальном 32-х битном режиме, который называется Initial Processor Mode.
Initial Processor Mode — режим работы, в который 64-х битный процессор попадает только после сброса. В этом режиме процессор способен выполнять 32-х битные команды, а адресное пространство составляет 4 ГиБ.
После исчезновения сигнала Reset, счетчик команд процессора указывает на адрес 0xFFFFFFF0, который называется Reset Vector. По этому адресу лежит первая команда, которую декодирует и исполняет процессор.
Размещение первой инструкции в конце адресного пространства имеет историческое обоснование. При разработке процессора Intel 8086 в начале адресного пространства находился вектор прерываний, за которым следовала оперативная память, объем которой мог быть любым. Чтобы не возникло пересечений с оперативной памятью, адрес первой команды был взят в конце адресного пространства.При обращении по адресу 0xFFFFFFF0 процессор получает первую команду с ПЗУ. В режиме Legacy эта команда представляет из себя длинный прыжок или Far Jump в сегмент памяти с кодом BIOS. После выполнения первого длинного прыжка процессор переходит в 16-ти разрядный Real Mode и приступает к выполнению кода BIOS.
В дальнейшем, с появлением Intel 80286, вектор прерываний можно было передвинуть в любое место. Тем не менее, даже современные процессоры запускаются в режиме совместимости с 8086 и вектором прерываний по адресу 0x0.
Real Mode — режим совместимости с устаревшими 16-ти битными процессорами. В этом режиме доступны только 16-ти битные команды, а адресное пространство, которое называется «нижней памятью», вмещает только 1 МиБ.
Как уже отмечалось ранее, исполняемый код BIOS хранится на внешнем устройстве, работа с которым не отличается большой скоростью, поэтому первое, что делает BIOS — инициализирует оперативную память и копирует в нее собственный код из ПЗУ. BIOS сохраняет совместимость с устаревшими процессорами, поэтому выполняет все действия в 16-ти битном режиме.
Power On Self-Test
Power On Self-Test (POST) — ключевой этап в работе BIOS. POST бывает сокращенным и полным. Полный POST проверяет все доступные контроллеры и тестирует всю доступную оперативную память, что может занимать много времени.
Сокращенный POST ускоряет процесс загрузки и включает в себя минимально необходимый набор действий:
- проверку целостности программ BIOS в ПЗУ, используя механизм сверки контрольной суммы;
- обнаружение и инициализацию основных контроллеров, системных шин и подключенных устройств;
- определение размера оперативной памяти и тестирования первого сегмента (64 килобайт);
- передачу управления загрузчику.
При прохождении POST, сервер использует несколько способов отразить информацию о прохождении тестов. Наиболее распространенные способы:
- отображение идентификатора теста, POST-кода на экране, либо с помощью семисегментных индикаторов на материнской плате;
- звуковая индикация;
- световая сигнализация комбинацией светодиодов.
Наиболее информативным способом получения информации о возможных неисправностях считается отображение текущего POST-кода. При успешном прохождении тестов коды быстро сменяют друг друга, но в случае неисправности POST останавливается и можно будет увидеть идентификатор проваленного теста. Производители материнских плат всегда прилагают расшифровку, что обозначает тот или иной код.
На современных материнских платах присутствует светодиодная индикация, которая позволяет определить неисправный компонент. При успешном запуске сервера можно слышать звуковой сигнал, сообщающий, что POST пройден успешно. По продолжительности и количеству звуковых сигналов так же можно определить сбойный компонент.
В некоторых случаях, когда требуется максимальная точность при диагностике, можно прибегнуть к помощи внешнего устройства, которое называется POST-карта. Материнские платы рассылают информацию о POST-тестах по шинам данных, а POST-карта обрабатывает эту информацию и выводит с помощью доступных индикаторов.
BIOS Setup Utility
У BIOS есть специальное меню настройки, именуемое BIOS Setup Utility. Зайти в него можно нажатием специальной клавиши, во время прохождения POST. Чаще всего клавишами для входа в BIOS являются Del и F2, тем не менее, при загрузке всегда указано, нажатие какой клавиши откроет настройки BIOS.
BIOS Setup Utility предоставляет интерфейс для настройки, для взаимодействия с которым требуется только клавиатура. BIOS Setup Utility предоставляет информацию об установленном оборудовании и позволяет изменять параметры работы материнской платы и подключенного оборудования.
Возможные названия и опции того или иного параметра зависят от многих факторов, среди которых:
- версия BIOS;
- модель материнской платы;
- модель установленного в материнскую плату оборудования.
Среди параметров нам интересен приоритет загрузки (Boot Priority). Приоритет загрузки задает порядок, в котором BIOS опрашивает устройства с целью найти на них загрузочную область. Как только BIOS найдет загрузочную область, управление передается загрузчику и начинается следующий этап.
Загрузчик ОС
После прохождения POST BIOS ищет загрузочную область, опрашивая устройства в заданном порядке. В режиме Legacy загрузочная область на диске называется Master Boot Record (MBR). MBR — особая структура, размещаемая в первых 512 байтах диска. Эти 512 байт содержат следующие данные:
- код первого этапа загрузчика — с 0 по 445 байт;
- таблица разделов — с 446 по 509 байт;
- «магическое» число 0xAA55 — с 510 по 511 байт.
Если магического числа 0xAA55 нет, то считается, что MBR-запись на этом диске не найдена и BIOS приступает к опросу следующего диска.
Когда BIOS находит MBR-запись, он копирует ее с диска в оперативную память по адресу 0x7C00 и совершает прыжок по этому адресу. После прыжка начинается первый этап (Stage 1) работы загрузчика. Из-за ограниченности в размерах, смысл работы первого этапа сводится к загрузке в память кода второго этапа (Stage 2) и передаче ему управления.
Код Stage 2 хранится сразу после структуры MBR и до начала первого раздела диска. Исторически этот промежуток содержит 31 КБ памяти, а в современных системах достигает 1 МБ. Тем не менее, для сохранения совместимости размер второго этапа не превышает 31 КБ.
Второй этап подготавливает окружение для запуска третьего этапа:
- загружает необходимые драйверы файловых систем;
- находит код третьего этапа на файловой системе;
- загружает код в оперативную память и передает ему управление.
Задачи Stage 3 сводятся к минимальной настройке окружения и загрузчика:
- перевести процессор в Protected Mode;
- загрузить установленные расширения GRUB2;
- найти Stage 4 на файловой системе и передать ему управление.
Protected Mode — режим совместимости с x86 процессорами. В этом режиме процессор способен выполнять 32-х битные команды, а адресное пространство расширяется до 4 ГиБ. В Protected Mode появилось значительные нововведения, например:
- страничная адресация памяти;
- кольца защиты;
- виртуальная память.
Четвертый этап (Stage 4) работает уже в 32-х битном режиме, при необходимости загружается с диска расширения графического интерфейса, «разбирает» файл grub.cfg и отображает знакомое меню выбора ОС.
Ядро ОС
GRUB2 следует спецификации Multiboot для загрузки исполняемого файла ядра. Загрузчик проверяет магическое число 0x1BADB002 в начале ядра и сверяет контрольную сумму, чтобы убедиться, что ядро совместимо со спецификацией. После успешной проверки ядро можно загрузить в оперативную память и передать ему управление.
Согласно той же спецификации, загрузчик предоставляет ядру информацию о системе, такую как:
- текущий режим работы процессора;
- количество обнаруженной оперативной памяти;
- тип видеовывода (текстовый или пиксельный);
- разрешение экрана.
Несмотря на то, что загрузчик использовал драйвера файловой системы и, возможно, расширения для графического интерфейса, загружаемое ядро не получит всех этих замечательных вещей. В первую очередь, после получения управления, ядро «раскрывает» весь потенциал сервера и переводит процессор в Long Mode.
Long Mode — основной режим 64-х битных процессоров. В этом режиме процессор способен выполнять 64-х битные команды и использовать 64-х битные регистры общего назначения. Адресное пространство вмещает 16 ЭиБ. Long Mode упразднил сегментированную организацию памяти, присущую 32-х битной архитектуре.
Несмотря на огромное адресное пространство для адресации физической памяти используется только 48 бит из возможных 64, что снижает максимальное количество оперативной памяти до 256 ТиБ, что в 65536 раз меньше адресного пространства. В обозримом будущем планируется расширить физическую адресацию до 57 бит.
После перехода в Long Mode ядро выполняет минимальный набор необходимых для работы действий:
- настраивает страничную адресацию памяти;
- загружает драйверы и выполняет инициализацию используемого оборудования;
- настраивает планировщики памяти и процессов;
- находит и запускает init.
Важно, что до настройки планировщика процессов сервер работал на одном ядре, которое называлось BSP. Настройка планировщика «пробуждает» остальные ядра, которые называются Application Processor (AP). Ядра не имеют прямой связи между друг другом, а их общение производится через локальные обработчики прерываний, называемые Local Advanced Programmable Interrupt Controller (LAPIC).
На BSP запущено ядро операционной системы, которое в ходе инициализации получило информацию о доступных процессорах в системе, используя таблицы ACPI. BSP, используя собственный LAPIC, отправляет последовательность прерываний «Init — StartUp — StartUp» для пробуждения всех AP. Прикладные процессоры после запуска так же необходимо инициализировать и перевести в Long Mode, но теперь этот процесс быстрее, так как эта работа уже выполнена основным процессором.
После инициализации всех AP планировщик процессов запускает служебный процесс, который называется «бездействие» или Idle. Как следует из названия, этот процесс ничего не делает и занимает процессор, когда нет других процессов.
Когда всё настроено и готово к работе, ядро операционной системы запускает первый процесс в пространстве пользователя — Init. Тот, в свою очередь, запускает остальные процессы в пространстве пользователя. После запуска init-процесса ядро переходит в режим ожидания и бездействует до появления заданий в пространстве ядра.
После запуска всех процессов сервер становится доступен по сети, а на консоли можно видеть приглашение Logon экрана.
Заключение
На первый взгляд простой и быстрый запуск сервера и загрузка операционной системы на деле представляет собой сложный и запутанный процесс с множеством нюансов. Прохождение этого процесса — маленькая эволюция, развивающая вычислительную мощность процессора от старых 16-ти битных процессоров до современных 64-х битных «монстров».
А как Вы думаете, при появлении 128-ми разрядных процессоров, в них будет режим совместимости с 16-ти битными?