Файловая система FAT

FAT была создана корпорацией Microsoft для операционной системы (ОС) MS-DOS. Существуют три её разновидности: FAT12, FAT16 (или просто FAT), FAT32.Файловая система получила название по своему главному элементу - File Allocation Table (Таблица размещения файлов). Данная система применяется только для жёстких дисков и дискет.

Логический диск с файловой системой FAT.

Содержимое Области Описание
Загрузочный сектор Системная область

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

Элемент FAT 1

Таблица FAT (менее 1%)

 

Область FAT состоит из элементов таблицы FAT, число которых равно числу кластеров. Каждый элемент соответствует своему кластеру. Элемент FAT занимает 12 бит на FAT12, 16 бит на FAT16 и 32 бита на FAT32.

 

 

Элемент FAT 2
Элемент FAT 3
Элемент FAT 4
. . .
 Элемент 1 Копия FAT Копия главной таблицы FAT, идентична ей. Используется для восстановления, если главная повреждена.
Элемент 2
Элемент 3
Элемент 4
. . .
Содержимое корневого каталога Корневой каталог На FAT12/FAT16 корневой каталог зачем-то выделен в отдельное место. На FAT32 это обычный файл, то есть этого поля нет.

Кластер 1

 

Данные (больше 99%)

 

Область данных разбита на  кластеры (от 1 до 64 секторов). Это сама большая область, так как в ней находятся все данные вашего диска (каталоги и файлы). Каждому кластеру в области данных соответствует элемент таблицы FAT

 

Кластер 2
Кластер 3
Кластер 4
. . .

Практически весь диск состоит из данных. Область данных разделена на участки одинакового размера - кластеры (от 1 до 64 секторов). Все файлы и папки находятся в этих кластерах. Файл может занимать несколько кластеров, но каждый кластер принадлежит только одному файлу. Кластер либо свободен, либо является частью какой-либо папки или файла. Файл необязательно должен находиться в соседних кластерах. Вполне возможно, что первый его кластер находится в начале диска, второй – в конце, а третий – в середине. Чтобы найти все кластеры файла (или папки, что одно и то же), существует специальная таблица - File Allocation Table (FAT). В ней находятся специальные значения для каждого кластера - занятый файлом, свободный, дефектный. Если кластер занят файлом, то в таблице находится номер следующего кластера файла. Фактически, системы FAT12, FAT16 и FAT32 различаются только размером элемента таблицы FAT – 12 бит (1,5 байта), 16 бит (2 байта) и 32 бита (4 байта). Так как элементы содержат номер кластера, то на диске с  FAT12 может быть максимум 2^12 = 4096 кластеров, в FAT16  - 2^16 = 65536, а в FAT32 - 2^32 = 4294967295 кластеров. По сути, таблица FAT не несёт каких-либо полезных для пользователя данных, просто занимая дисковое место - данные из неё используются только системой. Каков же её размер ? Давайте посчитаем. На каждый кластер приходится по одному элементу FAT. В FAT32 они по 4 байта, то есть, если размер кластера 4 килобайта (8 секторов = 4096 байт), то 4/4096 (1 тысячная) всего диска занято под FAT, а если 0,5 килобайта (1 сектор = 512 байт), то занято уже 4/512 (8 тысячных). Получается, чем больше кластер, тем меньший размер диска теряется под таблицу? Да это так, но при увеличении кластера возникают потери, несравнимо большие - о них мы поговорим попозже.
На диске также могут присутствовать: системная область (1 - 20 секторов) и несколько копий FAT (чаще всего одна), так что размер FAT нужно умножать на число копий.

Кластеры и элементы FAT.

Все файлы и папки содержатся в кластерах. Папка – это тот же файл, в котором установлен атрибут каталога и содержатся ссылки на файлы и другие папки, “содержащиеся” в нём.  В элементе FAT, соответствующем кластеру файла, содержится номер следующего кластера файла, или специальное значение, сигнализирующее, что файл закончен. Таким образом, для чтения всего файла нужно знать только номер его первого кластера, который и находится в описателе файла в папке, содержащей его. Мы читаем первый кластер, затем смотрим в таблице FAT номер следующего кластера, считываем его, и так далее, пока не встретим значение “конец файла” (равно –1 в системах Microsoft).

Номер элемента FAT 20 21 22 23 24 25 26
Содержимое элемента 26 0 23 24 25 -1 776
Свободный кластер Начало файла  Последний кластер файла

На рисунке показан фрагмент таблицы FAT, в котором показано расположение файла с первым кластером 22. Для простоты, файл находится в смежных кластерах. При запросе на чтение файла ОС найдёт в папке ссылку на этот файл и прочитает кластеры с 22 по 25.

Каталоги (папки).

Каталоги, как уже говорилось, являются обычными файлами, у которых установлен атрибут каталога в описании файла. В данном файле находятся специальные структуры, размером 32 байта, описывающие файлы и папки, содержащиеся в нём. Каждая структура описывает один файл или каталог. В ней указано имя файла, его атрибуты, номер первого кластера, даты создания и изменения, размер. Данные описатели разрабатывались ещё для DOS, и под имя файла зарезервировано только 11 байт (8 под имя и 3 под расширение) из 32. Отсюда и появилось пресловутое "короткое имя" в Windows - оно занимает один описатель в каталоге. Windows пользуется длинными именами, занимая под имя файла несколько описателей (в зависимости от длины имени). Записи в каталоге никак не сортируются, поэтому при большом количестве файлов в каталоге, поиск файла может быть затруднен. Первые два описателя имеют имена "." и "..", и описывают текущий каталог и родительский соответственно.

Создание файла.

ОС просматривает каталог, в котором нужно создать файл, и ищет, нет ли уже файла с таким именем - в папке не должно быть файлов с одинаковыми именами. Попутно она ищет первый свободный элемент каталога - может быть, есть удалённый файл, описатель которого можно занять. Если такого нет, то придётся расширять каталог. В описатель записывается имя файла, его атрибуты, время создания, размер - 0. Кластер этому файлу не выделяется, в номер первого кластера записывается 0, чего не может быть у файла с данными.

Удаление файла.

Как вы думаете, удаляется ли что-то с диска при удалении файла? Правильно, нет. ОС просто помечает файл как удалённый (первую букву его имени заменяет на 'х'), и проходит в FAT по его цепочке кластеров, помечая каждый как свободный. Если в эти кластеры ничего не будут записывать, то вся информация файла сохраняется на диске (надо только её найти). Поэтому будьте внимательнее со своими любовными письмами.

Потери на остатках кластеров.

Как вы заметили, ОС меряет дисковое пространство только кластерами, не размениваясь на что-то меньшее. Поэтому даже самому маленькому файлу выделяется один кластер. Если файл имеет размер один байт, то только один байт из всего кластера содержит что-то полезное. Остальная часть кластера просто теряется. Да и с большими файлами то же самое. Если размер файла не кратен размеру кластера, то последний кластер файла заполнен только частично, и какая-то его часть теряется. Сколько же места займут 100 файлов по 2 байта? На кластере 4 Кб - 400 Кб (а не 200 байт, как считается), на кластере 16 Кб - 1,56 Мб. Чем меньше кластер, тем меньше дискового места теряется. Но зато растет таблица FAT. Как плохо. Отсюда вывод - система FAT любит только большие файлы, а ещё больше кратные размеру кластера. Неким стандартом размера кластера является 4 килобайта - посчитали, что на нём меньше всего теряется места. Но если у вас на диске будет много маленьких файлов, делайте кластер меньше, и вы выиграете.

Некоторые советы по оптимизации FAT.

  1. Пустой каталог - потерянный кластер. Удаляйте пустые каталоги. (На пустые файлы кластер не выделяется.)

  2. Создавайте файлы с короткими именами (например, в окне DOS) - они занимают одну запись в каталоге (к сведению, почти все системные файлы Windows имеют короткие имена).

  3. Проводите дефрагментацию - ОС очень долго разыскивает куски файла по всему диску.

  4. Найти файл в каталоге, где несколько сот файлов, подчас дольше, чем прочесть его. Разбейте такой каталог на несколько. Оптимальное число файлов с коротким именем : (размер кластера в байтах)/32 - 3.

Как работать с FAT (техническая информация).

Загрузочный сектор логического диска

Смещение в секторе Размер Содержание
00 3 Инструкция перехода на программу загрузки
03 8 Аббревиатура операционной системы
0Bh 2 Число байтов в секторе (всегда 512)
0Dh 1 Число секторов в кластере
0Eh 2 Размер системной области (включая этот сектор)
10h 1 Число таблиц FAT (чаще всего 2)
11h 2 Число описателей файлов в корневом каталоге (в FAT32 - 0)
13h 2 Общее число секторов на диске (если 0, то размер - в поле со смещением 20h)
15h 1 Тип устройства
16h 2 Размер одной FAT в секторах (0 в FAT32)
18h 2 Число секторов на дорожке
1Ah 2 Число головок
1Ch 4 Абсолютный номер этого сектора
20h 4 Размер диска в секторах

Далее содержимое загрузочного сектора различается у FAT32 и FAT12/FAT16.

Загрузочный сектор для FAT16/FAT12

Смещение Размер Содержимое
24h 1 Номер дисковода для функций BIOS
25h 1 Зарезервировано
26h 1 Сигнатура - 29h
27h 4 Дата/время создания диска
2Bh 11 Метка диска - текстовая строка
36h 8 Аббревиатура файловой системы

Загрузочный сектор для FAT32

Смещение Размер Содержание
24h 4 Размер одной FAT в секторах
28h 2 Номер главной таблицы FAT
2Ah 2 Версия FAT32 (обычно 0)
2Ch 4 Первый кластер корневого каталога (обычно 2)
30h 2 Номер сектора структуры FSINFO (обычно 1)
32h 2 Номер сектора - копии загрузочного (обычно 6)
34h 12 Зарезервировано
40h 1 Номер дисковода для функций BIOS
41h 1 Зарезервировано
42h 1 Сигнатура - 29h
43h 4 Дата/время создания диска
47h 11 Метка диска
52h 8 Аббревиатура файловой системы

Типы устройства

Код Устройство
0F0h Дискета, 2 головки, 18 секторов на дорожке
0F8h Жёсткий диск
0F9h Дискета, 2 головки, 15 секторов на дорожке
0FCh Дискета, 1 головка, 9 секторов на дорожке
0FDh Дискета, 2 головки, 9 секторов на дорожке
0FEh Дискета, 1 головка, 8 секторов на дорожке
0FFh Дискета, 2 головки, 8 секторов на дорожке

Далее идёт программа загрузки операционной системы, и последние 2 байта - сигнатура загрузочного сектора - 55AAh.

Вам не показалось странным, что нигде на логическом диске не указан тип файловой системы? По аббревиатуре различать их запрещено. Для этого нужно хорошенько посчитать. Берём размер диска, вычитаем из него размер таблиц FAT, размер корневого каталога (если он есть), размер системной области. Что у нас получилось - размер области данных. Если его поделить на число секторов в кластере, то мы узнаем число кластеров на диске. Так вот, если оно меньше 0FF5h, то это FAT12, если больше его, но меньше 0FFF5h, то это FAT16, а если ещё больше, то FAT32. Не правда ли, странный способ?
В FAT12/FAT16 для корневого каталога выделено место между FAT и данными. Как узнать его размер в секторах? Число элементов корневого каталога умножаем на 32, добавляем размер сектора, вычитаем единицу и делим это всё на размер сектора.

Описатель файла в каталоге

Смещение Размер Содержимое
00 8 Имя файла
08 3 Расширение файла
0Bh 1 Атрибуты файла
0Ch 1 Зарезервировано
0Dh 1 Сотые доли секунды создания файла
0Eh 2 Время создания файла
10h 2 Дата создания файла
12h 2 Дата последнего обращения к файлу
14h 2 Старшее слово первого кластера файла
16h 2 Время последней записи в файл
18h 2 Дата последней записи в файл
1Ah 2 Младшее слово первого кластера файла
1Ch 4 Размер файла в байтах

Первая буква имени файла имеет специальное значение - если это 0E5h (русская 'х'), то файл был удалён, описатель свободен, если 0, то каталог закончился, файлов больше нет.
Атрибуты файла:

Длинные имена

Длинное имя разрезано на несколько стандартных описателей (по 13 букв на один описатель), каждый из которых содержит атрибут метки тома (чтобы их не было видно в DOS), плюс один нормальный описатель с укороченным именем (именно его видно в DOS). Буквы имени записываются в кодировке Unicode (по 2 байта на символ), причем точка и завершающий ноль также пишутся. Если длина имени кратна 13 символам, то нулевой символ не записывается. Остаток описателя дополняется кодами 0FFFFh. Участки записываются от последнего к первому, сразу за ними следует стандартный описатель. Нумеруются они с 1, причём у последнего участка установлен бит 6 в номере участка.

Смещение Размер Описание
00 1 Номер участка имени
01 10 Первый участок имени (5 букв)
0Bh 1 Стандартный атрибут (0Fh)
0Ch 1 хз
0Dh 1 хз
0Eh 12 Второй участок имени (6 букв)
1Ah 2 хз
1Ch 4 Третий участок имени (2 буквы)
Сайт управляется системой uCoz