Операционные системы

Корневой каталог диска 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;