Книга: Восстановление данных. Практическое руководство
Главная загрузочная запись
Разделы на этой странице:
Главная загрузочная запись
Первые жесткие диски имели небольшой размер и форматировались практически так же, как и дискеты. Однако их объемы стремительно росли, и MS- DOS была уже не в состоянии полностью их адресовать. Для преодоления этого ограничения был введен механизм разделов (partitions), позволяющий разбивать один физический диск на несколько логических. Каждый из логических дисков имеет собственную файловую систему и форматируется независимо от других. За счет чего это достигается?
В первом секторе физического диска (цилиндр 0/головка 0/сектор 1) хранится специальная структура данных — главная загрузочная запись (Master Boot Record, MBR). Она состоит из двух основных частей — первичного загрузчика (master boot code) и таблицы разделов (partition table), описывающей схему разбиения и геометрию каждого из логических дисков. Схематичное изображение жесткого диска, разбитого на разделы, представлено на рис. 5.1. В конце сектора по смещению 1FE
находится сигнатура 55h AAh
, по которой BIOS определяет признак "загрузочности" сектора. Даже если вы не хотите дробить свой винчестер на части и форматируете его как один диск, присутствие MBR обязательно.
Рис. 5.1. Схематичное представление жесткого диска, разбитого на разделы
При старте компьютера BIOS выбирает загрузочный диск. Как правило, это Primary Master, но порядок загрузки в большинстве современных реализаций BIOS можно изменять. Наиболее продвинутые реализации даже выводят интерактивное меню при нажатии и удержании клавиши <ESC> во время прохождения процесса первоначального тестирования при включении (Power- On Self-Test, POST). Затем BIOS считывает первый сектор (цилиндр 0/головка 0/сектор 1) в память по адресу 0000h:7C00h
, проверяет наличие сигнатуры 55h AAh
в его конце, и, если такая сигнатура действительно обнаруживается, передает управление по адресу 0000h:7C00h
. В противном случае анализируется следующее загрузочное устройство, а в случае его отсутствия выдается сообщение об ошибке.
Первичный загрузчик, получив управление, сканирует уже загруженную в память таблицу разделов, находит активный раздел (Boot indicator == 80h
), извлекает номер стартового сектора раздела, так же называемого загрузочным сектором (boot-sector). Затем загрузчик перемещает свое тело по другому адресу, чтобы избежать затирания, загружает boot-сектор в память по адресу 0000h:7C00h
, убеждается в наличии сигнатуры 55h AAh
и передает управление на 0000h:7C00h
, в противном случае выдается сообщение об ошибке, и после нажатия на любую клавишу компьютер перезагружается. Ряд нестандартных загрузчиков, выходящих за стандартные спецификации Microsoft, поддерживают несколько активных разделов, последовательно перебирая их один за другим.
Если первичный загрузчик поврежден, то BIOS не сможет запустить операционную систему с такого диска, однако при подключении его "вторым" (или при загрузке с дискеты) все логические диски будут доступны. Как минимум, они должны быть "видимы", то есть команды C:
, D:
, E:
должны выполняться нормально, хотя работоспособность команды dir
уже не гарантируется. Для того чтобы это было именно так, необходимо соблюдение следующих двух условий:
1. Во-первых, файловая система соответствующего раздела должна быть известна загруженной операционной системе и не повреждена.
2. Во-вторых, загрузочный сектор должен быть в целости и сохранности (данный вопрос будет обсуждаться далее в этой главе).
Таблица разделов, которую анализирует первичный загрузчик (master boot code), а чуть позже — драйвер логических дисков операционной системы, состоит из четырех записей размером по 10h
каждая, расположенных по смещениям 1BEh
, 1CEh
, 1DEh
, и 1EEh
байт от начала диска соответственно. Каждая из них описывает свой логический раздел, задавая его стартовый и конечный сектора, записанные в формате CHS.
Внимание!
Даже если диск работает в режиме LBA, разделы все равно адресуются через CHS!
Поле относительного смещения раздела, отсчитываемое от начала таблицы разделов, является вспомогательным, и его избыточность очевидна. То же самое относится и полю, содержащему значение общего количества секторов на диске, так как очевидно, что это значение может быть вычислено на основе стартового и конечного секторов. Одни операционные системы и загрузчики игнорируют вспомогательные поля, другие же их активно используют. Именно поэтому содержимое этих полей должно соответствовать действительности.
Поле идентификатора диска содержит уникальную 32-разрядную последовательность, помогающую операционной системе отличить один смонтированный диск от другого, и автоматически копируемую в следующий ключ реестра: HKLMSYSTEMMountedDevices
. На самом деле Windows свободно обходится и без него, поэтому содержимое данного поля некритично.
Поле Boot ID содержит идентификатор файловой системы, установленной на разделе. В случае NTFS этот идентификатор равен 07h
. За динамическими дисками, согласно фирменной спецификации, закреплен идентификатор 42h
.
На практике это справедливо лишь для тех из них, которые были получены путем обновления (update) обычного (basic) раздела до динамического (dynamic) тома. Сведения об остальных динамических дисках в таблице разделов не хранятся, а содержатся в последнем мегабайте физического диска в базе данных менеджера логических дисков (Logical Disk Manager, LDM). Для стандартных дисковых менеджеров эта информация недоступна. При установке операционной системы семейства Windows 9x или одного из клонов UNIX на винчестер, содержащий динамические диски, они могут быть необратимо утеряны, так как, согласно таблице разделов, занятое ими пространство помечено как свободное. Тем не менее, загрузочный логический диск (независимо от того, динамический он или нет) в обязательном порядке должен присутствовать в таблице разделов, иначе BIOS не сможет его загрузить.
Четыре записи таблицы разделов позволяют иметь всего четыре логических диска (см. рис. 5.1). Этого явно недостаточно, но расширение таблицы разделов оказалось невозможным, так как последняя запись упирается в конец сектора. Разработчики сочли нежелательным использовать следующий сектор, поскольку он активно используется многими вирусами и нестандартными драйверами. К тому же, это все равно не позволяет решить проблему радикально, а лишь оттягивает неизбежный конец. Тогда инженеры нашли другое решение, предложив концепцию расширенных разделов (Extended partition). Если значение индикатора загрузки (boot ID
) некоторого раздела равно 05h
или 0Fh
, то такой раздел трактуется как "виртуальный физический диск", с собственной таблицей разделов, расположенной в его начале, на которую и указывает стартовый сектор расширенного раздела (рис. 5.2). Иначе говоря, таблица разделов получается вложенной, и уровень вложения ограничен разве что свободным дисковым пространством и объемом стековой памяти загрузчика (при условии, что он использует рекурсивный алгоритм сканирования). Таким образом, таблица разделов как бы "размазывается" вдоль винчестера (рис. 5.3). Большинство утилит резервирования сохраняют лишь первый сектор, чего явно недостаточно (впрочем, первый сектор гибнет намного чаще других, так что даже плохая политика резервирования лучше, чем совсем ничего).
Рис. 5.2. Структурная схема типичного жесткого диска, содержащая главные (primary) и расширенные (extended) разделы
Рис. 5.3. Расширенная таблица разделов
Штатные утилиты для разбиения диска на разделы (FDISK.EXE, Disk Manager) при создании логических дисков на расширенном разделе создают расширенную таблицу разделов с четырьмя записями: одна используется для описания логического раздела, вторая описывает еще один (следующий) логический раздел, а две не используются. Таким образом, получается "цепочка" таблиц разделов, в которой первая таблица разделов описывает от одного до трех основных (primary) разделов, а каждая следующая — соответствующий ей логический диск и положение следующей таблицы разделов (рис. 5.3).
Таким образом, при разбиении винчестера на четыре логических диска на нем образуются четыре таблицы разделов (см. листинг 5.4), хотя в данном случае можно было бы обойтись и одной. Штатный загрузчик требует, чтобы активный раздел описывался первой записью первой таблицы разделов, вследствие чего операционная система может грузиться только с диска С:. Нестандартные менеджеры загрузки, анализирующие всю цепочку разделов, позволяют загружаться с любого из разделов. Самые честные из них создают в первой таблице разделов еще один раздел (благо, если диск был разбит с помощью программы FDISK, то свободное место там всегда есть), назначают его активным и помещают в него свое тело. Другие же внедряются непосредственно в MBR и замещают собой первичный загрузчик, что создает очевидные проблемы совместимости.
Листинг 5.4. Пример таблицы разделов, сформированной программой FDISK
Sector Inspector Copyright Microsoft Corporation 2003
==================================================================
Target - .PHYSICALDRIVE0
1867 Cylinders
255 Heads
63 Sectors Per Track
512 BytesPerSector
12 MediaType
LBN 0 [С 0, H 0, S 1]
==================================================================
Master Boot Record
==================================================================
| B | FS TYPE | START | END | | |
| F | (hex) | C H S| C H S| RELATIVE | TOTAL |
==================================================================
| * | 07 | 0 1 1| 764 254 63| 63| 12289662|
| | 0f | 765 0 1|1023 254 63| 12289725| 17687565|
| | 00 | 0 0 0| 0 0 0| 0| 0|
| | 00 | 0 0 0| 0 0 0| 0| 0|
==================================================================
LBN 12289725 [C 765, H 0, S 1]
==================================================================
Extended Boot Record
==================================================================
| B | FS TYPE | START | END | | |
| F | (hex) | C H S| C H S| RELATIVE | TOTAL |
==================================================================
| | 07 | 765 1 1|1023 254 63| 63| 8193087|
| | 05 |1023 0 1|1023 254 63| 8193150| 4096575|
| | 00 | 0 0 0| 0 0 0| 0| 0|
| | 00 | 0 0 0| 0 0 0| 0| 0|
==================================================================
LBN 20482875 [C 1275, H 0, S 1]
==================================================================
Extended Boot Record
==================================================================
| B | FS TYPE | START | END | | |
| F | (hex) | C H S| C H S| RELATIVE | TOTAL |
==================================================================
| | 07 |1023 1 1|1023 254 63| 63| 4096512|
| | 05 |1023 0 1|1023 254 63| 12289725| 5397840|
| | 00 | 0 0 0| 0 0 0| 0| 0|
| | 00 | 0 0 0| 0 0 0| 0| 0|
==================================================================
LBN 24579450 [С 1530, H 0, S 1]
==================================================================
Extended Boot Record
==================================================================
| B | FS TYPE | START | END | | |
| F | (hex) | C H S| C H S| RELATIVE | TOTAL |
==================================================================
| | 07 |1023 1 1|1023 254 63| 63| 5397777|
| | 00 | 0 0 0| 0 0 0| 0| 0|
| | 00 | 0 0 0| 0 0 0| 0| 0|
| | 00 | 0 0 0| 0 0 0| 0| 0|
==================================================================
Если таблица разделов повреждена, логические диски, скорее всего, будут полностью недоступны — они не будут отображаться ни Проводником Windows (Windows Explorer), ни файловым менеджером FAR, а команда C:
вызовет ошибку. Искажение таблицы разделов не приводит к немедленному изменению объема уже отформатированных томов, так как эта информация хранится в загрузочном секторе (boot sector). Однако при последующим переформатировании произойдет затирание данных из соседнего раздела, или же текущий раздел окажется усеченным. Кстати говоря, если расширенный раздел указывает сам на себя или на один из предшествующих разделов в цепочке, то все известные мне операционные системы наглухо зависнут еще на этапе загрузки, даже если диск подключен "вторым". Чтобы исправить ситуацию, необходимо запустить редактор диска или другую утилиту, а для этого необходимо загрузить операционную систему! Существует несколько путей выхода из этой, казалось бы, неразрешимой ситуации. Самый простой вариант — горячее подключение диска "на лету" с последующей работой с ним через BIOS или порты ввода/вывода. Если и диск, и материнская плата переживут это (а для устройств IDE подключение "на лету" представляется довольно жестким испытанием), то вы сможете запустить доктора и работать с диском на физическом уровне. Другой, чисто хакерский, путь — пропатчить MS-DOS, изменив сигнатуру 55h AAh
на какое-нибудь другое значение, тогда она не сможет распознать таблицу разделов и, соответственно, не станет ее анализировать. Как вариант, можно записать в boot-сектор дискеты специально подготовленную программу, которая обнуляет MBR или искажает сигнатуру, расположенную в его конце. Просто загрузитесь с нее и все!
Воспользовавшись любым редактором диска (например, Microsoft Disk Probe из комплекта Resource Kit), считаем первый сектор физического диска. Он должен выглядеть приблизительно так, как показано на рис. 5.4.
Рис. 5.4. Внешний вид MBR
Не правда ли, MBR выглядит как знаменитая Матрица? Ее формат кратко описан в таблице 5.1.
Таблица 5.1. Формат MBR
Смещение | Размер | Описание |
---|---|---|
0x000 |
перемен. | Код загрузчика |
0x1BB |
4h |
Идентификатор диска |
0x1BE |
10h |
Partition 1 |
0x1CE |
10h |
Partition 2 |
0x1DE |
10h |
Partition 3 |
0x1EE |
10h |
Partition 4 |
0x1FE |
0x2 |
"Магическое число" — сигнатура 55h AAh , которое указывает, что данный сектор представляет собой MBR |
Первые 1BBh
байт занимают код и данные загрузчика, среди которых отчетливо выделяются текстовые строки.
Примечание
Кстати говоря, локализовав сообщения загрузчика в национальных версиях Windows, например, в русской, Microsoft допустила грубейшую стратегическую ошибку. Ведь в BIOS нет никаких кириллических шрифтов, поэтому русские символы выглядят бессмысленной абракадаброй.
По смещению 1BBh
расположен четырехбайтовый идентификатор диска, принудительно назначаемый Windows при запуске Disk Manager. Коварство Microsoft не знает границ! Еще со времен первых IBM PC (тогда они назывались XT) загрузчик владел первыми 1BEh
байтами MBR, и достаточно многие загрузчики (и вирусы!) использовали эти байты на полную катушку. Нетрудно сообразить, что произойдет, если внутрь загрузчика вдруг запишется идентификатор. Это убьет его! Поэтому байты 1BBh
–1BEh
лучше не трогать.
Со смещения 1BEh
начинается таблица разделов, представляющая собой массив из четырех записей типа partition
. Каждая из этих записей описывает свой логический диск, что позволяет нам создавать до четырех разделов на каждом HDD. Формат записи таблицы разделов представлен в табл. 5.2. Динамические диски, впервые появившиеся в Windows 2000, хранятся в базе данных Менеджера Логических Дисков (Logical Disk Manager Database), и в таблице разделов присутствовать не обязаны.
Таблица 5.2. Формат записи таблицы разделов
Смещение | Размер | Описание | ||||
---|---|---|---|---|---|---|
000 |
1ВЕ |
1CE |
1DE |
1EE |
byte |
Флаг активного загрузочного раздела (Boot Indicator). 80h — загрузочный раздел, 00h — незагрузочный раздел |
001 |
1BF |
1CF |
1DF |
1EF |
Стартовая головка раздела | |
002 |
1C0 |
1D0 |
1E0 |
1F0 |
byte |
Стартовый сектор раздела (биты 0–5). Старшие биты стартового цилиндра (биты 6–7) |
003 |
1C1 |
1D1 |
1E1 |
1F1 |
byte |
Младшие биты стартового цилиндра (биты 0–7) |
004 |
1C2 |
1D2 |
1E2 |
1F2 |
byte |
Идентификатор системы (Boot ID), см. табл. 5.3 |
005 |
1C3 |
1D3 |
1E3 |
1F3 |
byte |
Конечная головка раздела |
006 |
1С4 |
1D4 |
1E4 |
1F4 |
byte |
Конечный сектор раздела (биты 0–5). Старшие биты конечного цилиндра (биты 6–7) |
007 |
1C5 |
1D5 |
1E5 |
1F5 |
Младшие биты конечного цилиндра (биты 0–7) | |
008 |
1C6 |
1D6 |
1E6 |
1F6 |
dword |
Смещение раздела относительно начала таблицы разделов в секторах |
00C |
1CA |
1DA |
1EA |
1FA |
dword |
Количество секторов раздела |
Таблица 5.3. Возможные значения Boot ID
Boot ID | Тип раздела |
---|---|
00h |
Раздел свободен |
0x01 |
Раздел FAT12 (менее чем 32 680 секторов в томе или 16 Мбайт) |
0x04 |
Раздел FAT16 (32 680–65 535 секторов или 16–33 Мбайт) |
0x05 |
Расширенный раздел (extended partition) |
0x06 |
Раздел BIGDOS FAT16 (33 Мбайт–4 Гбайт) |
0x07 |
Раздел NTFS |
0x0B |
Раздел FAT32 |
0x0C |
Раздел FAT32 с поддержкой расширенной BIOS INT 13h |
0x0E |
Раздел BIGDOS FAT16 с поддержкой расширенной BIOS INT 13h |
0x0F |
Расширенный раздел с поддержкой расширенной BIOS INT 13h |
0x12 |
Раздел EISA |
0x42 |
Динамический диск |
0x86 |
Раздел legacy FT FAT16 |
0x87 |
Раздел legacy FT NTFS |
0x8B |
Наследуемый отказоустойчивый том, отформатированный для FAT32 (Legacy FT volume formatted with FAT32) |
0x8C |
Наследуемый отказоустойчивый том с поддержкой BIOS INT 13h , отформатированный для FAT32 (Legacy FT volume using BIOS INT 13h extensions formatted with FAT32) |
- Главная загрузочная запись и таблица разделов
- 4.4.3. Чтение и запись
- 1.18. Запись телефонных звонков
- Как сделать перезапись файлов в Проводнике более удобной?
- Не могу войти в систему под учетной записью администратора, поскольку среди имен пользователей, отображаемых на экране п...
- При попытке войти в систему Пользователю1 выдается предупреждение, что загрузился временный профиль и все сделанные изме...
- 19.2.4. Чтение и запись значений элементов HTML-форм
- 19.2.5. Чтение и запись содержимого элемента
- 1.2. Запись образа операционной системы на флэшку
- Запись звукового компакт-диска
- 19.2.1. Чтение и запись значений HTML-атрибутов
- 3.4 ЧТЕНИЕ И ЗАПИСЬ ДИСКОВЫХ БЛОКОВ