Boot, FAT и все, все, все...
Прислано Revolution May 13 2021 21:33:10

Boot, FAT и все, все, все...

MBR, загрузочный сектор, FAT, как устроена организация

Обратимся к первоисточникам...

 

Хорошо было во времена старых-добрых EC1840. Был дисковод на 5 дюймов, были большие и очень гибкие дискеты. На них все было понятно - Boot-сектор, FAT, таблица файлов... А потом появились эти противные винчестеры по 20 мегабайт, и картина сразу изменилась - обнаружился какой-то непонятный Master Boot Record , простой Boot , логические диски, таблица разделов, и жить стало сложнее. Вопрос, как все это работает и для чего оно нужно (второй важнейший вопрос после сакраментального - едят ли курицу руками?), продолжает мучить просвещенное человечество с тех самых пор и до нынешнего момента. Итак, с чем же их едят...

 

Для начала немного об адресации на винчестере. Основная единица измерения - сектор . Размер сектора - 512 байт. Секторы можно адресовать либо непосредственно по номеру, либо задавая комбинированный адрес, состоящий из номера цилиндра (дорожки), номера головки (стороны) и номера сектора на дорожке. Перевод из одного в другое производится по простенькой формуле: Номер сектора = (номер цилиндра X число головок X число секторов) + (номер головки X число секторов) + (номер сектора - 1)

 

Единица вычитается потому, что счет секторов ведется с нуля. Глубже вдаваться в адресацию не имеет смысла, поскольку тогда придется писать отдельную статью про то, почему DOS не понимает большие диски и какими извращенными способами это лечилось.

 

Вторая основная единица - кластер . Кластер - это несколько секторов, рассматриваемые операционной системой как одно целое. Переход к кластерам произошел потому, что размер таблицы FAT был ограничен, а размер диска менялся. В случае FAT16 для диска объемом 512 Мб кластер будет величиной 8 Кб, до 1 Гб - 16 Кб, до 2 Гб - 32 Кб и так далее.

 

MBR (Master Boot Record - основной сектор загрузки)

 

Расположен в нулевом секторе (цилиндр 0, сторона 0, сектор 1). На каждом жестком диске имеется в одном экземпляре и содержит в себе много интересного. По смещению 0H (далее для простоты все смещения будут в шестнадцатиричной системе) находится сам загрузчик. Его задача - обнаружить активный раздел и загрузить его Boot -сектор в память по адресу 0000:7С00 . Далее, по смещению 1BE находится Partition Table (именно в ней загрузчик и ищет активный раздел). По смещению 1FE (последние два байта сектора) находится сигнатура 55AA H , обозначающая загрузочный сектор. Вся дорожка с MBR считается служебной и информация туда не записывается.

 

Partition Table - таблица разделов

 

Живет в одном секторе с MBR по смещению 1BE . Размер PT - 64 байта (на описание одного раздела отводится 16 байт, так что максимум описывается 4 раздела). Для каждого раздела указано, загрузочный (активный) ли он (первый байт описания: 80 H - активный, 0H - нет), адрес начала раздела (в цилиндрах, головках и секторах), код системы, адрес конца раздела, логический адрес начала раздела (в секторах) и количество секторов в разделе. Посмотреть все это в удобоваримом виде можно при помощи бессмертной и незаменимой программы Diskedit в режиме as partition table . Как правило, на большинстве дисков имеется один или два раздела: Primary DOS и (если есть) Extended DOS. PT создается программой FDISK при разбивке винчестера на разделы.

 

Primary DOS Partition (основной раздел)

 

- тяжелое наследие старых версий DOS. Сохранился со времен, когда DOS понимал только один раздел. Не может быть больше 2 Гб (под FAT 16). Совпадает с первым логическим диском на винчестере. Только Primary Partition может быть загрузочной. Создается программой FDISK.

 

Extended DOS Partition (расширенный раздел)

 

- способ обойти ограничение на размер раздела 2 Гб. Внутри расширенного раздела можно создавать отдельные логические диски. Если посмотреть в PT адрес расширенного раздела и потом при помощи Diskedit перейти на этот адрес, то обнаружится сектор, по своей структуре напоминающий PT. Состоит он из двух элементов: первый описывает текущий раздел (Extended DOS), второй - следующий логический диск (если он есть). По указанному адресу снова обнаружится такая же таблица, а в ней адрес следующего логического диска (опять же, если он существует). В конце сектора имеется все та же сигнатура 55AA H, по которой его можно найти на диске (все в том же Diskedit’е). Вся остальная дорожка, как и в случае MBR - пустая. Создается программой FDISK.

 

Boot Sector (загрузочный сектор)

 

Собственно говоря, загрузочный сектор. Boot sector находится в начале каждого логического диска (первый сектор следующей дорожки после PT). В начале сектора находится команда Jmp - переход на начало кода загрузчика. По смещению 3 находится поле длиной 8 байт, содержащее название и версию OS - при загрузке не используется. Далее, по смещению 0B расположен блок из 19 байт, описывающий логические параметры диска (штука, весьма полезная в хозяйстве) - число байт в секторе (для DOS - 512), число секторов в кластере, число резервных секторов (то есть число секторов от начала диска до первой копии FAT - обычно один), число копий FAT (две), формат FAT в текстовом виде (FAT12, FAT16 или FAT32), размер корневого каталога (считается в записях по 32 байта), общее число секторов на диске, тип носителя (совпадает с первым байтом FAT) и число секторов в FAT. Опять же, всю эту информацию в понятном виде выводит Diskedit в режиме as Boot sector. По смещению 2B находится метка тома (длиной 11 байт). По смещению 3E расположен сам начальный загрузчик. Его задача - проверить первый сектор корневого каталога на наличие файлов IO.SYS и MSDOS.SYS и, обнаружив их, загрузить начало IO.SYS по адресу 0000:0700 H и передать ему управление. В последних двух байтах сектора записана привычная сигнатура 55AA H. Создается при форматировании.

 

FAT (File Allocation Table - таблица размещения файлов)

 

FAT расположен непосредственно за загрузочным сектором и представляет собой цепной список, предназначенный для поиска файла на диске. В зависимости от типа (FAT12, FAT16 или FAT32), имеет разную структуру. Но в самом примитивном виде идея следующая - каждый элемент FAT соответствует одному кластеру на диске. В корневом каталоге находится ссылка на первый кластер, занимаемый файлом. В FAT ищем этот кластер и смотрим, что в нем записано. Варианты следующие: кластер свободен, зарезервировано, дефектный, конец цепочки или номер следующего кластера в файле. Файл считывается до тех пор, пока не встретится код конца цепочки. В DOS (и его прямом наследнике - Windows) используется две копии FAT - для надежности. Обе копии должны быть идентичны (на диске они расположены друг за другом). Первый байт FAT скрывает в себе дескриптор носителя (F8 H для жесткого диска). Следующие несколько байт описывают тип FAT. За ними идет сама таблица. Создается при форматировании.

 

Root Directory (корневой каталог)

 

Идет сразу за второй копией FAT. Имеется на каждом диске. Практически это тот самый список файлов и директорий, который вы видите, открывая диск в Explorer’е или Far’е. Корневой каталог состоит из 32 байтных элементов (на самом деле, с появлением длинных имен файлов для каждого файла отводится несколько таких элементов). В них содержатся имя файла, расширение, атрибуты, дата и время создания, размер файла и номер первого кластера. Корневой каталог создается при форматировании.

 

После Root Directory начинается собственно область файлов, где и хранятся все ваши нажитые непосильным трудом данные. Но это уже совсем другая история...

 

 

1998 год

Система Разделов дисковой подсистемы

 

Система разделов - одна из наиболее важных элементов в дисковой подсистеме. Ее стандарт не зависит от Файловых и Операционных систем.

 

Структура разделов выглядит очень похоже на структуру каталога DOS.

 

Корневому каталогу - ROOT, в структуре разделов соответствует первый (корневой) сектор диска. Это сектор загрузочной области ( BA - boot area ). Когда компьютер загружается, BIOS загружает этот сектор в адрес 7C00:0000, и передает туда управление. В начале этого сектора записан код начальной загрузки. Этот код просматривает таблицу первичных разделов (PT - Partition Table ), определяет раздел, который является активным (самозагружаемым), затем загружает его первый сектор (загрузочный сектор) в тот же самый адрес (7C00:0000), и вновь передает туда управление. После этого дальнейшее управление загрузкой берет на себя операционная система - ОС.

 

Жесткий диск может содержать до четырех первичных разделов.

 

Таблица разделов, расположена так же в самом первом секторе - MBR, жесткого диска. Она описывает тип, активность (самозагружаемость) разделов и начальный / конечный номер цилиндра раздела.

 

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

 

Рассмотрим подробнее. Ниже приведена детальная таблица корневого сектора диска (цилиндр 0, головка 0, сектор 1). Очень часто эту область загрузки BA (boot area), обозначают как блок начальной загрузки (Master Boot Record):

 

Смещение

Описание

 

0000h-01BDh

Код начальной загрузки

MBR

01BEh-01CDh

Описатель 1-го основного раздела

Partition Table

01CEh-01DDh

Описатель 2-го основного раздела

01DEh-01EDh

Описатель 3-го основного раздела

01EEh-01FDh

Описатель 4-го основного раздела

01FEh-01FFh

Сигнатура системного байта (0xAA55)

 

 

Код начальной загрузки (Boot Code) - исполняемый код, который был описан выше.

Описатели разделов имеют следующую форму:

 

Смещение

Описание

 

0000h

Маркер начальной загрузки

 

0001h

Головка

Начало размещения

0002h

Сектор и Цилиндр (биты 8-9)

0003h

Цилиндр (биты 0-7)

0004h

Системное Описание

 

0005h

Головка

Конец размещения

0006h

Сектор и Цилиндр (биты 8-9)

0007h

Цилиндр (биты 0-7)

0008h-000Bh

Смещение секторов

 

000Ch-000Fh

Количество секторов в разделе

 

 

Маркер начальной загрузки – байт, значение которого может быть или 0 или номер диска (80h). Если 80h, тогда раздел является активным разделом диска (разделом начальной загрузки), с которого будет осуществляться загрузка операционной системы.

 

Следующие 3 байта содержат информацию о начале размещения раздела (номера головки, цилиндра и сектора). Номера сектора и цилиндра хранятся в двух байтах. Биты 0-7 номера цилиндра сохранены во втором байте, в то время как биты 8-9 сохранены в старших разрядах первого байта. Значение сектора сохранено в битах 0-5 первого байта. Бинарную карту байтов можно представить в виде таблицы:

 

2-й байт

F

E

D

C

B

A

9

8

C

C

C

C

C

C

C

C

7

6

5

4

3

2

1

0

1-й байт

7

6

5

4

3

2

1

0

C

C

S

S

S

S

S

S

9

8

5

4

3

2

1

0

 

Далее расположен системный байт, который является идентифицирующим байтом раздела. Значение 0, для разделов не используется, в то время как другие значения зависят от файловой системы. DOS использует значения 1,4 и 6 соответственно для FAT12, FAT16 и раздела BigDOS. Значение 5 обозначает Расширенный раздел, которое объясняется позже.

 

Затем, идут байты с информацией о размещении конечного сектора раздела (номера головки, цилиндра и сектора).

 

За ними - значение смещения сектора. Это - число, которое показывает позицию раздела относительно существующего сектора. Так, для основных разделов, это - стартовый сектор раздела. Основные разделы - разделы, которые описаны в корневой структуре разделения. Несколько позже мы увидим, что имеются описатели разделов также в других местах на диске, которые называются логическими дисками.

 

В последнем элементе описателя, находиться информация о длине раздела (в секторах).

 

Когда диск работает в режиме LBA (логической адресации блоков), значения CHS (цилиндр – головка – сектор) для начала и конца размещения игнорируются. Отображение диска выполняется с абсолютным номером сектора, а не в терминах CHS (cylinder-head-sector). Таким образом, относительное значение сектора и длина раздела используются для идентификации объема раздела на диске. CHS значения вообще недопустимы для дисков объемом более чем 8.4GB.

 

В корневом секторе выделены адреса для 4 описателей. Сразу после них, расположена сигнатура (два байта) AA55h, которая метит сектор как системный сектор. Это значение существует в каждом секторе структуры разделов (включая загрузочные секторы) и его отсутствие может свидетельствовать о вероятном повреждении структуры разделов.

 

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

 

 

MBR

1st Ext

2nd Ext

3rd Ext

1 : P

1 : L

1 : L

1 : L

2 : P

2 : E -----

2 : E -----

2 : -

3 : E -----

3 : -

3 : -

3 : -

4 : P

4 : -

4 : -

4 : -

 

 В этом примере, показана карта структуры разделов. MBR обозначает блок начальной загрузки (корневой сектор) и 1st, 2nd и 3rd Ext - позиции 1-го, 2-го и 3-го описателей дополнительных разделов. 'P' обозначает основной (Primary) раздел, 'E' обозначает дополнительный (Extended) раздел, и 'L' обозначает (Logical) логический диск. Раздел 'E' в MBR, называется главным (корневым или основным) дополнительным разделом. Это – потому, что он включает в себя все остальные дополнительные разделы. Начало расположения основного дополнительного раздела указывает на 1-й дополнительный раздел. Объем, который занимает основной дополнительный раздел, зарезервирован для логических дисков. Все дополнительные разделы содержат информацию относительно соответствующих им логических дисков, аналогично MBR (описанному выше), но без части кода начальной загрузки. Каждый дополнительный раздел также имеет 4 описателя (но используются только первые два). Первый описатель идентифицирует соответствующий логический диск, а второй является описателем, указывающим на следующий логический диск в цепочке разделов. Т.о. структура разделов - структура списка связей, которая может быть такой длины, какой необходимо. (Каждый дополнительный сектор описания раздела имеет в конце сигнатуру 0xAA55, идентифицирующую его как системный сектор).

 

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

 

Начало должно всегда быть - Цилиндр: XXXX Головка: 0 (или 1) Сектор: 1

 

Окончание должно быть - Цилиндр: YYYY Головка: m -1 Сектор n, где m   - число головок физического диска, и n   - число секторов на дорожку физического диска.

 

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

 

 

1998