Главная / Windows 7/8/10 / Процесс загрузки BIOS/MBR.

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

Независимо от компьютера или операционной системы, стандартные («IBM-совместимые») настольные ПК и ноутбуки включаются и запускаются одним из двух способов: традиционным методом BIOS-MBR и более новым методом UEFI-GPT, используемым последними версиями Windows, Linux и Mac OS X на более новых ПК, ноутбуках и планшетах. В этой статье кратко описывается процесс загрузки операционной системы традиционными компьютерами BIOS, а также рассматриваются основы и детали BIOS, MBR и загрузочного сектора.

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

На диаграмме ниже показана последовательность загрузки для всех стандартных компьютеров и операционных систем:

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

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

BIOS

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 и AddOn ROM BIOS загружает первые 512 байт с жёсткого диска выбранного загрузочного устройства – эти 512 байт являются так называемыми MBR или главной загрузочной записью.

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

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

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

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

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

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

Во-вторых, MBR также содержит очень важный фрагмент кода, известный как «код начальной загрузки». Первые 4403 из этих 512 байтов могут содержать буквально всё, что угодно – BIOS загрузит его и выполнит его содержимое как есть, начиная процедуру начальной загрузки, 440 байт невероятно мало. Для сравнения: 440 байт – это всего лишь 0,3% от ёмкости старого гибкого диска объемом 1,44 МБ – едва достаточного для размещения любой формы полезного кода – и слишком маленького, чтобы сделать что-то столь сложное, как вызов ядра операционной системы с диска.

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

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

Boot Signature

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

Загрузочный сектор раздела

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

Опять же, в зависимости от операционной системы и файловой системы, точное расположение раздела, безусловно, будет отличаться. Но это представляет собой близкое приближение к тому, что вы обычно видите:

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

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

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

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

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

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

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

Этот значительно более сложный код начальной загрузки должен фактически прочитать оглавление для файловой системы в разделе 7. Загрузчик второго уровня в более старых версиях файловых систем часто накладывал сложные ограничения на файлы загрузчика, которые они должны были загрузить, такие как требование их появления в первых нескольких килобайтах раздела или невозможность загрузки не смежно распределённых файлов в раздел. Этот файл является последним фрагментом головоломки загрузчика, и обычно нет никаких ограничений относительно его размера или содержимого, то есть он может быть настолько большим и сложным, насколько это необходимо для загрузки ядра операционной системы с диска и передачи управления ПК с ОС.

Загрузчик

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

После того, как управление ПК было передано из BIOS в код начальной загрузки в MBR и из MBR в код начальной загрузки в загрузочном секторе раздела, а оттуда – в исполняемые загрузочные файлы активного раздела, действительная логика участвует в определении операционной системы для её загрузки, откуда её загружать, какие параметры/опции передавать ей, и завершает любые взаимодействия с пользователем, которые могут быть доступны, после этого начинается фактический процесс запуска операционной системы.

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

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

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

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

NTLDR BOOTMGR GRUB

Каждая из популярных операционных систем имеет свой собственный загрузчик по умолчанию. В Windows Vista был представлен загрузчик BOOTMGR, который в настоящее время используется в Windows 7 и Windows 10, а также в Windows Server 2008 и 2012. Хотя в течение ряда лет для Linux существовало несколько различных загрузчиков, двумя основными загрузчиками были Lilo и GRUB, но теперь большинство дистрибутивов Linux объединились вокруг мощного загрузчика GRUB2.

NTLDR

NTLDR – это старый загрузчик Windows, впервые использованный в Windows NT (отсюда и «NT» в «NTLDR», сокращенно «NT Loader»).

NTLDR хранит свою загрузочную конфигурацию в простом текстовом файле с именем BOOT.INI, который хранится в корневом каталоге активного раздела (часто C:\boot.ini). Как только NTLDR загружается и запускается загрузчиком второго уровня, он выполняет вспомогательную программу NTDETECT.COM, которая идентифицирует оборудование и генерирует индекс информации о системе.

BOOTMGR

BOOTMGR – это более новая версия загрузчика, используемая Microsoft Windows, и она впервые была представлена ​​в бета-версиях Windows Vista (кодовое имя Windows Longhorn). В настоящее время он используется в Windows 7 и Windows 10, а также в Windows Server 2008 и Windows Server 2012.

BOOTMGR ознаменовал значительный отход от NTLDR. Это автономный загрузчик с множеством дополнительных возможностей, специально разработанный для совместимости с новыми функциями в современных операционных системах и разработанный с учетом EFI и GPT (хотя только определенные версии BOOTMGR поддерживают загрузку Windows с GPT-диска или в UEFI/EFI конфигурацию). В отличие от NTLDR, BOOTMGR хранит свою конфигурацию в файле, называемом BCD – сокращение от Boot Configuration Database. В отличие от BOOT.INI, BCD-файл представляет собой двоичную базу данных, которую нельзя открыть и отредактировать вручную. Вместо этого его можно открыть для чтения и изменить список операционных систем.

GRUB

GRUB был преимущественно используемым загрузчиком для Linux в 1990-х и начале 2000-х годов, предназначенным для загрузки не только 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 в загрузочном разделе, имеет сходство со сценариями оболочки и поддерживает расширенные понятия, такие как функции. Основные функции GRUB 2 дополнены модулями, которые обычно находятся в подкаталоге каталога / boot / grub /.

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

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

Инициировать доступ к файловой системе

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

С поддержкой загруженной файловой системы загрузчик теперь может читать список операционных систем с диска и, если указано несколько операционных систем, подготовить её к отображению.

Загрузка и запуск поддерживающих модулей

Для загрузчиков, которые не являются полностью автономными (например, NTLDR и GRUB 2), загрузчик теперь загружает с диска все поддерживающие модули или вспомогательные программы (например, NTDETECT.COM). Список загружаемых модулей можно указать в файле конфигурации, который был только что прочитан или жёстко запрограммирован/скомпилирован в самом загрузчике. Обычно каждый модуль будет выполняться так, как он расположен и загружен с диска.

Показать меню загрузки

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

Загрузка ядра ​​ОС

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

Вывод

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

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



Оставьте комментарий

Ваш email не будет опубликован. Обязательные поля помечены *

*