Что это такое главная загрузочная запись или всё о MBR!

Автор Ruterk, 10 апреля 2011, 21:24:48

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

Ruterk

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

Первое понятие - собственно Master Boot Record. Это запись (программный код и данные), которая загружается в память с винчестера и обеспечивает опознание логических разделов на нем, определяет активный раздел и загружает из него загрузочную запись (Boot Record - BR), которая продолжит запуск операционной системы (ОС).

И второе понятие - Загрузочный Сектор, Master Boot Sector (MBS) - это сектор, располагающийся на цилиндре 0, плоскости (головка) 0 и имеющий номер 1.

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

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

Вообще MBR появился на жестких дисках начиная с MS DOS версии 3.0, в более ранних версиях жёсткий диск форматировался как дискета, и в первом секторе располагался BR.

Соответственно диск представлял из себя один раздел и не мог быть разбит на логические части - правда, при тех размерах дисков, которые тогда выпускались, это было неактуально.
Размер сектора на жестком диске - 512 байт. Этого пространства вполне хватает для размещения там всего необходимого - и кода, и данных. Однако только одна структура должна там присутствовать обязательно - это сигнатура. Этим словом называется специальная, строго установленная, последовательность из 2 байт с шестнадцатеричными значениями 55h AAh, которая записывается в последние 2 байта сектора и соответственно имеет смещение от начала сектора 1FEh. Если хотя бы один из двух последних байтов отличается по значению, считается, что первый сектор не является MBR и не содержит осмысленной информации. Если компьютер при старте, прочитав первый сектор, не обнаружит правильной сигнатуры, он не будет передавать управление располагающемуся там коду, даже если он правильный, а выдаст сообщение о том, что главная загрузочная запись не найдена. Или будет пробовать найти её на других устройствах - например, на дискете. Слегка отклоняясь от темы, замечу, что BR также содержит сигнатуру 55h AAh в последних двух байтах.

Ну уж коли начали с хвоста, то пойдём от него к началу сектора. Перед сигнатурой, вплотную к ней, расположены 4 блока данных по 16 байтов каждый (соответственно со смещением от начала сектора 1BEh, 1CEh, 1DEh, 1EEh). Совокупность этих блоков называется Таблица Разделов, Partition Table (PT), а каждая отдельная запись - элементом таблицы разделов (Partition Table Entry) или просто разделом (Partition).

Этих 16 байтов вполне достаточно, чтобы указать все необходимые характеристики раздела, а именно: тип раздела, признак активности раздела, начальный и конечный сектора раздела в формате Цилиндр (дорожка) - Головка (сторона) - Сектор (Cylinder - Head - Sector, CHS), относительный номер первого сектора (относительно MBR) и количество секторов в разделе.
Всё остальное пространство сектора занято программным кодом, который обеспечивает разбор PT, поиск активного раздела, загрузку в память BR этого раздела и передачу ему управления. Как легко подсчитать, на код остаётся 512 - 4 * 16 - 2 = 446 байт. Этого пространства с избытком хватает для выполнения указанных действий.

Итак, общая структура MBR может быть представлена следующей таблицей:


Каждый 16-байтный блок, описывающий один раздел, имеет следующую структуру:


Код типа раздела представляет собой однобайтовый идентификатор. Если его значение - 00h, то считается, что в данном элементе PT не содержатся данные о разделе, и его содержимое игнорируется. Любое ненулевое значение означает, что в указанном пространстве находится раздел определённого типа. Некоторые значения однозначно указывают тип раздела, некоторым соответствуют несколько возможных типов, и определение конкретного типа возлагается на операционную систему, остальные зарезервированы для будущего использования.

Сравнительно полный и актуальный справочник по кодам типов разделов можно найти в Ralf Brown Interrupt List в файле INTERRUPT.D, таблица 00652, который содержится в архиве (на момент написания статьи) inter61a.zip по адресу http://www.cs.cmu.edu/afs/cs/user/ralf/pub/WWW/files.html.

Здесь же я приведу таблицу тех типов разделов, которые создаются операционными системами Windows 9x и Windows NT/2000/XP:


Признак активности раздела - т.е. признак того, что операционную систему следует загружать именно из этого раздела - может иметь значения 80h (раздел активен) и 00h (раздел не активен). В общем случае количество активных разделов должно быть не более 1 (иначе как сделать выбор?). Если активных разделов нет - значит с этого жёсткого диска ОС не может быть загружена. Другие значения считаются ошибочными и игнорируются. Впрочем, решение о передаче управления принимает код загрузчика, поэтому значение байта признака загрузочности - аксиома только для стандартных загрузчиков.

Трёхбайтный блок адреса начала и адреса конца раздела имеют идентичный формат. Здесь фактически используется упаковка значений с тем, чтобы они имели минимальный объём. Формат упаковки полностью соответствует тому, как эти данные передаются процедурам работы с жёстким диском (Int 13h), находящимся в BIOS компьютера, поэтому и накладные вычислительные расходы получаются минимальными. При этом цилиндры и дорожки нумеруются, начиная с нулевого значения, а сектора - почему-то с первого. Уж и не знаю почему - так сложилось исторически.

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

Смещение первого сектора раздела - это фактически номер этого сектора если все сектора жёсткого диска перенумеровать начиная с 0 (в соответствии с нумерацией, применяемой Int 25h/26h) в порядке возрастания сперва по секторам одной дорожки, далее в порядке увеличения номеров головок и, наконец, цилиндров. А что такое количество секторов в разделе - понятно без объяснений.

Естественно, что все эти значения связаны простыми зависимостями, ведь содержащаяся в них информация избыточна. Потому приведу формулы зависимости между ними. Итак, если обозначить:

CM - цилиндр, на котором располагается MBR;
HM - дорожка, на которой располагается MBR;
SM - сектор, в котором располагается MBR;
CS, HS, SS, CE, HE, SE - то же, для секторов начала (S) и конца (E) раздела;
HH - количество дорожек у жёсткого диска;
SH - количество секторов на одной дорожке у жёсткого диска,

то:

Абсолютный номер сектора, в котором находится PT:
NumPT = CM * HH * SH + HM * SH + SM -1

Абсолютный номер сектора начала раздела:
NumS = CS * HH * SH + HS * SH + SS -1

Абсолютный номер сектора конца раздела:
NumE = CE * HH * EH + HE * EH + EE -1

Смещение первого сектора раздела:
OffsetS = NumS – NumPT

Количество секторов раздела:
Amount = NumE - NumS +1


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

Для IDE-накопителей существуют несколько режимов трансляции:

CHS (Cylinder-Head-Sector) - при этом геометрия диска считается такой, какой он её сообщает компьютеру. Не обольщайтесь - у большинства накопителей реальная геометрия совсем не такая. Однако контроллер, входящий в состав жёсткого диска, производит необходимые преобразования самостоятельно, и то, как он это делает, для нас несущественно. При этом максимальное количество цилиндров - 1024 (от 0 до 1023), дорожек - 16 (от 0 до 15), секторов - 63 (от 1 до 63), а максимальный объём диска, доступный в данной трансляции без применения специальных программ - 504 Мбайт. При дисковых операциях адрес сектора передается BIOS компьютера контроллеру жёсткого диска без изменения.

LBA (Logical Block Addressing) - при этом режиме трансляции используется не та геометрия диска, которую он сообщает BIOS компьютера. Производится приведение к формату, когда количество цилиндров не превышает 1024, а количество секторов на дорожку равно 63. Приведённое количество дорожек при этом зависит от BIOS компьютера и объёма жёсткого диска и может быть равно 16, 64 , 128 или 255, последние версии BIOS как правило используют приведение к 255 (0-254) дорожкам независимо от объёма накопителя. При обращении к диску переданные в LBA-трансляции номер цилиндра, головки и сектора пересчитываются в абсолютный номер сектора, и именно он передаётся BIOS компьютера контроллеру жёсткого диска для выполнения операции. При объёме накопителя свыше 8 Гбайт количество цилиндров получается более 1024, потому на компьютерах, которые не поддерживают работу расширенного режима Int 13h, без установки специального программного обеспечения пространство за границами 8 Гбайт недоступно (независимо от режима трансляции). Иногда, впрочем, помогает обновление BIOS компьютера.

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

Максимально доступный объём на компьютерах, которые не поддерживают работу расширенного режима Int 13h, зависит от реального количества дорожек, но не более 8 Гбайт (например, если диск имеет 16 дорожек, то в LARGE трансляции их может быть 16, 32, 48... 240, но не 255, т.к. 255 не кратно 16, а максимальный доступный объём - 1024 * 240 * 63 * 512 / (10243) = 7.38 Гб).
При использовании трансляции LBA или LARGE за счёт округления до целых значений несколько секторов в конце накопителя могут "выпасть" из описанного пространства и стать недоступными. Впрочем, потери обычно невелики.

Что же касательно SCSI-накопителей, то они всегда работают в режиме LBA-трансляции. Вернее, контроллер SCSI представляет геометрию накопителя в соответствии с требованиями LBA-трансляции, а сам при обращении к диску передаёт ему абсолютный адрес сектора. Естественно, что именно на BIOS SCSI-контроллера возлагается обязанность производить необходимые пересчёты.

Вернёмся к MBR. Как уже сказано, он содержит 4 блока данных об элементах таблицы разделов. Это означает, что максимальное количество разделов, которое может быть описано в MBR, равно четырём. Однако это отнюдь не означает, что максимальное число разделов, на которые может быть разделён накопитель, равно четырём. Для преодоления этого барьера был введён специальный тип раздела с кодом 05h - расширенный раздел (Extended Partition).

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

Во-вторых, в MBR должна присутствовать только одна запись о расширенном разделе. Вернее, их можно сделать и больше (хоть все четыре), но как поведёт себя ОС, встретив такое, предсказать трудно. Например MS-DOS 6.20 просто игнорирует все расширенные разделы, кроме первого в списке, как будто их вообще нет.

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

Если обычный раздел занимает не всё пространство, в таблице разделов появляется второй элемент, который описывает оставшееся пространство как Extended Partition. В следующем секторе точно также описывается один раздел и, если место осталось, еще запись об Extended Partition. И так продолжается до тех пор, пока пространство не закончится. Фактически все записи о расширенных разделах представляют собой связанную цепь (Extended Partition Chain), в которой от дискового пространства отщипываются кусочки на обычные разделы, пока место не кончится. Ошибка в любом элементе этой цепи приведёт к её рассыпанию, в результате все записи после разрыва не будут найдены ОС, а занимаемое ими пространство ОС будет считать незанятым.

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

Ruterk

Какие же проблемы могут возникнуть с содержимым MBR?

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

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

Самый лёгкий случай - это разрушение сигнатуры. При этом ОС считает, что в секторе содержится некая случайная информация, "мусор", а сам накопитель вообще не поделён на разделы и никакой информации на нём нет. Для восстановления достаточно всего лишь любым средством прямого доступа к секторам диска (наиболее популярен DISKEDIT из пакета NORTON UTILITIES) восстановить сигнатуру. Большинство ОС, правда, нужно перезагрузить, поскольку ОС как правило при старте считывают информацию о разбиении диска на разделы и далее в процессе работы её изменения не учитывают.

Более сложный случай - это разрушение кода. При этом теряется возможность произвести загрузку операционной системы с накопителя, а попытка загрузки как правило заканчивается "зависанием" компьютера. В то же время если загрузиться с другого накопителя (другой жесткий диск, дискета, загрузочный CD-ROM и т.п.), то вся информация на накопителе доступна для использования. В этом случае рекомендуется использовать штатные средства восстановления кода загрузчика, которые имеются в каждой ОС. Например, в ОС Windows 9x для этой цели используется программа FDISK.EXE, запускаемая с ключом /MBR.

Разрушение кода - не столь редкий случай, как может показаться. Как правило, подобная неприятность происходит, когда на один накопитель последовательно устанавливаются разные ОС в один или разные разделы. Любая ОС при установке желает иметь в MBR собственный код, но далеко не все заботятся о сохранении того кода, который был в секторе ранее. Например ОС Windows 9x переписывают код загрузчика, не ставя в известность пользователя и безвозвратно уничтожая старое содержимое. Впрочем, такой случай как раз не очень страшен, поскольку все загрузчики ОС очень похожи.

Проблема возникает, если для разбиения накопителя на разделы использовались программные средства третьих фирм, такие как EZ-drive, ODM или например SpeedStore, для которых как раз понятия MBR и MBS не эквивалентны. Из-за другой идеологии загрузки (которую мы рассмотрим позднее) код, находящийся в MBS, выполняет другую функцию, а именно поиск и загрузку части кода MBR, располагающейся в других секторах диска. Замена кода приводит к тому, что эта функция утрачивается, и соответственно возникают проблемы различного характера.

Пользователь должен быть весьма осторожен, если использует подобные программные средства - восстановление кода в таких случаях может оказаться весьма непростым делом.

И наиболее тяжёлый и неприятный случай - это разрушение самой таблица разделов. Впрочем, как известно, беда никогда не приходит одна, и чаще всего разрушаются все три компонента MBR, но именно разрушение PT приводит к наиболее тяжёлым последствиям, поскольку при этом теряется возможность доступа к хранящейся на накопителе информации. PT может быть разрушена полностью, а может и частично - т.е. часть элементов разрушена, а остальные целы. Бывают случаи, когда PT, находящаяся в MBR, цела, а разрушена запись о разделах в одном из звеньев цепи Extended Partition. Однако поскольку структура MBR и структура абсолютно идентичны (за исключением того что в элементах Extended Partition отсутствует код), методика восстановления в обоих случаях одна и та же.

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