Запуск сервера — длинная и сложная последовательность действий, зависящая от аппаратной составляющей, настроек и используемого программного обеспечения. Многие, даже опытные и квалифицированные системные администраторы, плохо себе представляют, что именно происходит в процессе запуска сервера, поэтому мы решили разобрать этот процесс детально.

Чтобы не разбирать все возможные случаи, мы рассмотрим загрузку при следующих условиях:

  • 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 в начале адресного пространства находился вектор прерываний, за которым следовала оперативная память, объем которой мог быть любым. Чтобы не возникло пересечений с оперативной памятью, адрес первой команды был взят в конце адресного пространства.

В дальнейшем, с появлением Intel 80286, вектор прерываний можно было передвинуть в любое место. Тем не менее, даже современные процессоры запускаются в режиме совместимости с 8086 и вектором прерываний по адресу 0x0.
При обращении по адресу 0xFFFFFFF0 процессор получает первую команду с ПЗУ. В режиме Legacy эта команда представляет из себя длинный прыжок или Far Jump в сегмент памяти с кодом BIOS. После выполнения первого длинного прыжка процессор переходит в 16-ти разрядный Real Mode и приступает к выполнению кода BIOS.

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, отправляет последовательность прерываний «InitStartUpStartUp» для пробуждения всех AP. Прикладные процессоры после запуска так же необходимо инициализировать и перевести в Long Mode, но теперь этот процесс быстрее, так как эта работа уже выполнена основным процессором.

После инициализации всех AP планировщик процессов запускает служебный процесс, который называется «бездействие» или Idle. Как следует из названия, этот процесс ничего не делает и занимает процессор, когда нет других процессов.

Когда всё настроено и готово к работе, ядро операционной системы запускает первый процесс в пространстве пользователя — Init. Тот, в свою очередь, запускает остальные процессы в пространстве пользователя. После запуска init-процесса ядро переходит в режим ожидания и бездействует до появления заданий в пространстве ядра.

После запуска всех процессов сервер становится доступен по сети, а на консоли можно видеть приглашение Logon экрана.

Заключение


На первый взгляд простой и быстрый запуск сервера и загрузка операционной системы на деле представляет собой сложный и запутанный процесс с множеством нюансов. Прохождение этого процесса — маленькая эволюция, развивающая вычислительную мощность процессора от старых 16-ти битных процессоров до современных 64-х битных «монстров».

А как Вы думаете, при появлении 128-ми разрядных процессоров, в них будет режим совместимости с 16-ти битными?

Комментарии (68)


  1. DrPass
    17.10.2019 14:34
    +2

    Вопрос: а почему статья называется «как запускается сервер», если описывает в общем-то стандартный процесс запуска любого компьютера x86/x64, причем с не таким уж большим количеством деталей, добавившихся с 1983 года? ;)


    1. tvr
      17.10.2019 15:47
      +3

      Наверное потому, что «сервер» звучит внушительнее, чем «компьютер». Но это не точно.


    1. frkbvfnjh
      18.10.2019 06:02

      Это первый вопрос, который у меня возник…


    1. DaemonGloom
      18.10.2019 08:57

      Более того, на скриншотах показан сервер с UEFI, процедура загрузки которого отличается. Да и BMC в этом деле тоже местами участвует.


  1. 13werwolf13
    17.10.2019 15:06
    +2

    В эпоху повсеместного EFI актуальность статьи под большим вопросом.


    1. Firemoon Автор
      17.10.2019 15:25

      Загрузка с помощью EFI минует весь этап с Real Mode, весь код сразу работает в 32-х битном режиме, в остальном изменений практически нет. Режим Legacy был выбран, потому что этот процесс длиннее и погружает в историю.


      1. 13werwolf13
        17.10.2019 15:29

        Вот только статьи об этом на хабре не пролетало. А про легаси уже не раз…



      1. YourChief
        17.10.2019 17:54
        +7

        в остальном изменений практически нет.

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

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


        Схема Legacy BIOS — нагромождение рудиментов, которому уже не место в современных системах по множеству причин. Если написать статью про устройство UEFI — это был бы редкий и качественный материал. А уж если ещё и снабдить статью примером простенького Hello World приложения UEFI, то, наверное, это будет вообще уникально.


        1. Firemoon Автор
          17.10.2019 18:10
          +4

          Благодарю за подробный ответ.
          После Вашего комментария я осознал, что EFI интересней, чем мне показалось на первый взгляд.


          1. mammuthus
            17.10.2019 22:28
            +2

            Было бы интересно почитать про это подробно в следующей статье:)


        1. CodeRush
          18.10.2019 00:02
          +2

          Посмотрите у меня в профиле, и по тегу UEFI, большая часть нужных вам статей уже написана.


      1. rrust
        17.10.2019 17:57

        вообще-то очень непросто найти комп с 32-битным EFI, так как он грузит 32-битную винду. Давно уже EFI x64, который сразу грузит x64 OS в родном режиме.


        1. dvrpd
          17.10.2019 20:40

          Насколько я помню, на рынке достаточно планшетов и нетбуков с ~1-2 гигабайтами оперативки, на которые предустанавливают 32-битную винду. С наибольшей вероятностью у них всех 32-битный EFI, о чём, например, есть много жалоб на линуксовых форумах. Сам не пользовался, так что точно сказать не могу.


          1. rrust
            17.10.2019 21:57

            на каком это рынке достаточно таких нетбуков, на блошином что-ли?
            Может для новья так и было лет 5 назад, так даже у телефонов давно уже больше памяти.


        1. tea
          17.10.2019 23:08
          +2

          Macmini2,1 имеет 64-битный проц и 32-битный EFI. Поставить на него 64-битный linux то еще удовольствие. А машинка очень замечательная для круглосуточного жужания на полке. Использую его в таком режиме уже оооочень давно.


          1. rrust
            18.10.2019 00:04

            действительно давно, модель 2007 года


  1. Victor_koly
    17.10.2019 15:18

    Не очень нужны 128-разрядные процессоры. Где-то 63 бита можно отвести под адресацию (возможно, что наличие функции NX-Bit не даст использовать все 64), а это — скромных 8 ЕБ оперативки.


    1. Fedorkov
      17.10.2019 19:47
      +1

      8 эксабайт хватит всем.


    1. sim31r
      19.10.2019 00:50

      В каком-то смысле 2 ядра по 64 бит и есть 128 бит обработанных данных за такт. Нужны ли именно 128-битные процессоры, если 99% переменных будет состоять по большей части из нулевых старших бит?


      1. Victor_koly
        19.10.2019 19:30

        Я говорил в смысле адресации памяти.


        1. sim31r
          21.10.2019 10:20

          Большие объемы памяти адресуют даже на 8-битных микроконтроллерах. Специальными регистрами переключают банки памяти и таким образом образаются к любой области памяти, а не только к 256б байтам.
          Не очень понятно, почему на ПК область памяти ограничивается адресацией, а переключение банков памяти на 32-битных системах не нашло поддержки массовой (опционально и не везде работает). Хотя решения есть. Некие утилиты обычно.


          1. kovserg
            21.10.2019 13:04

            Остаётся загадкой кому понадобились такие решения?
            ps: еще были чудо чипсеты которые делали "Appropriated — 896 Mb" и даже на 64бит ос у вас этот кусок выпадал.


  1. semibiotic
    17.10.2019 16:01
    -5

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

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

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


  1. vdem
    17.10.2019 16:53

    в начале адресного пространства находился вектор прерываний

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

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

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

    С помощью префиксов можно использовать 32-битные регистры, насчет команд точно не помню но наверное тоже, про 64 не знаю но вряд ли можно.


    1. semibiotic
      17.10.2019 17:19
      +5

      Здесь так можно комментировать почти каждую строку. Если не ошибка, то неточность/дилетантизм (или архаика вроде мапинга ROM).


  1. pvvv
    17.10.2019 17:07

    есть старый hp dl380 g7, кто-нибудь может объяснить чем он в течении почти трёх минут занимается между включением и началом загрузки?


    1. tvr
      17.10.2019 17:10

      Рефлексирует, аки принц датский.


    1. chumric
      17.10.2019 17:42

      Тоже интересно, чем он занимается


    1. malefix
      17.10.2019 18:13

      например, ждёт, когда питание «стабилизируется»


    1. JerleShannara
      17.10.2019 19:13

      Тестирует железо он долго очень.


      1. pvvv
        17.10.2019 19:37

        Ну как бы понятно что там не просто таймер на 3 минуты задержки.
        Интересуют подробности.


        1. Alexsey
          17.10.2019 22:45
          +1

          Прогружается прошивка всех подключенных устройств (raid карты, сетевые адаптеры и тд), инициализируется и проверяется ECC память, на некоторых серверных платформах собирается system inventory информация.


    1. autuna
      17.10.2019 20:50
      +1

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


  1. Murimonai
    17.10.2019 17:43
    +2

    Автору спасибо. Наконец-то все вместе, тезисно и в историческом контексте.


  1. JerleShannara
    17.10.2019 17:54
    +5

    Несколько замечаний
    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, а не на раздел.


  1. ahdenchik
    17.10.2019 19:35

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


    Ну если на то пошло, то пропустили появление сигнала «Power Good»


    1. Victor_koly
      17.10.2019 20:26

      Так есть же:

      После стабилизации напряжения блок питания устанавливает сигнал Power Good.


  1. andreysl
    17.10.2019 22:26

    Интересно узнать, а что в процессе загрузки делает Intel ME (AMD PSP)? К BMC это тоже относится


    1. Alexsey
      17.10.2019 22:52

      Кто ж вам скажет. Не знаю как AMD с их PSP, а Intel точно не хочет чтобы кто-то знал что из себя представляет ME. Все ключи шифрования прошиты на физическом уровне внутри процессора.

      Насчет BMC — никак он не участвует в загрузке. Это просто отдельный девайс, подключенный к PCI шине. Точнее делать то он может что угодно, но на загрузку его наличие или отсутствие точно никак не влияет.


      1. DaemonGloom
        18.10.2019 09:01

        Про BMC — часть настроек берётся с него при загрузке. Включая всевозможные проброшенные виртуальные приводы для дисков|флешек, опции загрузки через iLo (для hp) и т.д.


  1. kovserg
    17.10.2019 22:48

    Всегда было интересно почему на навороченных серверах с толпой ксеонов загрузка так отличается от обычных компов. Ну ладно то что он минуту-две выжидает перед стартом биоса еще куда ни шло, но когда видно как биос перерисовывает текст в менюшах это просто песня, даже на 286 такого не было.


    1. DaemonGloom
      18.10.2019 09:06

      Здесь ещё особенность в том, что часто эти окна одновременно выводятся в несколько мест сразу — на экран, на виртуальный экран через BMC и в консольный порт (как реальный, так и виртуальный). При этом в качестве графики там часто используется какой-нибудь matrox g200, которому уже 20 лет, завязанный на тот же BMC. При этом он и в современных hp gen10 ставится.


      1. JerleShannara
        18.10.2019 15:18

        Матрас это ещё хорошо, бывает и что-то типа ATI Rage XL.


  1. sim2q
    18.10.2019 01:47
    +1

    и тут на середине:
    LI....


  1. Alexus819
    18.10.2019 08:46

    Long Mode упразднил сегментированную организацию памяти, присущую 32-х битной архитектуре


    Вроде в 32 уже страничная память, нет? а в realmode (16bit) — сегментная.


    1. vdem
      18.10.2019 10:44

      В Protected Mode 32-bit можно использовать и сегменты и страницы.


  1. LAG_LAGbI4
    18.10.2019 09:56

    Я рассчитывал прочитать, почему сервер грузится дольше ПК. Как работаем ipmi, как настройки рэйд контроллера вылазят в меню загрузки до загрузки операционной системы.


    1. V-core
      18.10.2019 10:11

      Вы написали мой комментарий за 15 минут до меня.
      остается только присоединиться…
      И кстати дисковых контроллеров может быть несколько. даже на без дисковом сервере.


    1. Alexsey
      18.10.2019 23:05

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

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

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

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

      Option ROM. Почитать можно на википедии или в BIOS Boot Specification.


  1. vladvul
    18.10.2019 11:54

    серверы стартуют со всеми этими погремушками по две минуты, а бизнес стоит. А если нужна не одна перезагрузка?

    Почему производители не конкурируют по этому параметру?


    1. DaemonGloom
      18.10.2019 12:15
      +2

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


    1. autuna
      18.10.2019 12:28
      +1

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


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


  1. DmitryKoterov
    18.10.2019 12:48

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

    В общем, детали интересны, детали!


    1. Tolmy
      18.10.2019 19:09

      Если учесть, что VRM сейчас часто вполне сама по себе полноценная микропроцессорная система, то вопросов становится гораздо больше :)


      1. JerleShannara
        18.10.2019 19:52
        +1

        Сейчас на материнской плате и так процессоров хватает. К примеру на AMD кроме самого x86 камня есть ещё 8051 в IMC, LT32 в роли процессора для управления питанием (и да, он дёргает по SVID тот cамый VRM), ARM в качестве PSP. В USB3.0 контроллере тоже свой процессор типа 8051 есть. И если взять SoC — то всё это живёт на одном кристале.


      1. CodeRush
        18.10.2019 19:56
        +1

        Именно поэтому управление питанием и частотами уже довольно давно выполняется софтом, а не железом, что у Intel (ICC стал частью ME с 7.х (Sandy Bridge+), PMC вынесли в отдельную от МЕ прошивку в 11.х (Skylake+), что у AMD (SMU, Piledriver+). VRM обычно не имеет своей полноценной прошивки, вместо этого он подключен к одной из системных шин вроде SMBUS, и управляется PMC/SMU напрямую.


    1. CodeRush
      18.10.2019 19:42
      +3

      Что означает магическая фраза «инициализация оборудования»?
      После ресета или выключения питания все железо оказывается в начальном состоянии, в котором оно зачастую работать не может, и нуждается в дополнительной настройке прежде, чем его можно будет начать использовать. Вот эта настройка и называется инициализацией, т.е. приведением железа в его начальное рабочее состояние. Инициализация простого железа типа 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, а также чемодан даташитов на конкретное железо.


      1. DmitryKoterov
        20.10.2019 05:06

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


      1. DmitryKoterov
        20.10.2019 05:09

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


        1. CodeRush
          20.10.2019 06:21

          DOS4/GW — это бесплатная ограниченная версия экстендера DOS/4G, которая поставлялась с набором компиляторов Watcom C/C++. Большая часть экстендеров для DOS реализовывало спецификацию DPMI 0.9 (некоторые поздние — 0.9 и 1.0), и по спецификации являлись DPMI host'ами, т.е. программами, предоставляющими интерфейс DPMI другим программам — клиентам (которые с его помощью получали доступ к защищенному режиму процессора, 32-битному режиму, плоской адресации памяти и другим плюшкам, недоступным изначально в основной ОС — DOS). На данный момент существует свободная и открытая альтернатива DOS4/G* — DOS/32A, если вам интересны подробности, можете почитать документацию к ней.


  1. Norsat
    18.10.2019 13:03

    требую замены «прыжок» на «переход»!!!
    нас так в детстве учили!


  1. mozg1986
    18.10.2019 15:53

    А вот мне интересно, как работает флешка, которая всё магическим образом преобразовывает в EFI-окружение, при этом саму её запускает в Legacy-BIOS (актуально для установки и загрузки системы на nvme ssd на старых системах).


    1. JerleShannara
      18.10.2019 17:39

      Легко, там просто собраный tianocore, которая UEFI, со всеми нужными модулями и драйверами. Она стартует после BIOS и далее переходит в 32бит режим, где и поднимает все нужные EFI сервисы и драйвера.


  1. Akina
    18.10.2019 16:22

    Код Stage 2 хранится сразу после структуры MBR и до начала первого раздела диска.
    Кто Вам это сказал??? Вы явно рассказываете о каком-то кастомном загрузчике, а не о том generic-коде, который с минимальными изменениями дожил до наших дней ещё со времён голого DOS.

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

    Но если всё нормально, то после загрузки бут-сектора активного раздела и передачи ему управления как раз и начинается Stage2. И именно код бут-сектора дочитывает дополнительные секторы с кодом, выполняющим парсинг файловой системы и всё прочее.


    1. JerleShannara
      18.10.2019 17:40
      +2

      Формально в статье предупредили, что рассматривается GRUB2. Вот только забыли приписать, что GRUB2 установленый в MBR, т.к. в случае установки GRUB на раздел диска работает классический метод.


    1. Victor_koly
      18.10.2019 19:58

      Ну ещё, если активный раздел не найден, или если в считанном бут-секторе нет сигнатуры 0x55AA

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


      1. Akina
        21.10.2019 08:43

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

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