Первые жесткие диски были небольшого (даже по тем временам) размера и форматировались практически так же, как и дискеты, однако их объемы стремительно росли и MS-DOS уже не могла их целиком адресовать. Для преодоления этого ограничения был введен механизм разделов (partitions), разбивающий один физический диск на несколько логических, каждый из который имел свою собственную файловую систему и форматировался независимо от других. За счет чего это достигается?
В первом секторе физического диска (цилиндр 0/головка 0/сектор 1) хранится специальная структура данных – maser boot record (главная загрузочная запись) или сокращенно MBR. Она состоит из двух основных частей – первичного загрузчика (master boot code) и таблицы разделов (partition table), описывающей схему разбиения и геометрию каждого из логических дисков. В конце сектора по смещению 1FE находится сигнатура 55h AAh, по которой BIOS определяет признак "загрузочности" сектора. Даже если вы не хотите дробить свой винчестер на части и форматируете его как один диск, присутствие maser boot record обязательно.
При старте компьютера, BIOS выбирает загрузочный винчестер (обычно Primary Master, но порядок загрузки в большинстве BIOS'ов можно изменять, а самые продвинутые из них при удержании ESC по время прохождения post'а (процесса начального тестирования оборудования) даже выводят интерактивное меню), считывает первый сектор (цилиндр 0/головка 0/сектор 1) в память по адресу 0000h:7C00h, проверяет наличие сигнатуры 55h AAh в его конце и если такая сигнатура действительно обнаруживается передает управление на 0000h:7C000h. В противном случае анализируется следующее загрузочное устройство, а если таковое отсутствует – выдается ругательное сообщение.
Первичный загрузчик, получив управление, сканирует partition table (которая уже загружена в память!), находит активный раздел (Boot Indicator === 80h), извлекает номер стартового сектора раздела, так же называемого boot-сектором, загружает его в память по адресу 0000h:7C00h (предварительно переместив свое тело в другое место, чтобы избежать затирания), убеждается в наличие сигнатуры 55h AAh, передавая управление по 0000h:7C00h, в противном случае выдается ругательное сообщение и после нажатия на клавишу компьютер перезагружается. Некоторые загрузчики поддерживают несколько активных разделов, последовательно перебирая их один за другим, но это уже отсебятина разработчиков, выходящих за стандартные спецификации Microsoft, что, впрочем, никого не смущает.
Если первичный загрузчик поврежден, то BIOS не сможет запустить операционную систему с такого диска, однако, при подключении его "вторым" (или загрузке с дискеты) все логические диски будут доступны. Как минимум они должны быть "видны", т. е. команды C:, D:, . E: выполняются нормально, правда работоспособность команды dir уже не гарантируется. Во-первых, для этого файловая система соответствующего раздела должна быть известна загруженной операционной системе и не повреждена, а, во-вторых, должен быть цел boot-сектор (но об этом позже).
Partition Table, которую анализирует master boot code, а чуть позже – драйвер логических дисков операционной системы, состоит из четырех 10h записей, расположенных по смещению 1BEh, 1CEh, 1DEh, 1EEh байт от начала диска соответственно. Каждая из них описывает свой логический раздел, задавая его стартовый и конечный сектора, записанные в CHS-формате (да! даже если диск работает в LBA-режиме, патриции все равно адресуются через CHS!). Поле относительное смещение раздела, отсчитываемое от начала таблицы разделов, является вспомогательным и его избыточность очевидна. Тоже самое относится и полю с общим количеством секторов на диске – как будто это нельзя вычислить на основе стартового и конечного секторов! Одни операционные системы и загрузчики игнорируют вспомогательные поля, другие же их активно используют, поэтому они должны соответствовать действительности.
Поле идентификатора диска содержит уникальную 32-разрядную последовательность, помогающую операционной системе отличить один смонтированный диск от другого и автоматически копирующую в следующий ключ реестра: HKLM\SYSTEM\MountedDevices. На самом деле, Windows свободно обходится и без него, поэтому содержимого этого поля некритично.
Поле Boot ID содержит идентификатор файловой системы, установленной на разделе, который в случае NTFS равен 07h. За динамическими дисками, согласно фирменной спецификации, закреплен идентификатор 42h. На самом деле, это справедливо лишь для тех из них, что получены путем обновления (update) обычного раздела до динамического. Сведения об остальных динамических дисках в таблице разделов не хранятся, а содержатся в последнем мегабайте физического диска в LDM-базе, и для стандартных дисковых менеджеров они не видны. При установке операционной системы семейства Windows 9х или UNIX на винчестер, содержащий динамические диски, они могут быть необратимо утеряны, поскольку согласно таблице разделов занятое ими пространство отмечено как свободное. Тем не менее, загрузочный логический диск (независимо от того динамический он или нет) в обязательном порядке должен присутствовать в partition table, иначе BIOS не сможет его загрузить.
Четырех записей partition table, обеспечивающих всего четыре логических диска, явно не хватало, но расширять таблицу разделов было уже некуда – последняя запись упиралась в конец сектора, а использовать следующий сектор разработчиком не хотелось, поскольку его активно использовали многие вирусы и нестандартные драйвера, к тому же это все равно не решало проблемы, а лишь оттягивало конец. Тогда инженеры нашли другое решение, предложив концепцию расширенных разделов (Extended partition). Если boot ID некоторого раздела равен 05h или 0Fh, он трактуется как "виртуальный физический диск", со своей собственной partition table, расположенной в его начале, на которую и указывает стартовый сектор расширенного раздела. Короче говоря, таблица разделов получается вложенной и уровень вложения ограничен разве что свободным местом жесткого диска и количеством стековой памяти загрузчика (при условии, что он использует рекурсивный алгоритм сканирования). Таблица разделов как бы размазывается вдоль винчестера. Большинство утилит резервирования сохраняют лишь первый сектор, чего явно недостаточно (впрочем, первый сектор гибнет намного чаще других, так что даже плохая политика резервирования лучше, чем совсем ничего).
Штатные утилиты разбивки (FDISK.EXE, Disk Manager) в каждой таблице разделов создает один основной и один расширенный раздел. Т. е. если при разбиении винчестера на четыре логических диска, на нем образуется четыре partition table, хотя в данном случае можно было бы обойтись и одной. Штатный загрузчик FDISK'а требует, чтобы активный раздел находится в первом секторе partition table, "благодаря" чем операционная система может грузиться только с диска C:. Нестандартные менеджеры, анализирующие всю цепочку разделов, позволяют загружаться с любого из разделов. Самые честные из них создают в первой partition table еще один раздел (благо если диск был разбит FDISK'ом свободное место там всегда есть), назначают его активным и помещают в него свое тело. Другие же внедряются непосредственно в MBR, замещая первичный загрузчик, что создает очевидные проблемы совместимости.
Если таблица разделов повреждена, логические диски скорее всего будут полностью недоступны – они отсутствуют в "Моем Компьютере", не появился в панели "Driver" файлового менеджера FAR'а, а команда C: вызывает ошибку. Искажение таблицы разделов не приводит к немедленному изменению объема уже отформатированных томов (т. к. он храниться в boot-секторе и картах свободного пространства), но при последующим переформатировании произойдет затирание данных из соседнего раздела, или же текущий раздел окажется усечен. Кстати говоря, если расширенный раздел указывает сам на себя или на один из предшествующих разделов в цепочке, все известные мне операционные системы наглухо зависнут еще на этапе загрузки, даже если диск подключен "вторым". Чтобы исправить ситуацию, необходимо запустить редактор диска или другую утилиту, а для этого необходимо загрузить операционную систему! Существует несколько путей выхода из этой, казалось бы неразрешимой проблемы. Самое простое – горячее подключение диска на ходу с последующей работой с ним через BIOS или порты ввода/вывода. Если ни диск, ни материнская плата не умет (а для IDE-устройств подключение "на лету" представляется довольно жестким испытанием!), вы сможете запустить доктора и работать с диском на физическом уровне. Другой, чисто хакерский, путь – пропатчить MS-DOS, изменив сигнатуру 55h AAh на что-нибудь еще, тогда она не сможет распознать таблицу разделом и стало быть, не станет ее анализировать. Как вариант можно записать в boot-сектор дискеты специально подготовленную программу, которая обнуляет MBR или искажает сигнатуру, расположенную в его конце. Просто загрузитесь с нее и все!
смещение | размер | назначение |
0x000 | перемен. | код загрузчика |
1x1BB | 4h | идентификатор диска |
0x1BE | 10h | Partition 1 |
0x1CE | 10h | Partition 2 |
0x1DE | 10h | Partition 3 |
0x1EE | 10h | Partition 4 |
0x1FE | 0x2 | признак таблицы разделов сигнатура 55h Aah |
Таблица 2 формат MBR
смещение | разм. | назначение | ||||
000 | 1BE | 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), см. таблицу.4 |
005 | 1C3 | 1D3 | 1E3 | 1F3 | byte | конечная головка раздела |
006 | 1C4 | 1D4 | 1E4 | 1F4 | byte | конечный сектор раздела (биты 0 – 5) старшие биты конечного цилиндра (биты 6-7) |
007 | 1C5 | 1D5 | 1E5 | 1F5 | | младшие биты конечного цилиндра (биты 0-7) |
008 | 1C6 | 1D6 | 1E6 | 1F6 | dword | смещение раздела относительно начала таблицы разделов в секторах |
00С | 1CA | 1DA | 1EA | 1FA | dword | кол-во секторов раздела |
Таблица 3 формат partition
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 | Legacy FT volume formatted with FAT32 * |
0x8C | Legacy FT volume using BIOS INT 13h extensions formatted with FAT32 |
Таблица 4 возможные значения Boot ID
Sector Inspector Copyright Microsoft Corporation 2003
===========================================================================
Target - \\.\PHYSICALDRIVE0
1867 Cylinders
255 Heads
63 Sectors Per Track
512 BytesPerSector
12 MediaType
LBN 0 [C 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|
| |
| | 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 [C 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|
===========================================================================
Листинг 4 пример таблицы разделов, сформированный программой FDISK
Комментариев нет:
Отправить комментарий