(F)FFF ¦
(X)XXX ¦Любое другое значение указывает номер клас-
¦тера в цепи, определяющей порядок размещения
¦файла
ДДДДДДДДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Почему существует два разных формата таблицы FAT? До того,
как была введена поддержка жестких дисков под управлением опера-
ционной системы MS-DOS (версия 2.0 операционной системы MS-DOS),
разработчики операционной системы MS-DOS старались минимизировать
размер памяти, необходимый для размещения таблицы FAT. Поскольку
максимальный размер кластеров для гибких дисков меньше числа 4085
(2847 кластеров на 1,44 Мегабайтных 3,5-дюймовых дисках), диско-
вое пространство будет тратиться напрасно, если будут использо-
ваться 16-битовые элементы таблицы FAT, а максимальное количество
кластеров, которое может быть отображено при 8-битовых элементах
будет равняться 255, что не отвечает требованиям использования
памяти. Поэтому для того, чтобы декодировать значения элементов
таблицы FAT, сначала нужно определить общее количество кластеров
на диске.
Обработка 12-битовых элементов таблицы FAT
Схема операционной системы MS-DOS размещения чисел, имеющих
1,5 байта в длину, в элементах таблицы FAT на гибких дисках может
показаться странной. Но надо знать, что операционная система
MS-DOS была спроектирована с целью быстрого декодирования этих
байтов. Способ, которым операционная система MS-DOS хранит инфор-
мацию в таблице FAT, заключается в зашифровке элементов таблицы
FAT парами, в которых два 1,5-байтовых элемента объединены в не-
большую 3-байтовую пару. Если мы хотим определить номер кластера
в элементе 2 таблицы FAT, мы также должны посмотреть на элемент 3
таблицы FAT. Если мы хотим посмотреть на номер кластера в элемен-
те 3 таблицы FAT, мы должны вернуться назад и посмотреть на эле-
мент 2 таблицы FAT. Элементы 4 и 5 таблицы FAT будут тоже сдвое-
ны, как и элементы 6 и 7, 8 и 9 и так далее. На рисунке 11-9
показано, как происходит кодирование номеров двух кластеров в па-
ру элементов таблицы FAT при просмотре отладчиком DEBUG номеров
так, как они представлены.
На рисунке 11-10 показано, как происходит кодирование номе-
ров двух кластеров из пары элементов таблицы FAT.
- 11-47 -
Если из номера кластера извлекается только три цифры, почему
же вторая по старшинству цифра номера первого кластера перестав-
ляется на место младшей цифры второго кластера? Схема перестано-
вок работает быстрее, когда машина сама декодирует байты и извле-
кает информацию. Цифры появляются уже в переставленном виде
только тогда, когда пользователь читает таблицу FAT через отлад-
чик DEBUG.
Для декодирования информации в 12-битовых элементах таблицы
FAT на бумаге или внутри программы нужно пользоваться представ-
ленной ниже последовательностью действий:
1. Умножить номер элемента таблицы FAT или кластера на 1,5 байтов
(сначала умножайте число на 3, а потом делите результат на 2).
2. Используйте результат в качестве смещения в таблицу FAT, ука-
зывающий на элемент, отражающий только что использовавшийся
кластер. Этот элемент содержит номер следующего кластера, за-
нимаемого тем же файлом.
3. Загрузите слово (2-байтовое число), расположенное с этим сме-
щением, в регистр.
4. Теперь в регистре находятся четыре шестнадцатиричные цифры.
Поскольку нам нужно только три цифры для трехзначного элемента
таблицы FAT, следует определить, является ли номер элемента
таблицы FAT четным или нечетным числом.
Не
используется
/ \
ЪДДДД/ДДДДДДДД¬ \ДДДДДДДДДДДДДД¬
Первый ¦ / ¦ ¦ \ ¦ Второй
номер ¦ 0 1 2 3 ¦ ¦ 0 4 5 6 ¦ номер
кластера ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ кластера
АДДДД†ДД†ДД†ДДЩ АДДДДД†ДД†ДД†ДДЩ
АДД†ДД†ДДДДДДДДДДД¬ ¦ ¦ ¦
¦ ¦ ЪДДДДДДДД†ДД†ДД†ДДЩ
ЪД†ДД†ДД†ДДДВДДДД†ДД†ДД†Д¬
Первый ¦ ¦ ¦Второй
элемент ¦ 2 3 6 ¦ 1 4 5 ¦элемент
таблицы FATАДДДДДДДДДДДБДДДДДДДДДДДДЩтаблицы FAT
Трехбайтовая пара элементов таблицы FAT
Рис. 11-9. Кодирование номеров двух кластеров в пару
12-битовых элементов таблицы FAT
ЪДДДДДДДДДД¬ ЪДДДДДДДДДДД¬
Первый ¦ ¦ ¦ ¦ Второй
элемент ¦ 0 2 3 ¦ ¦ 0 0 0 ¦ элемент
таблицы FAT¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ таблицы FAT
АД†ДД†ДД†ДДЩ АДД†ДД†ДД†ДДЩ
¦ ¦ АДДДДДДДДДДД†ДД†ДД†ДД¬
ЪДД†ДД¦ДДДДДДДДДДДДДДЩ ¦ ¦ ¦
ЪДДДД†ДД†ДД†ДД¬ ЪДДДДД†ДД†ДД†ДД¬
Первый ¦ ¦ ¦ ¦ Второй
номер ¦ 0 0 0 2 ¦ ¦ 0 0 0 3 ¦ номер
кластера ¦ \ ¦ ¦ / ¦ кластера
АДДДД\ДДДДДДДДЩ /ДДДДДДДДДДДДДДЩ
\ /
Не используется
Рис. 11-10. Декодирование пары 12-битовых элементов
таблицы FAT в два номера кластера
- 11-48 -
5. Если номер элемента представлен четным числом, в регистре сле-
дует сохранять три младшие цифры путем выполнения операции ло-
гического сложения "И" со смещением 0FFF. Если номер элемента
представлен нечетным числом, следует сохранить три старшие
цифры путем сдвига регистра вправо на четыре бита командой
SHR.
6. Если результирующие три цифры представляют собой число от FF8
до FFF, это значит, что вы достигли конца файла. В противном
случае эти три цифры представляют собой номер следующего клас-
тера, занятого тем же файлом.
Обработка 16-битовых элементов таблицы FAT
Работа с номерами кластеров и элементами таблицы FAT на дис-
ках, которые используют 126-битовые элементы таблицы FAT, значи-
тельно облегчается по сравнению с работой, в которой используются
12-битовые элементы таблицы FAT, потому что все элементы таблицы
FAT здесь выровнены на границу слова, то есть, каждый элемент
таблицы FAT может считываться или записываться, как целое полное
слово. При этом не нужно заботиться о соседних элементах таблицы
FAT.
На рисунке 11-9 показано, как происходит кодирование номеров
двух кластеров в пару элементов таблицы FAT при просмотре отлад-
чиком DEBUG номеров так, как они представлены.
На рисунке 11-10 показано, как происходит кодирование номе-
ров двух кластеров из пары элементов таблицы FAT.
Для декодирования информации в 12-битовых элементах таблицы
FAT на бумаге или внутри программы нужно пользоваться представ-
ленной ниже последовательностью действий:
1. Получить начальный кластер файла из элемента каталога
2. Умножить используемый номер кластера на 2 (байта; 1 сло-
во).
3. Используйте результат в качестве смещения в таблицу FAT,
указывающий на элемент, отражающий только что использо-
вавшийся кластер. Этот элемент содержит номер следующего
кластера, занимаемого тем же файлом.
4. Загрузите слово (2-байтовое число), расположенное с этим
смещением, в регистр
5. Если результирующие четыре цифры представляют собой число
от FFF8 до FFFF, это значит, что вы достигли конца файла.
В противном случае эти четыре цифры представляют собой
номер следующего кластера, занятого тем же файлом.
Преобразование кластеров в логические сектора
Если вы пишете программу, которая будет обращаться к области
хранения данных на диске, вы найдете, что такие средства операци-
онной системы MS-DOS, как прерывание "int 25h" (Абсолютное считы-
- 11-49 -
вание с диска) и прерывание "int 26h" (Абсолютная запись на
диск), а также программа-отладчик DEBUG, требуют, чтобы вы указы-
вали номера логических секторов. Несмотря на то, что на иллюстра-
циях структур диска (см.рисунки 11-2 и 11-3) указывается первый
сектор диска, как сторона 0, дорожка 0, сектор 1, первый сектор в
действительности равняется логическому сектору 0. Все последующие
логические сектора представляют собой последовательные смещения
от 0. Таким образом, логический сектор 1 будет представляться,
как сторона 0, дорожка 0, сектор 2, а логический сектор 2 будет
представляться, как сторона 0, дорожка 0, сектор 3. Поскольку
каждый элемент таблицы FAT, согласно результатам, полученным пос-
ле выполнения указанных выше пяти действий, всегда создает номер
кластера, перечисленные ниже действия покажут вам, как нужно пре-
образовывать номер кластера в номер логического сектора:
1. Вычесть 2 из номера кластера.
2. Умножить полученный результат на количество векторов, ис-
пользуемых в кластере, следующим образом:
а. Для всех односторонних форматов гибких дисков или
для двухстороннего 80-трекового, 5,25-дюймового форма-
та диска повышенной плотности записи произвести умно-
жение на 1.
б. Для всех двухсторонних 40-трековых, 5,25-дюймовых фор-
матов дисков повышенной плотности записи произвести
умножение на 2.
в. Для двухсторонних 8-дюймовых гибких дисков повышенной
плотности записи произвести умножение на 4.
г. Для жестких дисков следует использовать одно из четы-
рех вышеприведенных значений или другое число, завися-
щее от формата диска.
3. Добавить результат к номеру логического сектора начала
области хранения данных.
Применяя соответствующую последовательность действий в пра-
вильном порядке, вы теперь можете перейти от элемента каталога к
элементу таблицы FAT, к номеру кластера, к номеру логического
сектора. А если есть такое средство, кому нужна операционная сис-
тема MS-DOS?! Вы и сами можете считывать файлы сектор за секто-
ром!
Обзор процедур восстановления
Если файл, находящийся на диске, был каким-то образом разру-
шен или поврежден, существует три основных способа его исправле-