Главная » Ассемблер, Железо » Назначение и внутренняя организация таблиц размещения файлов

0

Размер файла, вообще говоря, не является постоянной величиной и может изменяться (обычно — увеличиваться) со временем. Если допускается хранение файла только в смежных (последовательно расположенных) секторах, то при увеличении размера файла операционная система должна полностью перезаписывать его в другую (свободную) область диска подходящего объема. Чтобы упростить и ускорить выполнение операции добавления новых данных в файл, в современных операционных системах применяются таблицы размещения файлов (File Allocation Table, сокращенно FAT), позволяющие хранить файл в виде нескольких несмежных участков. При использовании FAT область данных логического диска разделена на участки одинакового размера — кластеры. Кластер может состоять из одного или нескольких последовательно расположенных на диске секторов. Число секторов в кластере должно быть кратно 2n и может принимать значения от 1 до 64 (размер кластера зависит от типа используемой системы FAT и объема логического диска).

Каждому кластеру поставлен в соответствие собственный элемент таблицы FAT. Первые два элемента FAT являются резервными — если на диске имеется CountOfClusters кластеров данных, то число элементов таблицы будет равно CountOfClusters+2. Тип FAT опре-1 деляется значением CountOfClusters:

•            если CountOfClusters < 4085, то используется система FAT 12;

•       если 4084 < CountOfClusters < 65525, то используется система FAT16;

•           если 65524 < CountOfClusters — используется система FAT32.

Названия типов FAT ведут свое происхождение от размера элемента: элемент FAT 12 имеет размер 12 бит (1,5 байта), FAT 16 — 16 бит (2 байта), FAT32 — 32 бита (4 байта). Следует учитывать, что в FAT32 четыре старших двоичных разряда зарезервированы и игнорируются в процессе работы операционной системы (то есть

значащими являются только семь младших шестнадцатеричных разрядов элемента).

Каждому файлу, находящемуся в области данных диска, соответствует цепочка элементов FAT — упорядоченный однонаправленный список (рис. 6.2). Поскольку список однонаправленный, он обеспечивает только движение вперед — если вы захотите вернуться к предыдущему кластеру, вам придется снова проводить поиск с самого начала списка.

Рис. 6.2. Вид начальных фрагментов для FAT различных типов

В каталоге файлов для каждого файла приводится номер начального элемента в таблице FAT, соответствующий первому кластеру файла. Если файл содержит более одного кластера, то указанный элемент содержит номер элемента FAT, соответствующего следующему кластеру файла. Последний элемент списка содержит признак конца файла (End Of Clasterchain, сокращенно ЕОС), который в FAT12 может принимать значения от FF8h до FFFh, в FAT16 — значения FFF8h—FFFFh, в FAT – значения FFFFFF8h—FFFFFFFh (табл. 6.35). Операционные системы Microsoft всегда применяют для ЕОС значения FFFh, FFFFh и FFFFFFFh соответственно, однако дисковые утилиты других фирм могут использовать и иные допустимые значения.

Таблица 6.35. Значения специальных кодов элементов FAT

Значение кода

FAT12

FAT16

FAT32

Свободный кластер

0

0

0

Дефектный кластер

FF7h

FFF7h

FFFFFF7h

Последний кластер в списке

FF8h-FFFh

FFF8h-FFFFh

FFFFFF8h-

 

 

 

FFFFFFFh

Кроме признака ЕОС, определены также специальные коды для свободного кластера (имеет значение 0 во всех типах FAT) и дефектного кластера (имеет значение FF7h в FAT12, значение FFF7h в FAT16 и значение FFFFFF7h в FAT32).

В документации Microsoft для элементов FAT используется принятое в языке программирования С обозначение элементов массивов. Значение, хранящееся в элементе FAT[0] (первом резервном элементе таблицы FAT) является сигнатурой. Для FAT 12 оно всегда равно FF8h, для FAT 16 – FFF8h, для FAT32 – FFFFFF8h. В FAT[1] (то есть во второй резервный элемент) при форматировании диска записывается код ЕОС. Кроме того, системы FAT 16 и FAT32 могут использовать два старших значащих разряда указанного элемента в качестве флагов. Флаг ClnShutBitMask занимает в системе FAT 16 двоичный разряд 15, а в системе FAT32 разряд 27. Если флаг ClnShutBitMask установлен в 1, то логический диск (том) является «чистым» (clean), если сброшен в 0 — «грязным» (dirty). Термин «грязный» означает, что работа с диском не была завершена надлежащим образом (например, по причине внезапного отключения электропитания) и при загрузке операционной системы должна быть выполнена процедура восстановления диска.

Флаг HrdErrBitMask служит признаком наличия сбоев при выполнении операций ввода-вывода. В системе FAT 16 он занимает двоичный разряд 14, а в системе FAT32 — разряд 26. При загрузке операционной системы (точнее, в момент монтирования тома) HrdErrBi tMask устанавливается в 1, но в случае возникновения сбоя при записи или считывании информации флаг сбрасывается в 0. Выполнять операции с элементами таблиц типов FAT16 и FAT32 очень легко, поскольку эти таблицы представляют собой массивы 16-разрядных и 32-разрядных слов соответственно. Работать с элементами FAT 12 менее удобно, так как для доступа к элементу массива приходится выполнять ряд вспомогательных действий. Порядок действий при извлечении элемента из FAT 12 описан ниже.

1.   Умножить номер элемента на 3.

2.   Разделить результат на 2.

3.    Извлечь из FAT 16-разрядное слово, используя в качестве адреса результат предыдущей операции.

4.    Если номер элемента четный, выполнить операцию AND над считанным словом и маской OFFFh. Если номер нечетный, сдвинуть считанное слово вправо на 4 разряда. В результате получаем искомое значение элемента FAT.

Теперь рассмотрим порядок действий при записи элемента в FAT 12.

1.     Умножить номер элемента на 3.

2.     Разделить результат на 2.

3.     Извлечь из FAT 16-разрядное слово, используя в качестве адреса результат предыдущей операции (адрес слова запомнить).

4.     Если номер элемента четный, выполнить операцию AND над считанным словом и маской OFOOOh, а затем операцию OR над полученным результатом и значением записываемого элемента. Если номер нечетный, выполнить операцию AND над считанным словом и маской OFOOOh, а затем сдвинуть значение элемента влево на 4 разряда и выполнить OR с результатом предыдущей операции.

5.     Записать полученное 16-разрядное слово обратно в FAT.

В программах, написанных на ассемблере, для выполнения умножения на 3 вместо команды MUL часто применяется алгоритм «сдвиг и сложение»: исходное число копируется, над копией числа выполняется сдвиг влево на один разряд (умножение на 2), а затем оба числа складываются (х + 2х = Зх). Вместо команды DIV при делении на 2 используется сдвиг вправо на один разряд. Элемент FAT содержит номер кластера, но при работе с дисками на низком уровне адресуемой единицей данных является сектор, а не кластер. Номер начального сектора кластера SectorNum связан с номером кластера CI usterNum следующей формулой: SectorNum = Data_StartSect + (ClusterNum-2)x BPB_SecPerClus В документации Microsoft приводятся также следующие примечания относительно FAT.

•       Данные в последнем секторе FAT не обязательно полностью принадлежат FAT — конец сектора, не относящийся к FAT, может содержать произвольные данные. Последний элемент FAT имеет номер, равный CountOfClusters+1 (как сказано выше, нумерация ведется с нуля, и в начало таблицы добавлены два резервных элемента).

•       Последний сектор FAT должен вычисляться по значению Count- OfClusters+1. Использовать с этой целью значения BPB_FATSzl6 и BPB_FATSz32 нельзя.

Источник: Кулаков В. К90 Программирование на аппаратном уровне: специальный справочник (+дискета). 2-е издание. — СПб.: Питер, 2003. — 847 е.: ил.

По теме:

  • Комментарии