Файловая система FAT12
Обычная дискета содержит 4 основных области:
- - загрузочный сектор (boot sector или boot record); - таблица размещения файлов (file allocation table); - корневой каталог; - область данных.
Загрузочный сектор содержит короткую (менее 512 байт) программу начальной загрузки ОС в память компьютера. Независимо от типа ОС и способа форматирования дискеты, эта программа всегда занимает самый первый сектор на самой первой дорожке диска. Также этот сектор содержит всю важную информацию о характеристиках диска. Структура этой информации следующая:
Смещение, байт |
Название |
Размер, байт |
Описание |
00h |
Команда JMP |
3 |
Длинный или короткий переход на программу загрузчика |
03h |
Идентификатор |
8 |
Идентификатор версии ОС, с помощью которой отформатирован диск (например, “MSDOS6.0”) |
0Bh |
Байт/Сектор |
2 |
Размер сектора в байтах |
0Dh |
Сектор/Кластер |
1 |
Число секторов в кластере |
0Eh (*) |
Резерв |
2 |
Количество резервных секторов |
10h |
Число FAT |
1 |
Число копий FAT на диске |
11h |
Число корневых записей |
2 |
Макс. количество записей в корневом каталоге диска |
13h (**) |
Всего секторов |
2 |
Общее число секторов на диске |
15h |
Носитель |
1 |
Тип магнитного носителя |
16h |
Сектор/FAT |
2 |
Число секторов в каждой из FAT |
18h |
Сектор/дорожка |
2 |
Число секторов на одну дорожку |
1Ah |
Число головок |
2 |
Число головок на диске |
1Ch |
Скрытых секторов |
4 |
Число скрытых секторов на диске |
20h |
Больших секторов |
4 |
Общее число секторов |
24h |
Номер накопителя |
1 |
Номер накопителя по BIOS'у |
25h |
Зарезервировано |
1 |
Резерв |
26h |
Сигнатура |
1 |
Содержит число 29h |
27h |
ID тома |
4 |
Идентификатор тома диска |
2Bh |
Метка тома |
11 |
Копия метки тома |
36h |
ID типа FAT |
8 |
FAT12 или FAT16 |
3Eh |
Загрузчик |
? |
Программа загрузчика |
36h |
|
|
Конец загрузочного сектора |
- * - для формата IBM PC длина зарезервированной области всегда составляет 1 сектор (сектор загрузчика)
- ** - если более 65535, то равно 0, а действительное число секторов лежит по смещению 20h.
Таблица размещения файлов (FAT) содержит информацию о месторасположении записанных на дискету файлов. ОС выделяет для хранения файла, в зависимости от его длины, один или более кластеров (кластер – единица хранения данных на диске, обычно один кластер равен нескольким секторам), однако ОС не заботится, чтобы запись файла происходила последовательно, поэтому необходимо хранить информацию, по каким именно кластерам раскидан данный файл. В силу особой важности этой информации FAT существует на диске в двух копиях. FAT дискеты состоит из 12-битовых элементов. Структура таблицы размещения файлов следующая:
Элемент FAT |
Выполняемая функция |
0 |
Идентификатор формата |
1 |
Зарезервирован (должен быть FFF) |
2 |
Статус кластера 2 |
3 |
Статус кластера 3 |
... |
... |
Идентификатор формата может принимать следующие значения:
- F0 - 3'5/2/18 (дискета 3'5, 2 стороны, 18 секторов)
- F8 - жесткий диск
- F9 - 5'25/2/15 или 3'5/2/9
- FC - 5'25/1/9
- FD - 5'25/2/9
- FE - 5'25/1/8
- FF - 5'25/2/8
Статус кластера может быть следующим:
- 000 - кластер свободен
- FF0..FF6 - зарезервирован
- FF7 - испорчен
- FF8...FFF - последний кластер
- иначе - номер следующего кластера файла
Корневой каталог следует непосредственно за FAT. Содержит информацию об основных параметрах файлов (длине, дате создания, и т.д.). Каждая запись в каталоге соответствует тому или иному файлу (кроме, разумеется, метки диска), включает номер первого кластера, назначенного ОС этому файлу, который используется как точка входа в FAT. Начиная с этой точки, каждая запись в FAT содержит номер следующего кластера, распределенного под этот файл, или метку последнего кластера. Структура записи в корневом каталоге следующая:
Смещение |
Название |
Описание |
00h |
Имя |
Имя файла |
08h |
Расширение |
Расширение файла |
0Bh |
Атрибуты |
Атрибуты файла |
0Ch |
Зарезервировано |
Резерв |
16h |
Время |
Время последней перезаписи файла |
18h |
Дата |
Дата последней перезаписи файла |
1Ah |
Кластер |
Номер первого отведенного кластера |
1Ch |
Размер |
Размер файла (4 байта) |
- Атрибуты файла
-
0x01 только для чтения»
0x02 «скрытый»
0x04 «системный»
0x08 ATTR_VOLUME_ID
0x10 каталог
0x20 «архивный»
- Имя файла
-
00 если запись свободна
05 если первый символ имени файла – E5
E5 если файл удален
2E запись родительского каталога
Чтение структуры каталогов
Исходя из вышеуказанных данных, для чтения структуры каталогов путем непосредственного использования данных файловой системы FAT12, необходимо реализовать следующий алгоритм:
- Считать загрузочный сектор диска, получить из него геометрию диска - размер сектора, количество секторов в кластере и т.д. (фактически размер сектора всегда равен 512 байт, а один кластер дискеты соответствует одному сектору).
- Считать FAT.
- Используя FAT, считать корневой каталог, выбрать из него (по атрибутам) записи подкаталогов.
- Для каждой записи подкаталога определить кластер, в котором находится подкаталог.
- Используя FAT, считать подкаталог, выбрать из него записи его подкаталогов и т.д.
