Это одна из первых и старых файловых систем. Она очень проста для понимания, и вообще, сама по себе эта файловая система использовалась еще с 1976 года, и придумал ее, конечно же, всеми известный Билл Гейтс (Bill Gates) в соавторстве с Марком Мак Дональдсом (шучу, Мак Даком). Сегодня я слегка разберу, как тут все устроено и что с этим дальше делать.
Файловая система (ФС) состоит из компонентов:
Загрузочный сектор с описанием структуры ФС – размер, количество записей, стартовые точки, имя тома и т.д.
Собственно, сами таблицы FAT (обычно их 2 копии)
Кластеры с данными
Кластер это неделимая единица данных, один кластер может состоять из нескольких секторов, от 1 сектора до сколько угодно секторов, но не более 255. Один сектор занимает 512 байт. Для FAT12, который используется для дискет объемом например, 1.44 Мб, достаточно 1 сектора на кластер. FAT12 может адресовать кластеров, то есть, от 0 до 4095, или, 512 x 4095, что приблизительно равняется 2 Мб. Для одной дискеты этого достаточно. Для большего же объема диска потребуется уже не 12 бит на адрес, а 16 или 32. Все зависит от объема диска.
Несмотря на это, если размер кластера, к примеру, 4Кб, то с помощью FAT12 можно адресовать не 2Мб, а уже 16 Мб. Конечно, более чем 4095 файлов в FAT12 записать вообще невозможно в принципе, поскольку минимально занимаемый объем одного файла может быть только 512 байт, не меньше. Другими словами, файл делится на части по 512 байт (или 1кб, 2кб и т.д.) по кластерами и раскидывается на диске. Это является минусом данной файловой системы.
§ Загрузочный сектор
В целом, рассмотрим три варианта загрузочного сектора:
Общая структура для всех типов ФС.
0x000 | | 3 | JMP ...
0x003 | | 8 | Строка 8 байт, название ФС, например FAT16
0x00B | 0x00 | 2 | Байт на логическом секторе
0x00D | 0x02 | 1 | Логических секторов в кластере
0x00E | 0x03 | 2 | Зарезервированых секторов
0x010 | 0x05 | 1 | Количество таблиц FAT
0x011 | 0x06 | 2 | Количество элементов корневого каталога
0x013 | 0x08 | 2 | Всего логических секторов на диске
0x015 | 0x0A | 1 | Тип носителя
0x016 | 0x0B | 2 | Логических секторов в FAT
0x018 | 0x0D | 2 | Физические секторов на дорожке
0x01A | 0x0F | 2 | Количество головок
0x01C | 0x11 | 4 | Скрытых секторов
0x020 | 0x15 | 4 | Всего логических секторов
FAT12 и FAT16
0x024 | 0x19 | 1 | Номер физического диска
0x025 | 0x1A | 1 | Флаги
0x026 | 0x1B | 1 | Расширенная загрузочная запись
0x027 | 0x1C | 4 | Серийный номер тома (при форматировании)
0x02B | 0x20 | 11 | Метка тома
0x036 | 0x2B | 8 | Тип файловой системы
FAT32
0x024 | 0x19 | 4 | Размер FAT в логических секторах
Пример блока загрузки для файловой системы FAT12 для дискеты 1.44 Мб:
jmpnear start ; 00 Переход (3 байта)
db'FLOPPY12'; 03 Имя
dw 200h ; 0B Байт в секторе (512)
db1; 0D Секторов на кластер
dw1; 0E Количество резервированных секторов перед началом FAT (1 - бутсектор)
db2; 10 Количество FAT
dw 00E0h ; 11 Количество записей в ROOT Entries (224 x 32 = 1C00h байт), 14 секторов
dw 0B40h ; 13 Всего логических секторов (2880)
db 0F0h ; 15 Дескриптор медиа (F0h - флоппи-диск)
dw 9h ; 16 Секторов на FAT
dw 12h ; 18 Секторов на трек
dw 2h ; 1A Количество головок
dd0; 1C Скрытых секторов (large)
dd0; 20 Всего секторов (large)
db0; 24 Номер физического устройства
db1; 25 Флаги
db 29h ; 26 Расширенная сигнатура загрузчика
dd 07E00000h ; 27 Serial Number
db'LOADER BIN'; 2B Метка тома
db'FAT12 '; 36 Тип файловой системы
Это уже готовый к использованию код, поэтому можно его брать для создания бут-сектора для дискет. Как ранее и упоминалось, в "имя" можно написать абсолютно любую строку, можно даже сказать, просто название для файловой системы. Количество байт в секторе неизменно и равно 512 (200h), а количество секторов на кластер, обычно равно 1, потому что такого количества хватит для дискеты.
Резервированные сектора перед началом FAT – это количество секторов, которые необходимо пропустить с текущего положения бутсектора до старта таблиц FAT. В данном случае, таблицы идут сразу же за бутсектором, а он занимает ровно 1 сектор, так что тут число 1.
Во избежание повреждений секторов в одной из FAT, используются 2 копии, поэтому количество FAT здесь равно 2, хотя можно и 3 и более, но это уже будет слишком избыточно. При повреждении одного сектора, используется резервный.
Для FAT12 и FAT16 непосредственно сразу же за таблицами FAT идет корневая директория, которая содержит в себе указанное количество записей, в данном случае их 00E0h (224). Одна запись представляет из себя структуру на 32 байт, которая описывает имя файла и то, где он лежит, его длина, дата создания, и прочие атрибуты. Для файловой системы FAT32 это поле равно 0, поскольку корневая директория указывается в другом месте, и работает иначе. В любом случае, об этом будет рассказано далее.
Логических секторов указано 2880, то есть если 2880 x 512 = 1474560 байт, размер дискеты (1.4 Mb). Дескриптор медиа здесь равен 0xF0, что означает, что это флоппи диск. Секторов на FAT, это общее количество секторов, которые содержатся в таблицах FAT, Здесь их 9, то есть, одна таблица FAT занимает 9 * 512 = 4608 байт. Учитывая, что размер одного элемента FAT12 (именно 12) равен 1.5 байта, то тогда для адресации доступно 4608 / 1.5 = 3072 кластеров. Один элемент FAT указывает на определенный кластер.
Прокомментирую оставшиеся поля:
Секторов на трек – 18 секторов на один трек, один цилиндр составляет 2 x 18 = 36 секторов. Как известно, на диске 2880 секторов, а значит, ровно 80 цилиндров. Это легко рассчитать, зная общее количество секторов.
Скрытых секторов – количество секторов, которые располагаются до файловой системы, их тут 0. Актуально для для диска
Номер физического устройства – поскольку дисковод один, то и номер начинается с 0
Флаги и расширенная сигнатура загрузчика всего равны 1 и 29h
Serial Number – серийный номер диска, присваивается при форматировании дискеты
Метка тома – просто 11-байтное название тома (8+3)
Тип файловой системы – обычно сюда пишут название FAT12, FAT16, FAT32
Я расписал только то, как устроен первый сектор файловой системы FAT12. Сразу же за сектором в данном случае идет таблица FAT.
§ Таблица FAT
Как уже и упоминалось ранее, ФС состоит из нескольких частей:
Загрузочный сектор с BPB – Bios Parameter Block
Таблицы FAT (1 или 2 копии)
(Опционально) Корневой каталог
Кластеры с данными
Файловая система крайне проста и работает на очень простом принципе цепочечного сбора файлов. Дело в том, что файл может быть разбит на мелкие кусочки и разбросан по всему диску. Как файловая система находит эти кусочки файлов?
Все дело в том, что существует таблица для этого, File Allocation Table. Она выглядит примерно так:
0000 | F000
0001 | FFF0
0002 | 0005
0003 | 0004
0004 | 0006
0005 | 0003
0006 | 0007
0007 | FFF0
....
Эта таблица имеет порядковый номер и значение. Порядковый номер равен номеру кластера, на который он и указывает. Теперь представим, что файл начинается с кластера 2. Сначала читается кластер 2 в память, после чего проверяется позиция 2 в FAT. Как видно, там число 5 – это значит, что будет прочтен кластер 5 и записан в память. Снова проверяем что в позиции 5, а так 3. Читаем кластер 3, проверяем FAT в позиции 3. Там 4. Читаем 4 кластер, и так далее, до тех пор, пока не достигнет значения FFF0 – EOF (End Of File). То есть, прочтя кластер 7, дальнейшее чтение завершается.
Это и есть цепочка сборки файлов из фрагментов. В данном случае, он получилась следующей: 2, 5, 3, 4, 6, 7. Вот, собственно, и все, как устроена таблица FAT.
В случае FAT32, меняется содержание BPB в первом секторе, и вместо того, чтобы использовать корневой каталог (его больше нет), используется указатель на номер кластера, где этот каталог находится. То есть теперь каталог может быть где угодно на диске и быть сколько угодно большим. Можно сказать так, что корневой каталог стал специальным файлом.
§ Файловые записи
Файловые записи используются в каталогах для указания имени файла, его размера, даты, атрибутов и номера кластера, откуда файл начинается. Одна запись занимает 32 байта и содержит в себе имя на 8 байт с расширением на 3. Это базовая запись, существует возможность расширить имя файла до сколь угодно большого размера, но рассматривать в этой статье я не буду, как это получается.
Байты Длина Содержание
0x00 8 Файловое имя
0x00 3 Расширение
0x0B 1 Атрибуты
Бит 0: Только чтение
Бит 1: Скрытый
Бит 2: Системный
Бит 3: Метка тома
Бит 4: Этот файл является директорией
Бит 5: Архивный
Бит 6-7: Не используются
0x0C 1 Зарезервировано
0x0D 1 - Время создания файла (сотые доли секунды) по 10 мс (от 0 до 199)
- Первый символ удаленного файла (если есть E5 в имени файла)
0x0E 2 Время создания файла (час, минута, двойная секунда)