Смекни!
smekni.com

Организационно-методические указания по проведению занятия (стр. 3 из 7)

Итак, FAT - массив информации об использовании кластеров диска, который содержит односвязные списки кластеров, распределенных файлам. Номера начальных кластеров файлов хранятся в каталогах.

На рис.6.9 показаны фрагменты корневого каталога диска С: и элементы FAT для файлов autoexec.bat и config.sys. Реально эти файлы не используют столько кластеров. Из рисунка видно, что в каталоге для файлов указаны номера первых кластеров (соответственно 11 и 27). Таблица FAT в одиннадцатой ячейке содержит число 12 - номер следующего кластера, распределенного файлу autoexec.bat . Ячейка с номером 12 содержит число 13, и так далее. Последняя ячейка, соответствующая последнему кластеру, распределенному этому файлу, содержит специальное значение - FF. В этом примере все кластеры файлов расположены подряд, но это может быть и не так.

В DOS существуют два формата FAT - 12-битовый и 16-битовый. Эти форматы используют соответственно 12 и 16 битов для хранения информации об одном кластере диска.

12-битовый формат удобен для дискет с небольшим количеством секторов - вся таблица размещения файлов помещается целиком в одном секторе. Если размер диска такой, что для представления всех секторов двенадцати разрядов недостаточно, можно увеличить размер кластера, например до восьми секторов. Однако большой размер кластера приводит к неэффективному использованию дискового пространства. Это происходит из-за того, что минимальный выделяемый файлу элемент (кластер) имеет слишком большой размер. Даже для файла, имеющего длину 1 байт, выделяется целиком кластер. Значит, если размер кластера составляет 8 секторов, то для хранения 1 байта будет использовано 4 килобайт дисковой памяти.

Сектор загрузочной записи (BOOT-сектор) диска, отформатированного в DOS версии 4.0 и выше, в поле со смещением 36h содержит 8-байтовую строку, идентифицирующую формат FAT. Она имеет вид «FAT12» или «FAT16».

Если разделы на жестком диске создавались утилитой DOS FDISK, формат FAT можно определить, анализируя содержимое поля sys главной загрузочной записи (Master Boot Record). Если это поле содержит значение 1, используется 12-битовый формат, если 4 - 16-битовый.

Опишем подробно формат FAT16.

Первый байт FAT называется «Описатель среды» (Media Descriptor) или байт ID идентификации FAT. Он имеет такое же значение, как и байт-описатель среды, находящийся в ВООТ-секторе логического диска.

Следующие 7 байт для 16-битового формата всегда содержат значение Offh.

Основная часть FAT состоит из 16-битовых ячеек, каждая ячейка соответствует одному кластеру диска. Эти ячейки могут содержать следующие значения (см. табл.6.9).

Таблица 6.9.

Формат основной части FAT16

FAT16

Что означает

0000h

fff0h-fff6h

fff7h

fff8h-ffffh

0002h-ffefh

Свободный кластер Зарезервированный кластер Плохой кластер Последний кластер в списке Номер следующего кластера в списке

Непосредственный доступ к FAT может потребоваться вам для организации сканирования каталогов для поиска нужных файлов, для чтения каталогов как файлов, для организации защиты информации от несанкционированного копирования.

Процедура извлечения номера кластера из FAT зависит от формата таблицы размещения файлов. 16-битовую FAT можно представить как массив 16-битовых чисел. Для определения номера следующего кластера вам надо просто извлечь 16-битовое значение из FAT, использовав в качестве индекса номер предыдущего кластера.

Используя описанную выше методику чтения FAT, можно для каждого файла определить цепочку занимаемых им кластеров.

1.6.2.2.Файлы и каталоги

Файловая система DOS имеет древовидную структуру. В корневом каталоге располагаются 32-байтовые элементы, которые содержат информацию о файлах и других каталогах. Для чтения корневого каталога необходимо определить его расположение и размер.

Корневой каталог находится сразу за последней копией FAT. Количество секторов, занимаемых одной копией FAT, находится в блоке параметров BIOS и ВООТ-секторе в поле fatsize, количество копий FAT - в поле fatcnt блока ВРВ. Следовательно, перед корневым каталогом находится один ВООТ-сектор и (fatcnt * fatsize) секторов таблицы размещения файлов FAT.

Размер корневого каталога можно определить, исходя из значения поля rootsize. В этом поле при форматировании диска записывается максимальное количество файлов и каталогов, которые могут находиться в корневом каталоге. Для каждого элемента в каталоге отводится 32 байт, поэтому корневой каталог имеет длину (32 * rootsize) байт.

Корневой каталог занимает непрерывную область фиксированного размера. Размер корневого каталога задается при форматировании и определяет максимальное количество файлов и каталогов, которые могут быть описаны в корневом каталоге. Для определения количества секторов, занимаемых корневым каталогом, можно воспользоваться следующей формулой:

RootSecs = (32 * rootsize) / sectsize.

В этой формуле sectsize - размер сектора в байтах, он может быть получен из соответствующего поля ВООТ-сектора.

После корневого каталога на логическом диске находится область файлов и подкаталогов корневого каталога. В табл.6.10 изображены все области логического диска. Такую структуру имеют логические диски, расположенные в разделах жестких дисков, а также дискеты.

Таблица 6.10.

Структура логического диска

Область логического диска

Номер начального сектора на логическом диске

ВООТ-сектор и зарезервированные секторы 0
Первая копия FAT ressecs - количество резервированных секторов
Вторая копия FAT ressecs + fatsize
Корневой каталог ressecs + (fatsize * fatcnt)
Область данных ressecs + (fatsize * fatcnt) + (32 *rootsize) /sectsize

Область данных разбита на кластеры, причем нумерация кластеров начинается с числа 2. Кластеру с номером 2 соответствуют первые сектора области данных. Теперь можно привести формулу, которая позволит связать номер кластера с номерами секторов, занимаемых им на логическом диске:

SectNu = DataStart + ((ClustNu - 2) * clustsize),

где SectNu - номер первого сектора, распределенного кластеру с номером ClustNu; DataStart = ressecs + (fatsize * fatcnt) + (32 *rootsize) /sectsize); ClustNu - номер кластера, для которого необходимо определить номер первого сектора; clustsize - количество секторов, занимаемых кластером, находится в блоке параметров BIOS.

Любой каталог содержит 32-байтовые элементы - дескрипторы, описывающие файлы и другие каталоги. Приведем формат дескриптора (см. табл.6.11).

Таблица 6.11.

Формат дескриптора файла (каталога)

Смещение

Размер

Содержимое

(+0)

8

Имя файла или каталога, выровненное на левую границу и дополненное пробелами

(+8)

3

Расширение имени файла, выровненное на левую границу и дополненное пробелами

(+11)

1

Атрибуты файла

(+12)

10

Зарезервировано

(+22)

2

Время создания файла или время его последней модификации

(+24)

2

Дата создания файла или дата его последней модификации

(+26)

2

Номер первого кластера, распределенного файлу

(+28)

4

Размер файла в байтах

Байт атрибутов является принадлежностью каждого файла. Биты этого байта имеют следующие значения:

0 - файл предназначен только для чтения, в этот файл нельзя писать и его нельзя стирать;

1 - скрытый файл, этот файл не будет появляться в списке файлов, создаваемом командой операционной системы DIR;

2 - системный файл. Этот бит обычно установлен в файлах, являющихся составной частью операционной системы;

3 - данный дескриптор описывает метку диска. Для этого дескриптора поля имени файла и расширения имени файла должны рассматриваться как одно поле длиной 11 байт. Это поле содержит метку диска;

4 - дескриптор описывает файл, являющийся подкаталогом данного каталога;

5 - флаг архивации. Если этот бит установлен в 1, то это означает, что данный файл не был выгружен утилитой архивации (например, программой BACKUP);

6-7 - зарезервированы.

Обычно файлы имеют следующие комбинации битов в байте атрибутов:

0 - обычные файлы (тексты программ, загрузочные модули, пакетные файлы);

7 - только читаемые, скрытые, системные файлы. Такая комбинация битов байта атрибутов используется для файлов операционной системы IO.SYS, MSDOS.SYS;

8 - метка тома. Дескриптор метки тома может находиться только в корневом каталоге логического диска;

10h - дескриптор, описывающий каталог;

20h - обычный файл, который не был выгружен утилитами BACKUP или XCOPY.

В любом каталоге, кроме корневого, два первых дескриптора имеют специальное назначение.

Первый дескриптор содержит в поле имени строку «..». Этот дескриптор указывает на содержащий его каталог. Т.е. каталог имеет ссылку сам на себя.

Второй специальный дескриптор содержит в поле имени строку «..». Этот дескриптор указывает на каталог более высокого уровня.

Если в поле номера первого занимаемого кластера дескриптора с именем «..» находится нулевое значение, это означает, что данный каталог содержится в корневом каталоге.