вторник, 12 мая 2009 г.

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

Первый сектор логического диска носит название загрузочного (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 сектора

Комментариев нет:

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