Операционные системы
Корневой каталог диска C:
Имя файла | … | Номер первого кластера, распределенного файлу |
autoexec. bat | … | 11 |
config. sys | … | 12 |
… | … | … |
FAT — таблица
… | 17 | 13 | FFFF | 00 | 00 | 00 | 18 | FFFF | 00 | … |
кластер | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 |
|
Пример распределения кластеров для файлов autoexec. bat b config. sys FAT — таблица может иметь 12- или 16-битовый формат. При этом в таблице для хранения информации об одном кластере диска используется соответственно 12 или 16 бит. 12-битовый формат удобен для дискет с небольшим количеством секторов — вся FAT — таблица помещается в одном секторе.
Первый байт FAT — таблицы называется описателем среды. Он имеет такое же значение, как и байт — описатель среды, находящийся в загрузочном секторе дика.
Следующие 5 байт для 12-битового формата или 7 байт для 16-битового формата всегда содержат значение 0FFh.
Остальная часть FAT таблицы состоит из 12- или 16-битовых ячеек. Каждая ячейка соответствует одному кластеру диска. Эти ячейки могут содержать следующие значения:
FAT12 | FAT16 | Тип кластера |
000h | 0000h | Свободный кластер |
FF0h-FF6h | FFF0h-FFF6h | Зарезервированный кластер |
FF7h | FFF7h | Плохой кластер |
FF8h-FFFh | FFF8h-FFFFh | Последний кластер в списке |
002h — FEFh | 0002h-FFEFh | Номер следующего кластера в списке |
Обычно FAT — таблица располагается после загрузочного сектора. Для точного определения начального сектора FAT — таблицы следует прочитать в память загрузочный сектор и проанализировать содержимое блока параметров BIOS. В поле ressect записано количество зарезервированных секторов, которые располагаются перед FAT. Поле fat_size содержит размер FAT в секторах. Кроме того, следует учитывать, что на диске может находиться несколько копий FAT. Операционная система использует только первую копию FAT, но обновляет вторую. Вторая копия нужна для утилит восстановления содержимого диска. Количество копий FAT находится в поле fat_cnt загрузочного сектора.
Общая схема использования FAT такова:
Получаем номер первого кластера файла, для которого необходимо определить его расположение на диске.
Используем номер первого кластера как индекс в FAT — таблице для извлечения номера следующего кластера.
Повторяем предыдущую процедуру до тех пор, пока извлеченное из FAT — таблицы значение не будет соответствовать концу файла.
Процедура извлечения номера кластера из FAT — таблицы зависит от формата FAT — таблицы.
16-битовую FAT — таблицу можно представить как массив 16-битовых чисел. Для определения номера следующего кластера надо просто извлечь 16-битовое значение из FAT — таблицы, использовав в качестве индекса номер предыдущего кластера.
Для 12-битовой FAT таблицы процедура значительно сложнее. Необходимо выполнить следующие действия:
умножить номер начального кластера на 3;
разделить результат на 2;
прочитать 16-битовое слово из FAT — таблицы, используя в качестве смещения значение, полученное после деления на 2;