Первый сектор логического диска носит название загрузочного (boot). Он содержит самозагрузочный код (bootstrap code) и важнейшие сведения о геометрии диска без которых раздел просто не будет смонтирован! Структура boot-сектора определяется архитектурными особенностями конкретной файловой системы, в частности NTFS boot sector выглядит так:
смещение | размер | назначение |
0x00 | 3 bytes | инструкция перехода |
0x03 | 8 байт | OEM ID – идентификатор |
0x0B | 25 bytes | BPB |
0x24 | 48 bytes | Extended BPB |
0x54 | 426 bytes | Bootstrap Code |
0x01FE | WORD | 55 AA |
Таблица 6 строение NTFS boot-сектора
В начале всякого сектора расположена трехбайтовая машинная команда перехода на bootstrap code (обычно EB 52 90, хотя возможны и вариации). Так происходит потому, что при загрузке boot-сектора в память управление передается на его первый байт, а bootstrap код по туманным историческим соображениям был отодвинут в конец сектора (для NTFS верхняя граница составляет 54h байт), вот и приходится прыгать блохой!
С третьего по одиннадцатый байты (считая от нуля) хранится идентификатор производителя, определяющий тип и версию используемой файловой системы (например, "MSDOS5.0 " для FAT16, "MSWIN4.0"/"MSWIN4.1" для FAT32 и "NTFS " для NTFS). Если это поле окажется искажено, драйвер не сможет смонтировать диск и даже может посчитать его не отформатированным! (примечание: с FAT-дисками Windows 2000 будет работать даже с запорченным OEM ID, чего не скажешь про NTFS).
Следом за идентификатором расположен 25-бйтовый блок параметров BIOS (BIOS Parameter Block или сокращенно BPB), хранящий сведения о геометрии диска (число цилиндров, головок, секторов, размер сектора, кол-во секторов в кластере и т. д.). Если эта информация окажется утеряна или искажена, нормальное функционирования драйвера файловой системы станет невозможным. Причем, если данные число цилиндров/головок/секторов дублирует информацию, содержащуюся в MBR, а при ее утере элементарно восстанавливается описанным выше способом, то размер кластера определить не так-то просто! Позже мы обсудим этот вопрос более подробно, пока же ограничимся следующей табличкой, сообщающий размер кластера NTFS-томов, выбираемой штатной утилитой форматирования по умолчанию (см. таблицу 7)
При выборе размера кластера вручную, Windows 2000 поддерживает следующий модельный ряд: 1 сектор, 2 сектора, 4 сектора, 8 секторов, 16 секторов, 32 сектора, 64 сектора и 128 секторов. Чем больше размер кластер, тем меньше фрагментация и выше предельно адресуемый дисковый объем, но вместе с тем и выше потери от грануляции. Впрочем, ручное задание размеров кластера встречается достаточно редко.
размер диска | размер кластера |
< lang="EN-US" style="mso-ansi-language:EN-US">MB | 1 сектор |
< lang="EN-US" style="mso-ansi-language:EN-US">GB | 2 сектора |
<> | 4 сектора |
> 2GB | 8 секторов |
Таблица 7 размер кластера, выбираемый Windows 2000 по умолчанию
К блоку параметров BIOS вплотную примыкает его продолжение – extended BPB, хранящий номер первого кластера MFT, ее размер в кластерах, номер кластера с зеркалом MFT и некоторую другую информацию. В отличии от FAT16/32, MFT может располагаться в любом месте диска (для борьбы с BAD-секторами это актуально). При нормальном развитии событий MFT располагается практически в самом начале диска (где-то в районе 4 кластера) и если только она не была перемещена ее легко найти глобальным поиском (строка "FILE*" по смещению 0 от начала сектора). При разрушении или некорректном заполнении extend PBP, драйвер файловой системы отказывается монтировать раздел, объявляя его не отформатированным.
Следом за extend PBP идет Bootstrap Code, который ищет на диске операционный загрузчик (у Windows NT это ntldr), загружает его в память и передает ему управление. Если Bootstrap Code отсутствует, загрузка операционной системы становится невозможной, однако, при подключении восстанавливаемого диска вторым, раздел должен быть прекрасно виден. Порча Bootstrap Code кода вызывает перезагрузку компьютера или его зависание.
И завершает boot-сектор уже известная нам сигнатура 55h AAh, без которой он ни за что не будет признан загрузочным.
смещение | размер | назначение |
0x00 | 3 bytes | инструкция перехода |
0x03 | 8 байт | OEM ID |
0x0B | WORD | байт на сектор (для жестких дисков всегда 512) |
0x0D | BYTE | секторов на кластер |
0x0E | WORD | кол-во зарезервированных секторов, всегда (?) равно 0 |
0x10 | 3 BYTES | не используется NTFS и всегда должно быть равно 0 |
0x13 | WORD | не используется NTFS и всегда должно быть равно 0 |
0x15 | BYTE | медиа дескрпитор для жестких дисков всегда равен 0xF8 |
0x16 | WORD | не используется NTFS и всегда должно быть равно 0 |
0x18 | WORD | кол-во секторов в треке |
0x1A | WORD | кол-во головок |
0x1C | DWORD | кол-во скрытых секторов |
0x20 | DWORD | не используется NTFS и всегда должно быть равно 0 |
0x24 | DWORD | не используется NTFS и всегда должно быть равно 0 |
0x28 | 8 байт | общее количество секторов (total sector) |
0x30 | 8 байт | логический номер кластера, с которого начинается MTF |
0x38 | 8 байт | логический номер кластера, с которого начинается зеркало MTF |
0x40 | DWORD | кол-во кластеров на сегмент (File Record Segment) |
0x44 | DWORD | кол-во кластеров на блок индексов (index block) |
0x48 | 8 байт | серийный номер тома |
0x50 | DWORD | контрольная сумма (0 – не подсчитывать). |
0x54 | 426 bytes | Bootstrap Code |
0x01FE | WORD | 55 AA |
Таблица 8 значение полей NTFS boot сектора
Комментариев нет:
Отправить комментарий