использовать лишь часть первого из двух секторов. Однако, пространство на
двухсторонних дискетах теряется ничуть не больше чем на одностронних.
Выделение пространства кластерами большими одного сектора позволяет
ограничить увеличение размеров таблицы размещения файлов при использовании
дискет все больших и больших размеров.
Раздел данных дискеты начинается сразу за справочником и занимает все
место до конца дискеты. Первый кластер данных имеет номер 2 (почему это
так, Вы сейчас поймете). На рис.5.5 изображено расположение кластеров на
одно и двухсторонних дискетах.
Как на односторонних, так и на двухсторонних дискетах хранится две
копии ТРФ. Они находятся в секторах 2 и 3 нулевой дорожки нулевой стороны.
Предполагается, что эти копии должны быть идентичны. Хранение двух
экземпляров ТРФ представляет собой простую предосторожность, связанную с
большой важностью информации, содержащейся в таблице. Восстановление
запорченного справочника намного проще восстановления поврежденной ТРФ.
Полезность хранения двух копий ТРФ зависит от многих факторов, таких
как степень возможного повреждения дискеты, степень совершенства программ
или квалификация пользователей, выполняющих процедуры восстановления
информации. Версии ДОС, предшествовавшие версии 2.00, не включали
специальных средств восстановления информации на дисках.
Как мне кажется, для ТРФ выделено два сектора не столько для того
чтобы хранить две копии, сколько для обеспечения возможности увеличения
этой таблицы в будущем. Она, конечно, не может увеличиваться до
бесконечности, но два сектора позволяют увеличить ее объем вдвое.
Теперь можно подробно рассмотреть кодировку ТРФ. Простой подсчет
показывает, что на дискете помещается больше 300 кластеров. Элемент ТРФ
должен позволять хранить номер другого элемента ТРФ, а максимальный номер,
который может храниться в одном байте - 255, следовательно, длина элемента
ТРФ должна быть больше байта. С другой стороны, в 512-байтном секторе
нельзя поместить больше 300 элементов ТРФ длиной по два байта. Для решения
этой проблемы была разработана довольно сложная схема оформления элементов
ТРФ в виде трех шестнадцатиричных цифр, т.е. длиной в полтора байта (12
разрядов).
Схема хранения чисел в виде полуторабайтных кодов выглядит довольно
странно, хотя на машинном языке это реализуется очень просто.
Таблица при хранении сворачивается следующим образом:
последовательные элементы ТРФ разбиваются на пары, обьединяющие два 1,5
байтовых значения, в последовательность из трех байтов для каждой пары
/Здесь используется архитектурная особенность микропроцессоров фирмы
"Интел", связанная с последовательностью хранения отдельных байтов в
машинном слове (Прим.пер.)/. Для получения значения, хранящегося в
элементе ТРФ с номером Х, нужно выполнить следующие действия: сначала
необходимо умножить Х на 1.5 (для этого выполняется умножение на 3 с
последующим делением на 2), затем полученное число используется в качестве
смещения в ТРФ.
Двухбайтное число, хранящееся по указанному адресу загружается в
регистр. Теперь в регистре находится четыре шестнадцатиричных цифры, а
необходимы только три из них. Если номер элемента ТРФ нечетный, то нужно
отбросить последнюю цифру, а если он четный - то первую. Если описание Вам
не совсем понятно,взгляните на рис. 5.6, который изображает процессы
упаковки и распаковки пар элементов ТРФ, выполняемые вручную.
Рис.5.7 показывает связь между ТРФ в том виде, в каком она хранится
на диске, и ТРФ в виде таблицы. ДОС переписывает ТРФ в память, но хранит
ее в исходном, упакованном формате. Таблица ТРФ, показанная на рис.5.7,
представляет собой логическую структуру ТРФ.
Чтобы увидеть ТРФ в исходном виде, воспользуйтесь программами DEBUG
или DISKLOOK для считывания ТРФ с дискеты. О программе DEBUG мы подробнее
расскажем в главе 6, а пока приведем те команды, которые нужно ввести для
считывания ТРФ:
L0011
DOL200
При работе с программой Disklook, нажмите функциональную клавишу F7
для выбора сектора, введите номер дорожки 0, номер сектора 2, после чего
нажмите клавишу F6 для отображения всей таблицы.
Листинг программы 5.1 показывает определение на языке Паскаль той
структуры, в которой ТРФ хранится на диске. Листинг 5.3 включает несколько
программ для чтения, расшифровки и обслуживания ТРФ.
Вспомним, что нумерация кластеров начинается с 2. Это означает, что
первые два элемента ТРФ (с номерами 0 и 1) не используются для хранения
информации о размещении данных. Они зарезервированы для хранения очень
важной информации - сведений о формате дискеты. Код формата хранится в
первом байте ТРФ. Соответствие кодов различным форматам приведено в
следующей таблице:
ФОРМАТ КОД ФОРМАТА
_________________________
D - 8 FF
S - 8 FE
D - 9 FD
S - 9 FC
QD - 9 F9
QD - 15 F9
_________________________
Управляющие программы определяют формат дискеты путем чтения первого
байта ТРФ. Программа, находящаяся в загрузочной записи, обращается к ТРФ
еще и для того, чтобы определить где находятся два системных файла,
IBMBIO.COM и IBMDOS.COM. С этим связаны различия в загрузочных программах
ДОС версии 1.00 и версии 1.10.
Простые арифметические вычисления показывают, что на односторонней
дискете находится 313 односекторных кластеров (со 2 по 314), а на
двухсторонней дискете - 315 двухсекторных кластеров. Для односторонней
дискеты такое число получается вычитанием из общего числа в 320 секторов 1
сектора загрузочной записи, 2 секторов ТРФ и 4 секторов справочника. Для
двухсторонних дискет, из общего числа 640 секторов вычитается 1 сектор
загрузочной записи, 2 сектора ТРФ и 7 секторов справочника, что дает 630
секторов или 315 двухсекторных кластеров. В одном 512-байтовом секторе
можно разместить 340 элементов ТРФ, так что в конце секторов ТРФ остается
немного свободного места.
В листинге программы 5.3 приведены процедуры на языке Паскаль,
работающие с ТРФ. Эти процедуры могут быть использованы в больших
программах. Их изучение поможет вам лучше разобраться в структуре ТРФ и в
ее использовании.
Но это еще не все, что касается ТРФ. В этой таблице используются
определенные коды специального назначения. Как мы уже видели,
неиспользуемый кластер в ТРФ отмечается нулевым значением соответствующего
элемента. Любое значение элемента таблицы в диапазоне от 2 до 314 (для
односторонних дискет) или до 316 (для двухсторонних) является допустимым
указателем на очередной элемент в цепочке, описывающей размещение файла.
Восемь наибольших значений, которые могут храниться в элементе ТРФ,
шестнадцатиричные числа от FF8 до FFF или десятичные от 4088 до 4095,
используются для обозначения конца цепочки описания. Хотя необходим всего
один код конца файла, резервируется восемь кодов на случай, если возникнет
необходимость в каком-либо расширении. Восемь шестнадцатиричных кодов от
FF0 до FF7 или десятичных от 4080 до 4087 оставлены для обозначения особых
типов зарезервированных кластеров, например, кластеров с дефектными
секторами.
На поверхности дискеты могут встречаться участки с дефектами
магнитного покрытия, которые нельзя эффективно использовать для хранения
данных. Такие области выявляются во время форматирования дискеты и
исключаются из числа областей, которые будут использоваться в дальнейшем.
В первой версии ДОС 1.00, эти дефектные сектора оформлялись в виде
скрытого файла с именем "badtrack.". Начиная с версии ДОС 1.10
используется более изящный метод.
Значение элемента ТРФ 4087 (или шестнадцатиричное FF7) используется
для обозначения неиспользуемого кластера. Одно из достоинств такого метода
пометки дефектных кластеров заключается в том, что не используется лишний
элемент справочника. Программа DiskLook может быть использована для
определения точного положения дефектных секторов на дискете, чего нельзя
сделать стандартными средствами ДОС.
Любые другие значения элементов ТРФ, от 314 (или 316) до 4080,
являются недопустимыми.
В организации ТРФ могут возникать определенные дефекты. Два наиболее
заметных дефекта - это "беспризорные" кластеры и перекрещивающиеся файлы.
Если элемент ТРФ содержит значение, указывающее, что элемент используется
(значение не равно нулю) и, в то же время, этот элемент не входит ни в
одну из цепочек определения размещения файлов, то такой элемент ТРФ
становится как бы "беспризорным". Во втором случае, может случиться так,
что две или больше различные цепочки, определяющие размещение файлов,
приводят к одному и тому же кластеру. Такие файлы называются
перекрещивающимися. Стандартная программа ДОС СНКDSK обнаруживает оба типа
нарушений в структуре ТРФ и возвращает "беспризорные" кластеры в общий пул
свободных и доступных для использования кластеров.
"Беспризорные" кластеры чаще всего возникают, когда программы
начинают создавать файл (так что для него выделяются кластеры), но не
закрывают его, вследствие чего не завершается создание элемента
справочника для данного файла. Такое часто происходило с первой версией
компилятора языка Паскаль в ДОС при обнаружении ошибки в исходной
программе. Регулярное использование программы СНКDSК позволит избавляться
от "беспризорных" кластеров, независимо от причин их появления. Нужно
включать вызов СНКDSK в файл пакетной обработки с любой программой, в
результате работы которой могут возникать "беспризорные" кластеры.
Если "беспризорные" кластеры встречаются достаточно часто, то
перекрещивающиеся файлы возникают очень редко. Мне довелось их наблюдать
только тогда, когда я специально их создавал. Если такая ситуация все же
Вам встретится, нужно скопировать каждый из файлов на другую дискету для
последующего восстановления (если оно потребуется). После этого, копии
всех файлов будут содержать информацию из общих секторов, хотя она может
принадлежать только одному из них.
Нажав клавишу F9 при работе с программой Disklook Вы можете
просмотреть карту диска с отмеченным на ней положением "беспризорных"
кластеров и общих кластеров пересекающихся файлов.
При работе ДОС в памяти хранится копия ТРФ для каждого используемого
дисковода. Когда в таблице производится какое-либо изменение, она
записывается в обе копии на дискете. При новом обращении к дискете ДОС
считывает ТРФ чтобы установить формат дискеты.
Теперь, познакомившись со структурами справочников и таблиц
размещения файлов, можно рассмотреть форматы файлов данных. Сначала
рассмотрим два наиболее распространенных формата: текстовые файлы ( в
кодах ASCII) и формат файлов с фиксированной длиной записи. Затем мы
рассмотрим два формата хранения программ: ".COM" файлы и ".EXE" файлы.
5.8. Размещение файлов
Теперь можем рассмотреть метод выделения секторов данных для файлов.
Этот метод довольно прост.
При записи на дискету данных файла для нее по одному выделяются
кластеры секторов дискеты. Когда необходим очередной кластер для данных,
то выбирается доступный кластер с наименьшим номером. Такая простая схема
используется как при создании файла, так и при его удлинении (путем