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

PT (Partition Table - таблица разделов). Живет в одном секторе с MBR по смещению 1BE. Размер PT - 64 байта (на описание одного раздела отводится 16 байт, так что максимум описывается 4 раздела). Для каждого раздела указано, загрузочный (активный) ли он (первый байт описания: 80 H - активный, 0 H - нет), адрес начала раздела (в цилиндрах, головках и секторах), код системы, адрес конца раздела, логический адрес начала раздела (в секторах) и количество секторов в разделе. Посмотреть все это в удобоваримом виде можно при помощи бессмертной и незаменимой программы 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 начинается собственно область файлов, где и хранятся все ваши нажитые непосильным трудом данные. Но это уже совсем другая история...

Константин АФАНАСЬЕВ

Версия для печатиВерсия для печати

Номер: 

19 за 1999 год

Рубрика: 

На заметку
Заметили ошибку? Выделите ее мышкой и нажмите Ctrl+Enter!