FAT (; ) — классическая архитектура файловой системы, которая из-за своей простоты всё ещё широко применяется для флеш-накопителей. Ранее находила применение на дискетах и на жёстких дисках.

Разработана Биллом Гейтсом и в 1976—1977 годахwww.microsoft.com/mscorp/ip/tech/fathist.asp в archive.org. Использовалась в качестве основной файловой системы в операционных системах семейств MS-DOS и Windows 9x.

Структура FAT следует стандарту ECMA-107 и подробно определяется официальной спецификацией Microsoft, известной под названием FATGEN.

Версии системы FAT Существует четыре версии FAT — FAT12, FAT16, FAT32 и exFAT (FAT64). Они различаются разрядностью записей в дисковой структуре, то есть количеством бит, отведённых для хранения номера кластера. FAT12 применяется в основном для дискет, FAT16 — для дисков малого объёма. На основе FAT была разработана новая файловая система exFAT (extended FAT), используемая преимущественно для флеш-накопителей.

Изначально FAT не поддерживала иерархическую систему каталогов — все файлы располагались в корне диска. Это было сделано для упрощения, так как на односторонних дискетах ёмкостью всего 160—180 Кбайт сортировать немногочисленные файлы по каталогам попросту не было смысла. С распространением дискет на 320 и более килобайт хранение всех файлов в корне оказалось неудобным, к тому же малый размер корневого каталога ограничивал количество файлов на диске. Каталоги были введены с выходом MS-DOS 2.0.

В разных операционных системах также были внедрены различные расширения FAT. Например, в DR-DOS имеются дополнительные атрибуты доступа к файлам; в Windows 95, Linux — поддержка длинных имён файлов (LFN) в формате Unicode (Virtual FAT — VFAT); в OS/2 — расширенные атрибуты всех файлов.

VFAT VFAT — расширение FAT, появившееся в Windows 95. В FAT имена файлов имеют формат 8.3 и состоят только из символов кодировки ASCII. В VFAT была добавлена поддержка длинных (до 255 символов) имён файлов () в кодировке UTF-16LE, при этом LFN хранятся одновременно с именами в формате 8.3, ретроспективно называемыми SFN (). LFN нечувствительны к регистру при поиске, однако, в отличие от SFN, которые хранятся в верхнем регистре, LFN сохраняют регистр символов, указанный при создании файлаНе следует путать расширение файловой системы VFAT с одноимённым драйвером файловой системы, который появился в Windows for Workgroups 3.11 и предназначен для обработки вызовов функций MS-DOS (INT 21h) в защищённом режиме (см.: ).

Структура системы FAT В файловой системе FAT смежные секторы диска объединяются в единицы, называемые кластерами. Количество секторов в кластере равно степени двойки (см. далее). Для хранения данных файла отводится целое число кластеров (минимум один), так что, например, если размер файла составляет 40 байт, а размер кластера 4 Кбайт, реально занят информацией файла будет лишь 1 % отведённого для него места. Во избежание подобных ситуаций целесообразно уменьшать размер кластеров, а для сокращения объёма адресной информации и повышения скорости файловых операций — наоборот. На практике выбирают некоторый компромисс. Так как ёмкость диска вполне может и не выражаться целым числом кластеров, обычно в конце тома присутствуют так называемые surplus sectors — «остаток» размером менее кластера, который не может отводиться ОС для хранения информации.

Пространство тома FAT32 логически разделено на три смежные области: Зарезервированная область. Содержит служебные структуры, которые принадлежат загрузочной записи раздела (Partition Boot Record — PBR, для отличия от Master Boot Record — главной загрузочной записи диска; также PBR часто некорректно называется загрузочным сектором) и используются при инициализации тома; Область таблицы FAT, содержащая массив индексных указателей («ячеек»), соответствующих кластерам области данных. Для повышения надёжности на диске обычно представлено две копии таблицы FAT; Область данных, где записано собственно содержимое файлов — то есть текст текстовых файлов, кодированное изображение для файлов рисунков, оцифрованный звук для аудиофайлов и т. д.

В FAT12 и FAT16 также специально выделяется область корневого каталога. Она имеет фиксированное положение (непосредственно после последнего элемента таблицы FAT) и фиксированный размер в 32-байтных элементах, то есть при описании в Partition Boot Record указывается именно количество 32-байтных элементов, каждый из которых описывает какой-либо элемент корневого каталога (будь то файл или другой вложенный каталог).

Если кластер принадлежит файлу, то соответствующая ему ячейка в таблице FAT содержит номер следующего кластера этого же файла. Если ячейка соответствует последнему кластеру файла, то она содержит специальное значение (0xFFFF для FAT16). Таким образом выстраивается цепочка кластеров файла. Неиспользуемым кластерам в таблице соответствуют нули. «Плохим» кластерам (которые исключаются из обработки, например, по причине нечитаемости соответствующей области устройства) также соответствует специальный код (0xFFF7 для FAT16).

При удалении файла первый знак имени заменяется специальным кодом 0xE5, и цепочка кластеров файла в таблице размещения обнуляется. Поскольку информация о размере файла (которая располагается в каталоге рядом с именем файла) при этом остаётся нетронутой, в случае, если кластеры файла располагались на диске последовательно и не были перезаписаны новой информацией, удалённый файл можно восстановить.

Загрузочная запись Первая структура тома FAT называется BPB () и расположена в зарезервированной области, в нулевом секторе. Эта структура содержит информацию, идентифицирующую тип файловой системы и физические характеристики носителя (дискеты или раздела на жёстком диске).

Блок параметров BIOS (BPB)

BPB отсутствовал в FAT, обслуживавшей MS-DOS 1.x, так как в то время предполагалось лишь два различных типа тома — одно- и двусторонние пятидюймовые дискеты на 320 Кбайт, причём формат тома определялся по первому байту области FAT. BPB был введён в MS-DOS 2.x в начале 1983 года как обязательная структура загрузочного сектора, по которой впредь следовало определять формат тома; старая схема определения по первому байту FAT больше не поддерживалась. Также в MS-DOS 2.0 была введена иерархия файлов и папок (до этого все файлы хранились в корневом каталоге).

Структура BPB в MS-DOS 2.x содержала 16-битное поле «общего количества секторов», что означало принципиальную неприменимость этой версии FAT для томов объёмом более 216 = 65 536 секторов, то есть более 32 Мбайт при стандартном размере сектора 512 байт. В MS-DOS 4.0 (1988 г.) поле BPB было расширено до 32 бит, что означало увеличение теоретического размера тома до 232 = 4 294 967 296 секторов, то есть до 2 Тбайт при 512-байтовом секторе.

Следующая модификация BPB появилась вместе с Windows 95 OSR2, в которой была введена FAT32 (в августе 1996 года). Было снято ограничение в 2 Тбайт на размер тома, том FAT32 теоретически может иметь размер до 8 Тбайт. Впрочем, размер каждого отдельного файла при этом не может превышать 4 Гбайт. BIOS Parameter Block в FAT32 в целях совместимости с ранними версиями FAT повторяет BPB у FAT16 вплоть до поля BPB_TotSec32 включительно, далее следуют различия.

«Загрузочный сектор» FAT32 в действительности представляет собой три 512-байтовых сектора — сектора 0, 1 и 2. Каждый из них содержит сигнатуру 0xAA55 по адресу 0x1FE, то есть в последних двух байтах, в случае если размер сектора равен 512 байт. Если же размер сектора больше 512 байт, то сигнатура содержится как по адресу 0x1FE, так и в последних двух байтах нулевого сектора, то есть дублируется.

FSInfo Загрузочная запись раздела FAT32 содержит структуру под названием FSInfo, используемую для хранения значения числа свободных кластеров тома. FSInfo, как правило, занимает сектор 1 (см. поле BPB_FSInfo) и имеет следующую структуру (адреса относительно начала сектора):

FSI_LeadSig. 4-байтовая подпись 0x41615252, свидетельствует, что сектор используется для структуры FSInfo. FSI_Reserved1. Промежуток с 4 по 483 байт сектора включительно, обнуляется. FSI_StrucSig. Ещё одна подпись, расположена по адресу 0x1E4 и содержит значение 0x61417272. FSI_Free_Count. 4-байтовое поле по адресу 0x1E8, содержит последнее известное системе значение числа свободных кластеров тома. Значение 0xFFFFFFFF означает, что число свободных кластеров неизвестно и должно вычисляться. FSI_Nxt_Free. 4-байтовое поле по адресу 0x1EC, содержит номер кластера, от которого должен начинаться поиск свободных кластеров по таблице индексных указателей. Обычно это поле содержит номер последнего кластера FAT, отведённого для хранения файла. Значение 0xFFFFFFFF означает, что поиск свободного кластера должен проводиться с самого начала таблицы FAT, то есть со второго кластера. FSI_Reserved2. Зарезервированное 12-байтное поле по адресу 0x1F0. FSI_TrailSig. Подпись 0xAA550000 — последние 4 байта сектора FSInfo.

Смысл введения FSInfo — в оптимизации работы системы, так как в FAT32 таблица индексных указателей может быть весьма большой, а её побайтовый просмотр — занять значительное время. Однако значения полей FSI_Free_Count и FSI_Nxt_Free могут не соответствовать действительности и должны проверяться на адекватность. Кроме того, они даже не обновляются в резервной копии FSInfo, расположенной, как правило, в секторе 7.

Определение типа FAT тома Определение типа FAT тома (то есть выбор между FAT12, FAT16 и FAT32) производится ОС по количеству кластеров в томе, которое, в свою очередь, определяется из полей BPB. Прежде всего вычисляется количество секторов корневого каталога:

RootDirSectors = (BPB_RootEntCnt * 32) / BPB_BytsPerSec

Далее определяется, какие из полей BPB_FATSz16/32 и BPB_TotSec16/32 не равны нулю, и они используются при определении количества секторов области данных тома:

DataSec = TotSec — (BPB_ResvdSecCnt + (BPB_NumFATs * FATSz) + RootDirSectors)

Наконец, определяется количество кластеров области данных:

CountofClusters = DataSec / BPB_SecPerClus

По количеству кластеров проводится однозначное соответствие с файловой системой: CountofClusters < 4085 — FAT12 CountofClusters = 4085 ÷ 65 524 — FAT16 CountofClusters > 65 524 — FAT32

Согласно официальной спецификации, это единственный допустимый способ определения типа FAT. Искусственное создание тома, нарушающего указанные правила соответствия, приведёт к его некорректной обработке Windows. Тем не менее рекомендуется избегать значений CountofClusters, близких к критическим (4085 и 65 525), для верного определения типа файловой системы любыми, часто некорректно написанными драйверами.

На дискете при форматировании всегда создаётся FAT12. Что касается жёстких дисков и флеш-накопителей, то при размере накопителя до 512 Мбайт (при 512-байтовом секторе) по умолчанию создаётся FAT16, свыше 512 Мбайт — FAT32. Размер кластера определяется при форматировании, исходя из файловой системы и размера тома.

Серийный номер тома Серийный номер тома (поле BS_VolID) в Windows 98 создаётся из даты и времени форматирования таким образом, что без дополнительной информации восстановить их невозможно.

Таблица FAT Следующая важная структура тома FAT — сама таблица FAT, занимающая отдельную логическую область. Она определяет список (цепочку) кластеров, в которых размещаются файлы и папки тома. Между кластерами и индексными указателями таблицы имеется взаимно однозначное соответствие — N-й указатель соответствует кластеру с тем же номером. Первому кластеру области данных присваивается номер 2. Значение индексного указателя соответствует состоянию соответствующего кластера. Возможны следующие состояния:

кластер свободен — указатель обнулён; кластер занят файлом и не является последним кластером файла — указатель содержит номер следующего кластера файла;