Блог компании Selectel
Компьютерное железо
Комментарии 71
+35
Вопрос: а почему статья называется «как запускается сервер», если описывает в общем-то стандартный процесс запуска любого компьютера x86/x64, причем с не таким уж большим количеством деталей, добавившихся с 1983 года? ;)
+13
Наверное потому, что «сервер» звучит внушительнее, чем «компьютер». Но это не точно.
+2
Более того, на скриншотах показан сервер с UEFI, процедура загрузки которого отличается. Да и BMC в этом деле тоже местами участвует.
+16
В эпоху повсеместного EFI актуальность статьи под большим вопросом.
+3
Загрузка с помощью EFI минует весь этап с Real Mode, весь код сразу работает в 32-х битном режиме, в остальном изменений практически нет. Режим Legacy был выбран, потому что этот процесс длиннее и погружает в историю.
0
Вот только статьи об этом на хабре не пролетало. А про легаси уже не раз…
+9
в остальном изменений практически нет.

У EFI с обычным загрузчиком мало общего. Помимо того, о чём Вы сказали:

  1. Устанавливает 64битный режим для 64битных EFI-приложений. Это многое значит: EFI-приложению не принадлежит вся память, загрузчик должен запрашивать её аллокацию у фирмвари так же, как у операционки обычное приложение запрашивает память. Но после вызова ExitBootServices вся память переходит во владение приложени.
  2. Предоставляет унифицированные таблицы с данными о системе и сервисами (в т.ч. драйверами устройств, ватчдогами и т. д.).
  3. Поддерживает выход из загрузчика и передачу управления обратно фирмвари (Legacy BIOS — нет).
  4. Проверка подписи кода (Secure Boot — must have для безопасной серверной платформы).


Схема Legacy BIOS — нагромождение рудиментов, которому уже не место в современных системах по множеству причин. Если написать статью про устройство UEFI — это был бы редкий и качественный материал. А уж если ещё и снабдить статью примером простенького Hello World приложения UEFI, то, наверное, это будет вообще уникально.
+6
Благодарю за подробный ответ.
После Вашего комментария я осознал, что EFI интересней, чем мне показалось на первый взгляд.
+2
Было бы интересно почитать про это подробно в следующей статье:)
0
вообще-то очень непросто найти комп с 32-битным EFI, так как он грузит 32-битную винду. Давно уже EFI x64, который сразу грузит x64 OS в родном режиме.
0
Насколько я помню, на рынке достаточно планшетов и нетбуков с ~1-2 гигабайтами оперативки, на которые предустанавливают 32-битную винду. С наибольшей вероятностью у них всех 32-битный EFI, о чём, например, есть много жалоб на линуксовых форумах. Сам не пользовался, так что точно сказать не могу.
0
на каком это рынке достаточно таких нетбуков, на блошином что-ли?
Может для новья так и было лет 5 назад, так даже у телефонов давно уже больше памяти.
+2
Macmini2,1 имеет 64-битный проц и 32-битный EFI. Поставить на него 64-битный linux то еще удовольствие. А машинка очень замечательная для круглосуточного жужания на полке. Использую его в таком режиме уже оооочень давно.
+1
Не очень нужны 128-разрядные процессоры. Где-то 63 бита можно отвести под адресацию (возможно, что наличие функции NX-Bit не даст использовать все 64), а это — скромных 8 ЕБ оперативки.
0
В каком-то смысле 2 ядра по 64 бит и есть 128 бит обработанных данных за такт. Нужны ли именно 128-битные процессоры, если 99% переменных будет состоять по большей части из нулевых старших бит?
0
Большие объемы памяти адресуют даже на 8-битных микроконтроллерах. Специальными регистрами переключают банки памяти и таким образом образаются к любой области памяти, а не только к 256б байтам.
Не очень понятно, почему на ПК область памяти ограничивается адресацией, а переключение банков памяти на 32-битных системах не нашло поддержки массовой (опционально и не везде работает). Хотя решения есть. Некие утилиты обычно.
0
Остаётся загадкой кому понадобились такие решения?
ps: еще были чудо чипсеты которые делали "Appropriated — 896 Mb" и даже на 64бит ос у вас этот кусок выпадал.
0
Не прижилось потому что:
1) Это костыль
2) Не весь старый софт с этим живёт (а на x86 legacy — наше всё)
3) Не все драйвера это переваривают
4) Это несколько медленнее, чем нормальная память
0
Не очень понятно, почему на ПК область памяти ограничивается адресацией, а переключение банков памяти на 32-битных системах не нашло поддержки массовой

А какой в этом практический смысл? Всегда проще добавить линию адреса, нежели переключатель банков памяти. Тем более что последний потребует значительного усложнения менеджера виртуальной памяти
-12
Я так понимаю, миллениал открыл для себя процесс тривиальной загрузки компьютера (который в режиме legacy, за мелкими деталями, не изменялся, наверно, с PC 386) и пытается поделиться с миром новоприобретенным знанием, не утруждая себя погружением в минимальные технические детали, но делая массу терминологических и фактических ошибок.

Статься интересна лишь парой интересных брошенных вскользь замечаний, о более или менее современных вещах, но сказано о них слишком мало (и не факт, что достоверно).

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

Не вектор прерываний (один), а таблица векторов прерываний (256 векторов по 4 байта каждый, всего 1024 байта).
за которым следовала оперативная память

Некорректное выражение. Таблица векторов прерываний тоже находится в оперативной памяти.

UPD:
В этом режиме доступны только 16-ти битные команды

С помощью префиксов можно использовать 32-битные регистры, насчет команд точно не помню но наверное тоже, про 64 не знаю но вряд ли можно.
+7
Здесь так можно комментировать почти каждую строку. Если не ошибка, то неточность/дилетантизм (или архаика вроде мапинга ROM).
+3
есть старый hp dl380 g7, кто-нибудь может объяснить чем он в течении почти трёх минут занимается между включением и началом загрузки?
0
Ну как бы понятно что там не просто таймер на 3 минуты задержки.
Интересуют подробности.
+3
Прогружается прошивка всех подключенных устройств (raid карты, сетевые адаптеры и тд), инициализируется и проверяется ECC память, на некоторых серверных платформах собирается system inventory информация.
+1

Если подключиться к iLO, в виртуальной консоли будут в нижней строке окна выводиться коды POST.
У меня под рукой сейчас нет, но при желании можно нагуглить описание этих кодов и убедиться, что сервер в это время весьма и весьма занят сам собою.

+3
Автору спасибо. Наконец-то все вместе, тезисно и в историческом контексте.
+7
Несколько замечаний
1) POST карту, которая у вас для иллюстрации можно уже смело отправлять на стенку — порт 0x80, куда выводятся POST коды живёт ровно до первого моста PCI-PCI, что делает PCIe пост-карту просто неработоспособной (те, которые есть либо с PCIe берут только питание, либо сингалы не PCIe шины, а прочие, выведенные на этот разъём), сейчас эти коды снимать можно практически только с LPC шины. И да, на современных материнских платах PCI обычно сделан мостом c PCIe шины, что тоже убивает 0x80 порт.
2) Картинка (та, которая с красивой «звёздочной» супермикровской картинкой) у вас рисуется BMC, и он вполне её может отобразить даже без CPU.
3) Про 16бит — проще забыть. UEFI уходит из него почти сразуже после настройки CAR (Cache As Ram) и возвращается в него только при запуске Legacy Option Rom (если не нашел UEFIшных или в настройках стоит Legacy First) и во время работы CSMа. В вашем случае настройка всего железа идёт в 32/64 режиме, далее идёт запуск модуля CSM, который уже живёт в 16 битах.
4) Описанный вами порядок загрузки характерен только если GRUB установлен в MBR, а не на раздел.
0
Первым этапом запуска сервера является включение блока питания и установка сигнала Reset для процессора.


Ну если на то пошло, то пропустили появление сигнала «Power Good»
0
Так есть же:
После стабилизации напряжения блок питания устанавливает сигнал Power Good.
0
Интересно узнать, а что в процессе загрузки делает Intel ME (AMD PSP)? К BMC это тоже относится
0
Кто ж вам скажет. Не знаю как AMD с их PSP, а Intel точно не хочет чтобы кто-то знал что из себя представляет ME. Все ключи шифрования прошиты на физическом уровне внутри процессора.

Насчет BMC — никак он не участвует в загрузке. Это просто отдельный девайс, подключенный к PCI шине. Точнее делать то он может что угодно, но на загрузку его наличие или отсутствие точно никак не влияет.
0
Про BMC — часть настроек берётся с него при загрузке. Включая всевозможные проброшенные виртуальные приводы для дисков|флешек, опции загрузки через iLo (для hp) и т.д.
0
Всегда было интересно почему на навороченных серверах с толпой ксеонов загрузка так отличается от обычных компов. Ну ладно то что он минуту-две выжидает перед стартом биоса еще куда ни шло, но когда видно как биос перерисовывает текст в менюшах это просто песня, даже на 286 такого не было.
0
Здесь ещё особенность в том, что часто эти окна одновременно выводятся в несколько мест сразу — на экран, на виртуальный экран через BMC и в консольный порт (как реальный, так и виртуальный). При этом в качестве графики там часто используется какой-нибудь matrox g200, которому уже 20 лет, завязанный на тот же BMC. При этом он и в современных hp gen10 ставится.
0
Long Mode упразднил сегментированную организацию памяти, присущую 32-х битной архитектуре


Вроде в 32 уже страничная память, нет? а в realmode (16bit) — сегментная.
0
В Protected Mode 32-bit можно использовать и сегменты и страницы.
0
Я рассчитывал прочитать, почему сервер грузится дольше ПК. Как работаем ipmi, как настройки рэйд контроллера вылазят в меню загрузки до загрузки операционной системы.
0
Вы написали мой комментарий за 15 минут до меня.
остается только присоединиться…
И кстати дисковых контроллеров может быть несколько. даже на без дисковом сервере.

0
Я рассчитывал прочитать, почему сервер грузится дольше ПК.

habr.com/ru/company/selectel/blog/471756/#comment_20772508
Как работаем ipmi

Отдельный процессор, цепляющийся к pci шине. Блок схему можно посмотреть в инструкции к любой матери supermicro, например:
image

как настройки рэйд контроллера вылазят в меню загрузки до загрузки операционной системы.

Option ROM. Почитать можно на википедии или в BIOS Boot Specification.
-1
серверы стартуют со всеми этими погремушками по две минуты, а бизнес стоит. А если нужна не одна перезагрузка?

Почему производители не конкурируют по этому параметру?
+4
Потому что никому особо не нужна скорость перезагрузки, полученная за счёт выкидывания кучи проверок (как это делают в десктопах). Если бизнес стоит из-за перезагрузки и две минуты приносят проблемы — это плохое проектирование системы. Время переходить на кластер из пары серверов с миграцией виртуальных машин.
+5

Две минуты — это ооочень быстро, поверьте.


Спарка IBM из двух 3850x5 (7143) в полной конфигурации может инициализироваться несколько десятков минут.

+3
Многие подобные статьи грешат поверхностностью и неявными отсылками к «магии». Например, в них не прочитать:
— Что означает магическая фраза «инициализация оборудования»?
— Куда именно сохраняются и как именно применяются «настройки биоса» (путаница UI с собственно механизмом работы)?
— Если код в старом биосе (который в пзу) работает в 16-битном режиме, то как же 32- или 64-битная ОС его выполняет? (Никак?) Как же она все это «инициализированное в биос оборудование» ©® использует?
— Что там с маппингом памяти и DMA?
— Как именно процессор умудряется проснуться от сети (и от чего именно в сети?) — или как биос умудряется доступиться до tftp при загрузке по сети?

В общем, детали интересны, детали!
0
Если учесть, что VRM сейчас часто вполне сама по себе полноценная микропроцессорная система, то вопросов становится гораздо больше :)
+2
Сейчас на материнской плате и так процессоров хватает. К примеру на AMD кроме самого x86 камня есть ещё 8051 в IMC, LT32 в роли процессора для управления питанием (и да, он дёргает по SVID тот cамый VRM), ARM в качестве PSP. В USB3.0 контроллере тоже свой процессор типа 8051 есть. И если взять SoC — то всё это живёт на одном кристале.
+2
Именно поэтому управление питанием и частотами уже довольно давно выполняется софтом, а не железом, что у Intel (ICC стал частью ME с 7.х (Sandy Bridge+), PMC вынесли в отдельную от МЕ прошивку в 11.х (Skylake+), что у AMD (SMU, Piledriver+). VRM обычно не имеет своей полноценной прошивки, вместо этого он подключен к одной из системных шин вроде SMBUS, и управляется PMC/SMU напрямую.
+4
Что означает магическая фраза «инициализация оборудования»?
После ресета или выключения питания все железо оказывается в начальном состоянии, в котором оно зачастую работать не может, и нуждается в дополнительной настройке прежде, чем его можно будет начать использовать. Вот эта настройка и называется инициализацией, т.е. приведением железа в его начальное рабочее состояние. Инициализация простого железа типа COM-порта укладывается в несколько строк на С, а вот железо посложнее, память оперативная, к примеру, или видеокарта — это уже совсем другой разговор и там иногда нужны десятки тысяч строк кода, чтобы железка заработала как задумано. Углубляться в эту тему можно бесконечно, и там целая отрасль знаний (platform bring-up) за этой простой фразой прячется.

Куда именно сохраняются и как именно применяются «настройки биоса» (путаница UI с собственно механизмом работы)?
Раньше сохранялись в CMOS SRAM, специальной энергозависимой памяти с батарейным питанием, но потом настроек стало достаточно, чтобы чипы SRAM такого объема стали слишком дорогими, и их заменили на SPI NOR (у которых 100к циклов перезаписи и с которых можно загружаться напрямую). Я уже писал про то, зачем нужна, и как устроена NVRAM вот тут.

Если код в старом биосе (который в пзу) работает в 16-битном режиме, то как же 32- или 64-битная ОС его выполняет? (Никак?) Как же она все это «инициализированное в биос оборудование» ©® использует?
БИОС именно из ПЗУ исполняется очень короткое время в самом начале, когда еще нет инициализированы ни оперативная память, ни L2 cache. Как только память доступна, прошивка копируется в нее и исполняется уже оттуда.
Как ОС выполняет 16-битный код: через трамплины, т.е. ОС вызывает прерывание (потому что 16-битный сейчас только старый интерфейс BIOS Interrupt Call), обработчик переводит процессор в 16 битный режим, выполняет 16-битный код БИОСа, затем возвращает режим в оригинальный, и передает управление вызывающему коду. Вся эта прыготня довольно медленная, и нужна исключительно системам, которые либо не умеют сами использовать оборудование (и потому полагаются на код БИОСа), либо не догадываются, что оборудования на самом деле нет (т.е. оно эмулируется БИОСом целиком).
Как ОС использует оборудование: качественные ОС ничему вообще не верят, и оборудование стараются переинициализировать самостоятельно, не надеясь на милость авторов БИОСа.

Что там с маппингом памяти и DMA?
А что с ними? В БИОСе была карта памяти e820, которую ОС нужно было использовать, чтобы не возникало конфликтов между памятью ОС и памятью БИОСа и устройств. В UEFI есть своя карта памяти, и нормальный аллокатор, успешно скрывающий большую часть управления памятью от разработчика UEFI-драйверов и загрузчиков. Про DMA там отдельная большая тема с IOMMU и Bus Mastering'ом, про которую нужно книгу писать, а не коммент.

Как именно процессор умудряется проснуться от сети (и от чего именно в сети)
Процессор просыпается не от сети, а от сигнала сетевого чипа (точнее, двух чипов, NIC и PHY, первый из которых спал ровно настолько, чтобы по прежнему следить за пакетами, а второй не спал вообще, а работал от дежурного напряжения). Wake-on-LAN — это специальный пакет с MAC-адресом, и если его прием настроен, то по его приходу NIC пошлет процессору сигнал по отдельной физической ноге.

Как биос умудряется доступиться до tftp при загрузке по сети?
Так же, как и любая другая ОС, у него либо в самой прошивке стек сетевых драйверов, либо весь стек вкомпилен внутрь PXE-загрузчика.

Если детали реально интересны, могу посоветовать литературу по firmware development и platform bring-up, а также чемодан даташитов на конкретное железо.
0

О, очень интересно! Вот такой материал, с таким уровнем подробностей, в научно-популярном виде бы — и на Хабр, на Хабр. Да хоть в таком вот формате Q&A — «все, что вы хотели знать про железо, но боялись спросить».

0

Да, если уж заниматься археологией, про dos4gw тоже интересно было бы. Почему он такой большой был, что там в нем (и почему он exe).

0
DOS4/GW — это бесплатная ограниченная версия экстендера DOS/4G, которая поставлялась с набором компиляторов Watcom C/C++. Большая часть экстендеров для DOS реализовывало спецификацию DPMI 0.9 (некоторые поздние — 0.9 и 1.0), и по спецификации являлись DPMI host'ами, т.е. программами, предоставляющими интерфейс DPMI другим программам — клиентам (которые с его помощью получали доступ к защищенному режиму процессора, 32-битному режиму, плоской адресации памяти и другим плюшкам, недоступным изначально в основной ОС — DOS). На данный момент существует свободная и открытая альтернатива DOS4/G* — DOS/32A, если вам интересны подробности, можете почитать документацию к ней.
-2
требую замены «прыжок» на «переход»!!!
нас так в детстве учили!
0
А вот мне интересно, как работает флешка, которая всё магическим образом преобразовывает в EFI-окружение, при этом саму её запускает в Legacy-BIOS (актуально для установки и загрузки системы на nvme ssd на старых системах).
0
Легко, там просто собраный tianocore, которая UEFI, со всеми нужными модулями и драйверами. Она стартует после BIOS и далее переходит в 32бит режим, где и поднимает все нужные EFI сервисы и драйвера.
0
Код Stage 2 хранится сразу после структуры MBR и до начала первого раздела диска.
Кто Вам это сказал??? Вы явно рассказываете о каком-то кастомном загрузчике, а не о том generic-коде, который с минимальными изменениями дожил до наших дней ещё со времён голого DOS.

Код, загружаемый из МБР и выполняемый на Stage1, выполняет просмотр хранящейся в его теле таблицы разделов, находит первый из разделов, помеченный признаком активности, загружает в память по тому же адресу 0x7C00 (предварительно перенеся себя в другое место) первый сектор раздела (бут-сектор), и передаёт ему управление. Всё. Ну ещё, если активный раздел не найден, или если в считанном бут-секторе нет сигнатуры 0x55AA, или таблица разделов содержит невалидные значения, то он выводит нечто типа «Missing OS» или «Error loading OS» или «Wrong partition table», и либо вешается, либо возвращает управление процедурам БИОС.

Но если всё нормально, то после загрузки бут-сектора активного раздела и передачи ему управления как раз и начинается Stage2. И именно код бут-сектора дочитывает дополнительные секторы с кодом, выполняющим парсинг файловой системы и всё прочее.
+2
Формально в статье предупредили, что рассматривается GRUB2. Вот только забыли приписать, что GRUB2 установленый в MBR, т.к. в случае установки GRUB на раздел диска работает классический метод.
0
Ну ещё, если активный раздел не найден, или если в считанном бут-секторе нет сигнатуры 0x55AA

По идее, на экране тогда увидите «No bootable device — insert boot disk...».
0
По идее, на экране тогда увидите «No bootable device — insert boot disk...».

Это уже определяется кодом загрузчика (впрочем, дефолтно он возвращает управление процедурам БИОС) и кодом БИОС (одни выводят это сообщение, другие просто пытаются грузиться со следующего по списку устройства, впрочем, первое чаще).
Только полноправные пользователи могут оставлять комментарии., пожалуйста.