Запись в блоге

Вы здесь

Процесс загрузки

Процесс загрузки BIOS / MBR

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

Выяснить на каком этапе произошел сбой при загрузке системы можно разными способами, от самых простых до бесконечно сложных. На форуме мне часто приходится сталкиваться с полнейшим не пониманием Что и Как происходит в Процессе загрузки, а это основной момент, чтобы выявить неисправность компьютера или ноутбука. 

Независимо от компьютера или операционной системы, стандартные IBM-совместимые настольные ПК и ноутбуки включаются и запускаются одним из двух способов: традиционным методом BIOS-MBR и более продвинутым UEFI-GPT. В этом посте я постараюсь кратко описать процесс загрузки операционной системы на примере микропрограммы BIOS, а также расскажу основы и детали BIOS, MBR и Загрузочного сектора. Первое и основное, что вы должны знать, какая последовательность загрузки для всех стандартных компьютеров и операционных систем.

Обзор процесса загрузки BIOS / MBR

  1. Включение компьютера. BIOS инициализирует аппаратное обеспечение.
  2. BIOS вызывает код который хранится в MBR расположенном на диске 0.
  3. MBR загружает код из загрузочного сектора активного раздела.
  4. Загрузочный сектор запускает загрузчик из его файловой системы.

Как видите, процесс загрузки разбит на несколько основных компонентов, каждый из которых представляет собой совершенно отдельную подсистему с множеством различных опций и вариантов. Реализации каждого компонента может сильно различаться в зависимости от вашего оборудования и операционной системы, но правила, которым они следуют, и процесс, с помощью которого они работают, всегда одинаковы!

Компоненты процесса загрузки

BIOS - это то место, где аппаратные средства встречаются с программным обеспечением, и где начинается процесс загрузки. Код BIOS находится на материнской плате вашего компьютера, обычно хранится в так называемой EEPROM и в значительной степени зависит от оборудования. BIOS - это самый низкий уровень программного обеспечения, который взаимодействует с оборудованием в целом. Он представляет собой интерфейс, с помощью которого загрузчик и ядро ​​операционной системы могут взаимодействовать с аппаратным обеспечением и контролировать его посредством обращений (прерываний) к BIOS. Операционная система в свою очередь, может запускать BIOS для чтения и записи на диск и взаимодействия с другими аппаратными компонентами.

Когда ваш компьютер включается электрические компоненты изначально отвечают за то, чтобы оживить ваш компьютер. Вы нажимаете кнопку питания и запускаете переключатель, который активирует источник питания и направляет ток от блока питания к материнской плате и, главным образом через него, на все компоненты вашего ПК. Поскольку каждый отдельный компонент получает питание, он включается и переводится в исходное состояние. Процедуры запуска и общая функциональность более простых компонентов, таких как ОЗУ и БП, встроены в них в виде последовательности логических схем (AND / NAND и OR / NOR), в то время как более сложные компоненты, такие как видеокарта, имеют свои собственные микроконтроллеры, которые могут выступать в качестве мини-процессоров.

Процесс POST

Как только ваш компьютер включен, BIOS начинает свою работу как часть процесса POST (Power-On Self Test). Он соединяет все различные части вашего компьютера вместе и, при необходимости, взаимодействует между ними, настраивая ваш дисплей для принятия основного VGA и отображения его на экране, инициализируя банки памяти и предоставляя вашему ЦП доступ ко всем аппаратным средствам. Он сканирует шины ввода-вывода на наличие подключенного оборудования, а также идентифицирует и отображает доступ к жестким дискам, подключенным к компьютеру. BIOS на новых материнских платах достаточно умен, чтобы распознавать и идентифицировать USB-устройства, такие как внешние накопители и USB-мыши, позволяя загружаться с USB-накопителей и использовать мышь в устаревшем программном обеспечении.

Во время процедуры POST-опроса, где это возможно, проводятся быстрые тесты, и часто выявляются ошибки, вызванные несовместимым оборудованием, отключенными устройствами или неисправными компонентами. Это BIOS, который отвечает за различные сообщения об ошибках, такие как ошибка клавиатуры или отсутствует клавиатура или предупреждения о проблемах с оперативной памятью. На данный момент большая часть работы BIOS завершена, и все почти готово перейти к следующему этапу Процесса загрузки. Осталось только запустить так называемые дополнительные ПЗУ.

Некоторые устройства, подключенные к материнской плате, могут потребовать вмешательства пользователя для завершения инициализации, а BIOS фактически передает управление программам, закодированным в аппаратные средства, такие как видеокарта или RAID-контроллеры. Они берут на себя управление компьютером и его дисплеем и позволяют вам выполнять такие действия, как настройка RAID-массивов или настройка параметров дисплея, прежде чем компьютер действительно завершит этап включения. Когда они завершают выполнение, они передают управление компьютером обратно в BIOS, и компьютер переходит в основное, удобное для использования состояние, и готов к работе.

BIOS Boot Handoff

После настройки основных устройств ввода и вывода вашего ПК, BIOS вступает в финальную стадию, где он все еще контролирует ваш компьютер. На этом этапе вам обычно предоставляется возможность быстро нажать клавишу, чтобы войти в настройки BIOS, откуда вы можете настроить параметры оборудования и контролировать загрузку своего компьютера. Если вы ничего не выберете, BIOS начнет первый шаг загрузки вашего ПК с использованием настроек по умолчанию.

Вообщем, важной частью работы BIOS является обнаружение и отображение подключенных жестких дисков. Этот список теперь пригодится, так как BIOS загрузит очень маленькую программу с первого жесткого диска в память и скажет ЦПУ выполнить его содержимое, передав управление компьютером всему, что находится на жестком диске, и завершит свою активную роль в загрузке вашего компьютера. Этот жесткий диск известен как загрузочное устройство, загрузочный диск или диск 0, и обычно может быть выбран или установлен в настройках BIOS.

Загрузочное устройство

Независимо от того, был ли BIOS настроен на загрузку с локального жесткого диска или со съемного USB-накопителя, последовательность передачи обслуживания одинакова. После завершения процедур BIOS POST и Add On ROM BIOS загружает первые 512 байтов с жесткого диска выбранного Загрузочного устройства - эти 512 байтов являются так называемыми MBR или Master Boot Record.

Основная загрузочная запись (MBR)

MBR - это первый и самый важный компонент в программной части процедуры загрузки на компьютерах с BIOS. Каждый жесткий диск имеет MBR, и он содержит несколько важных частей информации. Рассмотрим их подробнее.

Таблица разделов

Прежде всего, MBR содержит нечто, называемое Таблицей разделов, которая представляет собой индекс до четырех разделов, существующих на одном диске, если хотите, оглавление. Без него весь диск мог бы содержать только один раздел, что означает, что на одном диске не может быть разных файловых систем, что, в свою очередь, означает, что вы никогда не смогли бы установить Linux и Windows на тот же диск, например.

Загрузочный код

Во-вторых, MBR содержит очень важный фрагмент кода, известный как код начальной загрузки. В зависимости от операционной системы и платформы, код начальной загрузки может фактически составлять от 434 до 446 байт из 512 байтов и может содержать буквально что угодно.  В большинстве современных операционных систем 440 байт является верхним пределом, поскольку последние 6 байтов отводятся для 4-байтовой подписи диска со смещением и 2 -байтовое поле, указывающее состояние чтения-записи диска со смещением. BIOS загрузит его и выполнит его содержимое как есть, начиная с процедуры начального загрузчика.

Учитывая, насколько крошечный раздел кода начальной загрузки MBR, единственная полезная цель, которую он действительно может выполнить, - это поиск другого файла на диске и загрузка его для выполнения фактического процесса загрузки. Таким образом, этот код начальной загрузки часто называют Загрузчиком первого этапа. В зависимости от операционной системы точное место, в котором код начальной загрузки выполняет поиск загрузчика второго этапа, может измениться, но в Windows загрузчик первого этапа будет искать в таблице MBR для раздела, помеченного как активный. Это указывает на то, что начало раздела содержит следующую часть загрузочного кода в его начальных секторах (также известный как загрузочный сектор). На правильно созданном диске MBR только один раздел может быть помечен как активный. Это означает, что фактический бит, указывающий, что раздел является загрузочным, не может присутствовать более чем на одном или на всех разделах одновременно! Такая неверная конфигурация может вызвать много разных проблем с загрузкой!

Таким образом, задача сегмента кода начальной загрузки в MBR довольно проста: найти активный раздел из таблицы разделов и загрузить этот код в память для выполнения ЦП в качестве следующего звена в цепочке загрузки. В зависимости от загружаемой ОС, он может искать другой раздел вместо активного раздела (например, всегда загружать загрузочный сектор 3-го раздела), и смещение загрузочного кода в загрузочном секторе раздела может измениться, но основная концепция остается той же. Однако по причинам устаревшей совместимости, MBR почти всегда загружает первый сектор активного раздела.

Boot Signature

На IBM-совместимых компьютерах (в основном все) последние два байта 512-байтовой MBR называются загрузочной подписью и используются BIOS для определения, является ли выбранный загрузочный диск действительно загрузочным или нет. На диске, который содержит допустимый код начальной загрузки, последние два байта MBR всегда должны быть 0x55 0xAA. Если последние два байта MBR определены не равными 0x55 и 0xAA соответственно, BIOS будет считать, что диск незагрузочный и не является допустимым параметром загрузки - в этом случае он будет использовать следующее устройство в списке порядка загрузки (в соответствии с настройкой BIOS). Например, если первое загрузочное устройство в BIOS установлено как USB-накопитель без правильной загрузочной подписи, а второе - локальный жесткий диск, то BIOS пропустит его и перейдет к попытке загрузиться с локального диска. Если ни один диск в списке загрузочных устройств не имеет правильной подписи загрузки 0x55 0xAA, BIOS отобразит ошибку, такую ​​как печально известное Нет доступного загрузочного устройства или Перезагрузитесь и выберите правильное загрузочное устройство.

Сектор загрузочных разделов

Как я уже говорила, код начальной загрузки в MBR обычно загружает последовательность байтов с начала активного раздела. Точная структура раздела зависит от того, какая файловая система была создана или отформатирована, но обычно выглядит примерно так:

  • Одна инструкция JMP (переход), которая является сборкой Assembly, (Assembly - самый примитивный язык программирования и состоит из отдельных инструкций, непосредственно считываемых и выполняемых ЦП, эквивалентных команде goto), .
  • Заголовок файловой системы, который будет содержать информацию, специфичную и важную для самой файловой системы.
  • Другой сегмент кода начальной загрузки, содержащий следующий этап процесса начального загрузчика.
  • Маркер конца сектора, очень похожий на загрузочную подпись 0x55 0xAA, которую мы видели ранее в MBR.

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

  1. MBR загружает первые 512 байтов активного раздела в память и инструктирует ЦП их выполнять.
  2. Самые первые три байта загрузочного сектора раздела содержат единственную инструкцию JMP, говорящую ЦПУ пропустить вперед ХХ байтов и выполнить оттуда следующий этап загрузчика.
  3. Процессор следует инструкции JMP и ищет начало кода начальной загрузки, содержащегося в загрузочном секторе раздела, и начинает выполнение.

Загрузочный код в разделе не конец пути, это всего лишь еще один шаг на этом пути. Из-за того, как мало места выделяется для кода начальной загрузки в загрузочном секторе раздела, код, который он содержит, обычно заканчивается другой командой JMP, инструктирующей ЦП перейти к следующему сектору в разделе, который часто выделяется для оставшейся части раздела. В зависимости от файловой системы, это может быть несколько секторов по длине или столько, сколько нужно, чтобы соответствовать этой стадии загрузчика.

Загрузчик второй ступени

Второй этап загрузчика, хранящийся в загрузочном секторе раздела в разделе начальной загрузки и, возможно, продолжающийся после него, выполняет следующий этап в процессе загрузчика: он ищет файл, хранящийся на самом разделе (как обычный файл) и сообщает ЦПУ о необходимости выполнить его содержимое, чтобы начать заключительную часть процесса загрузки.

В отличие от предыдущих сегментов начальной загрузки MBR и загрузочного сектора раздела, следующий шаг в процессе загрузки не сохраняется с выделенным смещением в пределах раздела (код начальной загрузки не может просто сообщить ЦП JMP о расположении 0xABC и выполнить оттуда загрузочный файл) - это обычный файл, который хранится среди других обычных файлов в файловой системе на диске.

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

Загрузчик

Файлы загрузчика на диске формируют заключительные части процесса загрузки. После того, как управление компьютером было передано из BIOS в код начальной загрузки в MBR и из MBR в код начальной загрузки в загрузочном секторе раздела, а оттуда - в исполняемые загрузочные файлы активного раздела, начинается фактический процесс запуска операционной системы.

Файлы конфигурации загрузки

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

Популярные загрузчики

Существует много разных загрузчиков. Каждая операционная система имеет свой собственный загрузчик, специально предназначенный для чтения своей файловой системы и поиска ядра, которое необходимо загрузить для запуска ОС. Вот некоторые из наиболее популярных загрузчиков - и их основные файлы конфигурации - для некоторых распространенных операционных систем:

NTLDR

NTLDR - это старый загрузчик Windows, впервые использованный в Windows NT (отсюда и NT в NTLDR, сокращенно NT Loader), и в настоящее время используемый в Windows NT, Windows 2000, Windows XP и Windows Server 2003. NTLDR сохраняет свою загрузочную конфигурацию в простом текстовом файле с именем BOOT.INI, который хранится в корневом каталоге активного раздела (часто это C: \ Boot.ini). Как только NTLDR загружается и выполняется загрузчиком второго уровня, он запускает вспомогательную программу NTDETECT.COM, которая идентифицирует оборудование и генерирует индекс информации о системе.

BOOTMGR

BOOTMGR - это более новая версия загрузчика, используемая Microsoft Windows, и она впервые была представлена ​​в бета-версиях Windows Vista. В настоящее время он используется в Windows Vista, Windows 7, Windows 8, Windows 8.1 и Windows 10, а также в Windows Server 2008 и Windows Server 2012/2016. BOOTMGR ознаменовал значительный отход от NTLDR. Это автономный загрузчик с большим количеством опций, специально разработанный для совместимости с новыми функциями в современных операционных системах и разработанный с учетом EFI и GPT (хотя только определенные версии BOOTMGR поддерживают загрузку Windows с GPT-диска или в UEFI / EFI конфигурации). В отличие от NTLDR, BOOTMGR сохраняет свою конфигурацию в файле, называемом BCD - сокращение от Boot Configuration Database. В отличие от BOOT.INI, файл BCD является двоичной базой данных, которую нельзя открыть и отредактировать вручную. (На самом деле BCD-файл является стандартным кустом реестра Windows, и его можно монтировать для редактирования с помощью таких инструментов, как regedit.exe). Вместо этого специально разработанные инструменты командной строки, такие как bcdedit.exe и более удобные утилиты для графического интерфейса пользователя. такие как EasyBCD могут использоваться для чтения и изменения списка операционных систем.

GRUB

GRUB был преимущественно используемым загрузчиком для Linux в девяностых и начале двухтысячных. Он предназначен для загрузки не только Linux, но и любой операционной системы, реализующей спецификацию открытой мультизагрузки для своего ядра. Файл конфигурации GRUB, содержащий список операционных систем в формате пробелов, часто назывался menu.lst или grub.lst и находится в каталоге / boot или / boot / grub. Поскольку эти значения можно изменить путем перекомпиляции GRUB с разными параметрами, в разных дистрибутивах Linux этот файл находится под разными именами в разных каталогах.

GRUB 2

Хотя в конечном итоге GRUB одержал победу над Lilo и eLilo, в 2002 году его заменили на GRUB 2, а старый GRUB был официально переименован в Legacy GRUB. Забавно, но теперь GRUB 2 официально называется GRUB, а старый GRUB официально переведен в название Legacy GRUB, но вы, к счастью, найдете в Интернете большинство ресурсов, ссылающихся на более новое воплощение загрузчика GRUB под названием GRUB 2. GRUB 2 - это мощный модульный загрузчик, больше похожий на операционную систему, чем загрузчик. Он может загружать десятки различных операционных систем и поддерживает настраиваемые плагины (модули) для расширения функциональности и поддержки сложных процедур загрузки. Фактический файл загрузчика для GRUB 2 - это не файл с именем GRUB2, а файл, обычно называемый core.img. В отличие от Legacy GRUB, файл конфигурации GRUB 2 является скорее скриптом, а не традиционным файлом конфигурации. Файл grub.cfg, обычно расположенный в /boot/grub/grub.cfg в загрузочном разделе, имеет сходство со сценариями оболочки и поддерживает расширенные понятия, такие как функции. Основная функциональность дополняется модулями, которые обычно находятся в подкаталоге каталога / boot / grub.

Процесс загрузки

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

Последовательность процесса загрузки

  1. Инициирование доступа к файловой системе
    При запуске загрузчика он должен загрузить и запустить примитивные драйверы файловой системы, которые дают ему возможность читать, по крайней мере, файловую систему, в которой он находится. Поскольку он не может прочитать файловую систему до этого, код, обеспечивающий эту функцию, должен быть скомпилирован в сам файл загрузчика ядра.
  2. Загрузка и чтение файла(ов) конфигурации
    При поддержке загруженной файловой системы загрузчик теперь может читать список операционных систем с диска, когда указано несколько операционных систем, подготавливая ОС к отображению.
  3. Загрузка и запуск вспомогательных модулей
    Для загрузчиков, которые не являются полностью автономными (например, NTLDR и GRUB 2), загрузчик загружает любые вспомогательные модули или вспомогательные программы (например, NTDETECT.COM) с диска. Список загружаемых модулей можно указать в файле конфигурации, который был только что прочитан или жестко запрограммирован / скомпилирован в самом загрузчике. Обычно каждый модуль будет выполняться так, как он расположен и загружен с диска.
  4. Отображение меню загрузки
    На этом этапе, имея под рукой все необходимые настройки, загрузчик может отобразить на экране то, что обычно называется меню загрузки. Если установлено несколько операционных систем, то с помощью меню загрузки пользователь компьютера может перемещаться по списку операционных систем и выбирать, какие из них загружать. Отсюда некоторые загрузчики также позволяют указывать параметры времени и выполнения, например, загружать ли выбранную операционную систему в безопасном режиме.
  5. Загрузка ядра ​​ОС
    После того, как выбор пользователя был записан, загрузчик переходит к последнему этапу процесса загрузки. В зависимости от ОС и типа ядра, загрузчик загрузит образ ядра из пути, указанного в файле конфигурации (с помощью любых подмодулей, если необходимо), в память. Затем он инструктирует процессор JMP в определенное место во вновь загруженном ядре и начинает выполнение оттуда.

Заключение

Вот такой непростой путь, который начинается нажатием кнопки и заканчивается загрузкой в ​​память ядра операционной системы и выполнением. Процесс начального загрузчика, безусловно, намного более детализирован и сложен, чем многие могут себе представить, и он был спроектирован и усовершенствован для работы достаточно стандартизированным образом на разных платформах и под различными операционными системами.

Отдельные компоненты загрузчика в целом самодостаточны. Их можно менять по отдельности, не затрагивая в целом. Вы можете добавлять диски и загружаться с разных устройств, не беспокоясь о нарушении существующих конфигураций и операционных систем. Это означает, что вместо того, чтобы иметь один-единственный бит аппаратного / программного обеспечения для настройки, обслуживания и отладки, вы получаете сложную и часто очень хрупкую цепочку с множеством точек, подверженных сбоям. При правильной работе процесс загрузки представляет собой хорошо отлаженную машину, но при возникновении ошибок, процесс может быть очень сложным для понимания и отладки.

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