FAT была создана корпорацией Microsoft для операционной системы (ОС) MS-DOS. Существуют три её разновидности: FAT12, FAT16 (или просто FAT), FAT32.Файловая система получила название по своему главному элементу - File Allocation Table (Таблица размещения файлов). Данная система применяется только для жёстких дисков и дискет.
Содержимое | Области | Описание |
Загрузочный сектор | Системная область |
Системная область - самая маленькая по размеру. В ней содержится очень важная информация: адреса таблицы 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 номер следующего кластера, считываем его, и так далее, пока не встретим значение “конец файла” (равно –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 килобайта - посчитали, что на нём меньше всего теряется места. Но если у вас на диске будет много маленьких файлов, делайте кластер меньше, и вы выиграете.
Пустой каталог - потерянный кластер. Удаляйте пустые каталоги. (На пустые файлы кластер не выделяется.)
Создавайте файлы с короткими именами (например, в окне DOS) - они занимают одну запись в каталоге (к сведению, почти все системные файлы Windows имеют короткие имена).
Проводите дефрагментацию - ОС очень долго разыскивает куски файла по всему диску.
Найти файл в каталоге, где несколько сот файлов, подчас дольше, чем прочесть его. Разбейте такой каталог на несколько. Оптимальное число файлов с коротким именем : (размер кластера в байтах)/32 - 3.
Загрузочный сектор логического диска
Смещение в секторе | Размер | Содержание |
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 буквы) |