Глава 5. Организация внешней памяти
ГЛАВА 5. ОРГАНИЗАЦИЯ ВНЕШНЕЙ ПАМЯТИ
[ Оглавление ]
Дискеты стали не только стандартным, но и самым
распространенным носителем программ и данных для персональных
компьютеров. В этой главе будут приведены все необходимые
сведения о дискетах, об особенностях их структуризации. Кроме
того, вы сможете кое-что узнать о защите от копирования.
Весь материал, приведенный в настоящей главе, относится
к семейству компьютеров IВМ/РС, совместимыми с ними
компьютерами, а также ко всем компьютерам, работающим под
управлением операционной системы МS-DOS. Другие компьютеры
могут использовать другие размеры дискет и форматы данных.
Как уже указывалось в предыдущей главе, начиная с версии
ДОС 2.00, подключение к системе дискет новых типов
осуществляется довольно просто. Схема выполнения этой
процедуры предполагает, что новые типы дисков используются
таким же образом, как те дискеты, которые были исходно
доступны для IBM/PC. Следовательно, вся информация,
изложенная в этой главе, может применяться и к тем новым
дисковым устройствам, которые будут добавлены в Вашу систему,
за исключением конкретных чисел, задающих специфические
функции.
5.1. Устройство гибкого машнитного диска (дискеты)
Гибкие диски, как известно, являются идеальным носителем
для внешней памяти персональных компьютеров, подобных IBM/PC.
Их размеры удобны, цена не высока и они достаточно надежны в
эксплуатации. При известной осторожности в обращении дискеты
очень редко портятся. Именно по этому дискеты стали наиболее
популярным носителем информации задолго до появления
компьютеров IBM/PC. Вполне естественно, что фирма ИБМ
обратилась к дискетам, выбирая носитель информации для своего
компьютера IBM/PC.
Кратко рассмотрим, что собой представляет сама дискета.
(Простая схема приведена на рис.5.1.) Дискета представляет
собой круглый кусок гибкого пластика, покрытый магнитным
окислом, напоминающим покрытие других известных магнитных
носителей, например, магнитных лент. Магнитные диски,
использующиеся на больших компьютерах, изготавливаются из
жестких металлических пластин, а для дискет используются
гибкие пластиковые кружки, что и дало им популярное название
"гибкие" или "флоппи" - диски. То, что эти диски были сделаны
гибкими, значительно уменьшило вероятность их повреждения при
обращении с ними и это в значительной мере определило их
успех.
Круглый диск с магнитным покрытием всегда помещен в
квадратный предохранительный конверт. Внутренняя поверхность
этого конверта покрыта слоем белого фетро-подобного
материала, помогающим в защите дискеты. Он служит как для
смягчения ударов, так и для улавливания пыли.
Квадратный предохранительный конверт, который по
неизвестной причине практически всегда имеет черный цвет,
имеет четыре отверстия, каждое из которых имеет свое
собственное назначение. Отверстие в центре предназначено для
захвата дискеты приводом дисковода. Через это отверстие
механизм дисковода захватывает гибкий диск, чтобы привести
его во вращение.
Второе отверстие в предохранительном конверте
представляет собой продолговатую прорезь, через которую
осуществляется доступ к дискете головок чтения/записи. Через
эту прорезь осуществляется процесс чтения и записи
информации.
Третье отверстие представляет собой небольшую дырочку
возле центрального отверстия. Это отверстие в конверте
позволяет следить за небольшим индексным отверстием в самой
дискете. Индексное отверстие используется для указания начала
и конца дорожки на дискете. Это индексное отверстие служит
для определения точки отсчета при чтении или записи
информации.Если Вы никогда не видели индексного отверстия,
осторожно поверните дискету внутри конверта, пока оно не
совместится с отверстием в конверте. В дискетах такого типа,
который используется в IBM/PC, это единственное отверстие в
пластиковом кружке.
Четвертое отверстие - квадратная прорезь на краю
предохранительного конверта - служит в качестве признака
защиты записи. Практически все магнитные носители используют
те или иные признаки защиты от записи. Если эта прорезь
открыта, то запись на эту дискету может выполняться
дисководом, если же она закрыта, то дискета защищена от
записи. В конвертах некоторых дискет вообще нет такой
прорези, что полностью исключает возможность случайного
стирания записанных на ней данных. Отсутствие прорезей защиты
записи характерно для многих дискет с программным
обеспечением IBM/PC, в частности, с самой операционной
системой ДОС. Эти дискеты записываются на специальных
дисководах, игнорирующих признак защиты записи.
Не следует, однако, считать, что заклеив прорезь защиты
записи Вы полностью защитите свои дискеты от случайного
стирания. Закрытая прорезь говорит только о том, что
правильно работающий дисковод не будет пытаться выполнять
запись на такую дискету. Неисправный дисковод может делать
все что угодно, независимо от наличия или отсутствия признака
защиты. Конечно, маловероятно утратить данные именно таким
образом, но все же это может произойти.
5.2. Форматы хранения информации
Данные на дискете размещаютя по "дорожкам". Дорожка -
это замкнутая окружность на поверхности дискеты, размещенная
на определенном растоянии от центрального отверстия.
Стандартный формат дискеты для IBM/PC имеет 40 дорожек.
Каждая дорожка разделена на части, называемые
"секторами" или "записями". Сектора представляют собой
основную единицу хранения информации на дискете. При чтении
или записи устройство считывает или записывает всегда целый
сектор, независимо от объема запрашиваемой информации
несмотря на отсутствие огрничений. Хотя Вы, точнее Ваши
программы, могут организовывать свои данные в единицах
произвольного размера, компьютер и дисковод всегда работают с
секторами, что, как правило, скрыто от пользователя.
Термин "запись" иногда используется в том же смысле, что
и "сектор". Лучше будет оставить слово "запись" для
обозначения логических единиц хранения информации в наших
программах и использовать слово "сектор" для обозначения
физической единицы хранения информации на дискете.
Данные могут размещаться как на одной стороне дискеты,
так и на двух сторонах. Схема размещения секторов на дискете
показана на рис. 5.2.
Сейчас нужно ненадолго прерваться и договориться о
терминологии. Дискета имеет одну или две стороны; на каждой
стороне по 40 дорожек; по восемь секторов на дорожке и по 512
байт в каждом секторе. Как к ним обращаться? В этой книге
будет использоваться способ нумерации, принятый во всех
руководствах фирмы "ИБМ", хотя он и несколько противоречив.
Стороны нумеруются как 0 и 1, односторонняя дискета имеет
только сторону с номером 0 . Дорожки нумеруются с 0 по 39 ;
причем дорожка 0 находится ближе всего к внешнему краю
дискеты, а дорожка 39 ближе к центру. Начало дискеты
находится на нулевой дорожке. Сектора, похоже просто чтобы
сделать их в чем-то отличающимися, нумеруются с 1 по 8. Таким
образом, первый сектор диска имеет номер 1 и располагается на
нулевой дорожке нулевой стороны.
Данные внутри сектора размещаются и адресуются
произвольно. Если пользоваться смещениями, то для первого
байта смещение будет равно нулю, для второго - единице, и так
далее. В дальнейшем мы будем обращаться к данным как по
смещению (начиная с 0), так и по порядковому номеру (начиная
с 1), как в конкретном случае будет удобнее.
Сектора на дискете имеют определенную последовательность
и, когда это возможно, они используются в этой
последовательности. Последовательность начинается с самого
первого сектора на дискете, за которым следуют остальные
сектора этой же дорожки (нулевой) со второго по восьмой. У
двухсторонних дискет за восьмым сектором нулевой стороны
следует первый сектор той же дорожки, но первой стороны. Как
при одностороннем, так и при двухстороннем формате дискет за
последним сектором одной дорожки следует первый сектор
следующей дорожки.
Вы, вероятно, уже заметили, что на двухсторонних
дискетах прежде чем переходить к очередной дорожке,
изменяется сторона, так что используется одна дорожка на
обеих сторонах, прежде чем система перейдет к следующей
дорожке. Таким образом, получается, что лучше было бы
использовать при обращении к конкретному сектору
последовательность дорожка-сторона-сектор, а не -
сторона-дорожка-сектор, поскольку они используются именно в
таком порядке. Тем не менее, во всех руководствах фирмы "ИБМ"
обычно указывают сектор, задавая сторону, потом дорожку, а
потом номер сектора и мы тоже будем пользоваться такой же
последовательностью.
5.3. Типы дмскет и проблемы защиты от копирования
Типов дискет насчитывается значительно больше, чем
используется семейством компьютеров IBM/PC. Рассмотрим эти
типы, чтобы лучше понимать, что именно используется для
IBM/PC.
Обычные гибкие диски имеют один из двух размеров.
Больший формат имеет диаметр 203 мм (8 дюймов), а меньший -
133 мм (5,25 дюйма). Недавно появившиеся так называемые
"микро-флоппи", диаметром 89 мм (3,5 дюйма), заключены в
твердую упаковку и, строго говоря, не являются гибкими
дисками.
Компьютеры IBM/PC, подобно большинству персональных
компьютеров, используют мини-диски диаметром 133 мм (5,25
дюйма), а компьютер IBM Displaywriter (довольно близкий к РС
по своим характеристикам) использует больший формат.
Еще одной характеристикой дискеты, является плотность
записи. В сфере персональных компьютеров используются
различные плотности записи, а существующая терминология не
всегда понятна. Стандартные дискеты, используемые IBM/PC,
имеют плотность записи, называемую двойной, что позволяет
записывать и считывать 40 дорожек данных на поверхности
дискеты. Другой использующийся формат называется учетверенной
плотностью, что на том же пространстве позволяет иметь 80
дорожек. Иногда плотность записи обозначается в количестве
дорожек на дюйм. Двойная плотность, нормальная для IBM/PC,
составляет 48 дорожек на дюйм (48 ТРI), а учетверенная
плотность составляет 96 дорожек на дюйм (96 ТРI).
Существует два способа разбивки (разметки) дорожек на
сектора. Один из них называется фиксированным или аппаратным,
а второй - программным. Если размер сектора задан жестко и
определяется механическими характеристиками устройства, то
такая разметка называется фиксированной. При фиксированной
разметке индексные отверстия, расположенные по кругу,
обозначают начало каждого сектора и, следовательно, его
положение на дискете точно определено. Альтернативой для
такой разметки служит программная разметка.
Для стандартных дисков персональных компьютеров,
размером 133 мм (5,25 дюйма), расположение дорожек на диске и
число сторон определяются характеристиками самих дисков и
дисководов и, по существу, являются неизменными. Однако,
количество секторов на дорожке и их размер определяются
программно, в процессе форматирования. Именно поэтому гибкие
диски называют дисками с программной разметкой секторов
(soft-sector). Форматирование (определение характеристик
секторов) выполняется либо программами операционной системы,
либо базовой системы ввода/вывода (BIOS).
Размер сектора 133 мм диска, поддерживаемого системой
BIOS, может составлять 128, 256, 512, и 1024 байта. ДОС
(версий 1.ХХ-3.1) ориентирована на использование секторов,
размером 512 байт.
В ранних версиях ДОС использовалось ограниченное число
дисковых форматов. Начиная с версии 2.00 и во всех
последующих используется четыре основных формата. Различие
между форматами определяется числом используемых сторон диска
и числом секторов на дорожке: одно- или двухсторонний диск и
8 или 9 секторов на дорожке.
---------------------------------------------------------------
Обозначение Кол-во Количество Количество Объем
сторон секторов дорожек (Кбайт)
---------------------------------------------------------------
S-8 1 8 40 160
D-9 2 8 40 320
S-9 1 9 40 180
D-9 2 9 40 360
--------------------------------------------------------------
Причина существования чеиырех различных форматов проста,
фирма хочет быть уверена, что все версии ДОС смогут
поддерживать программы, разработанные для любых, самых ранних
версий.
Первые модели IBM/PC оснащались односторонними гибкими
дисками. Впоследствии начали выпускаться дисководы для
двухсторонних дисков.
В ранних версиях ДОС на каждой дорожке размещалось
восемь 512-байтных секторов, хотя на той же дорожке можно
легко разместить и десять. Позже установили, что достаточно
надежно размещать на дорожке девять секторов, после чего
девятисекторный формат стал стандартным.
Увеличение числа форматов тесно связано с развитием
операционной системы ДОС. Первоначальная версия ДОС
поддерживала всего один формат, который я обозначил как S-8.
В следующей версии появился формат D-8. В версию 2.00 были
включены девятисекторные форматы S-9 и D-9. В версии 2.10
новых форматов не появилось, а в версию 3.0 был включен
формат с учетверенной плотностью записи, который будет кратко
рассмотрен несколько позже.
Широкое применение получили только два формата: S-8 и
D-9. Формат S-8 является как бы наименьшим общим делителем,
он традиционно используется для коммерческих программ, что
гарантирует ее считывание в любой версии ДОС.
Форматы с учетверенной плотностью записи
------------------------------------------
Как читатель уже наверное обратил внимание, все четыре
стандартных формата имеют одинаковое количество дорожек. Во
всех этих форматах используется по 40 дорожек. Это связано с
тем, что дисководы, наиболее часто использовавшиеся в
семействе машин IBM/PC, разрабатывались для чтения/записи
сорока дорожек. Некоторые дисководы с 133-мм дисками и
практически все дисководы для 89-мм (3,5 дюйма) дисков
позволяют записывать 80 дорожек. Они получили название
устройств с учетверенной плотностью записи. Среди форматов,
использующихся такими устройствами, наибольшее
распространение получили форматы QD-9 и QD-15.
_______________________________________________________________
Обозначение Количество Количество Количество Объем
сторон секторов дорожек (КБайт)
_______________________________________________________________
QD-9 2 9 80 720
QD-15 2 15 80 1200
_______________________________________________________________
Формат QD-9 отличается от D-9 только удвоенным числом
дорожек. Формат QD-9 чаще всего используется не для
стандартных 133-мм дисков, а для 89-мм (3,5 дюйма) микро-
дисков. Дисководы с учетверенной плотностью записи могут
подключаться к обычному компьютеру IBM/PC как нестандартные
устройства, если включить в ДОС соответствующий драйвер.
Предполагается, что этот формат будет использоваться очень
широко в самом ближайшем будущем.
Формат большой емкости QD-15, используемый в компьютере
IBM/PC модели АТ, имеет в каждой из 80 дорожек по 15
секторов, размером 512 байт. Это стало возможным благодаря
использованию в компьютере АТ специальных дискет, магнитное
покрытие которых отличается от обычного. Только при условии
использования этих дисков и специальных дисководов может
применяться такой формат.
Формат жесткого диска
---------------------
Накопители на жестких магнитных дисках большой емкости,
такие как 10-мегабайтный жесткий диск компьютера ХТ или
20-мегабайтный диск компьютера АТ, имеют собственные форматы,
на которых необходимо остановиться особо.
Любой диск имеет физический и логический формат.
Физический формат диска определяет размер сектора (в байтах),
число секторов на дорожке (или в цилиндре - для жестких
дисков), число дорожек (цилиндров) и число сторон. Логический
формат диска определяет способ организации информации на
диске и фиксирует размещение информации различных типов.
В отличие от гибких дисков, физический и логический
формат которых устанавливается в процессе форматирования
дискеты, жесткие диски поступают к потребителю с определенным
физическим форматом, который устанавливается в процессе
изготовления диска. Логическая структура жесткого диска
устанавливается пользователем, причем это должно быть сделано
прежде чем начнется использование диска операционной
системой.Установка логической структуры диска выполняется в
два этапа. Во-первых, жесткий диск можно разбить на части,
каждая из которых может использоваться своей операционной
системой. Далее, каждую из этих частей необходимо
отформатировать в соответствии с требованиями той
определенной системы, для которой она предназначена.
Физические форматы жестких дисков:
______________________________________________________________
Тип Число Число Число Объем
компьютера сторон секторов цилиндров (МБ)
______________________________________________________________
ХТ 4 17 306 10
АТ 4 17 615 20
______________________________________________________________
Вернемся теперь к процессу форматирования. Данные на
дискетах не могут записываться и считываться произвольно.
Необходимо обрамление данных специальными электронными
сигналами, записанными на дискете.
Это обрамление называется форматирующим. Поэтому, новые
дискеты до их использования должны быть отформатированы
командой FORMAT операционной системы ДОС.
Основная часть процесса форматирования состоит в записи
адресных меток, идентифицирующих каждый сектор, и указывающих
его размер. Изучив более подробно способы доступа к данным,
хранящимся на дискете, Вы увидите, что одна из ошибок,
возникающих при чтении или записи, состоит в отсутствии
адресных меток.
Команда FORMAT не только размечает сектора дискет,
формируя адресные метки, но также устанавливает определенное
значение в поля даных всех секторов. Это эначение (F6/16) или
символьный код CHR$(246) позволяет определять, использовался
ли когда-нибудь определенный сектор или нет.
Одна из основных причин использования программной
разметки заключается, вероятно, в обеспечении средств защиты
от копирования. Операционная система ДОС позволяет считывать
и записывать только сектора стандартного размера 512 байт,
хотя сами дисководы могут работать с секторами произвольного
размера. Можно написать такую программу, которая не будет
использовать средства ДОС для работы с гибким диском и будет
хранить часть своей информации или даже всю информацию в
секторах нестандартного размера, которые не будут читаться
стандартными программами ДОС. В этом и заключается основной
принцип защиты от копирования в IBM/PC. Хотя существуют
различные способы защиты от копирования, наиболее простой
заключается в использовании секторов нестандартного размера.
Обычно, лишь небольшая часть информации хранится на
защищенной от копирования дискете в нестандартных секторах, а
основная часть данных может храниться в обычных 512-байтных
секторах.
Понятно, что все эти различные типы дискет практически
несовместимы. Одно из немногих исключений связано с
одновременным использованием одно- и двухсторонних дискет.
Однако, для совместимости дискет важны даже не физические
различия. Для совместного использования дискеты должны иметь
совместимую логическую разметку (например, размещение
справочника файлов). Из-за логических различий невозможно
просто перенести данные с дискеты компьютера "Эппл" в память
компьютера IBM/PC, или из операционной системы ДОС в
операционную систему СР/М-86. Для этого нужно написать
специальную программу преобразования, которая сможет
выполнять эту задачу.
5.4. Стандартный накопитель информации на гибких
магнитных дисках
Иногда какой-либо компании удается сделать столь хорошую
продукцию, что она становится промышленным стандартом,
захватывая существенную часть рынка за счет собственных
объемов продаж и продаж близких имитаций этой продукции.Это
произошло с серией накопителей на гибких магнитных дисках ТМ
100 фирмы "Тэндон". Судя по всему, фирма "ИБМ" приняла эти
дисководы в качестве эталонных и, насколько можно о чем-либо
судить в этой сфере тщательно хранящихся секретов, только
дисководы серии ТМ 100 фирмы "Тэндон" поставляются
фирмой"ИБМ" в качестве официального дисковода для IBM/PC.
Существует четыре популярных варианта дисководов ТМ 100.
Рассмотрим эти варианты подробнее.
Устройства ТМ 100-1 предназначены для работы с
односторонними дисками с двойной плотностью записи (т.е., с
40 дорожками). Это устройство входило в стандартный комплект
первой версии IBM/PC. Позднее, одновременно с внедрением ДОС
версии 1.10, фирма "ИБМ" начала использовать дисководы ТМ
100-2, работающие по-прежнему с двойной плотностью, но уже с
двухсторонними дисками, что позволило вдвое увеличить объем
хранения информации. Ниже мы рассмотрим, как операционная
система ДОС использует разные типы дискет). Оставшиеся две
модели, ТМ 100-3 и ТМ 100-4, устройства позволяющие работать
с одно- и двухсторонними дисками с учетверенной плотностью
записи, т.е. с восьмьюдесятью дорожками на поверхности
дискеты.
Не совсем понятно решение фирмы "ИБМ" использовать
односторонние дискеты наряду с двухсторонними. С точки зрения
дальних перспектив компьютера такое решение выглядит
неразумным. Наиболее вероятной причиной использования
одностронних дискет является желание фирмы ИБМ снизить цену
своего компьютера, которая и так существенно превышает цену
обычных домашних компьютеров.
Имеется ряд признаков, свчидетельствующих о стремлении
фирмы предельно снизить цену базовой модели. По крайней мере,
это единственный аргумент которым можно объяснить появление
практически нигде не использующейся модели с накопителем на
кассетной магнитной ленте и применения односторонних дискет в
первых модификациях IBM/PC. Расчет делался на то, что
серьезные пользователи, думающие о перспективе, будут
приобретать машины, оснащенные более мощными дисками, а чтобы
не отпугнуть колеблющегося новичка высокой ценой, фирма ИБМ
выбрала из всех имеющихся дисководов устройство с наиболее
умеренной ценой - устройство с односторонними дисками.
5.5. Принципы хранения файлов
Можно использовать различные схемы для организации,
хранения и учета данных на дискете. Каждая из схем имеет свои
достоинства и недостатки с точки зрения эффективности
использования пространства памяти дискеты, скорости доступа,
безопасности и качества хранения данных. (Понятие качества
хранения данных подразумевает вероятность каких-либо
нарушений при хранении и трудность восстановления данных,
если нарушения произошли.) Разработка схемы хранения данных
состоит в искусстве сочетания всех этих аспектов, иногда
противоречащих друг другу.
В этом параграфе будет описана схема хранения данных,
используемая в MS-ДОС. Прежде чем перейти к подробному
рассмотрению схемы хранения, опишем ее в общих чертах.
Первое, что следует подчеркнуть, это использование для
хранения данных стандартных 512-байтных секторов. Второе. Все
сектора извлекаются из общего пула свободных секторов -
никакие сектора или области на дискете не резервируются
(исключение составляет область для размещения системных
файлов IBMBIO.COM и IBMDOS.COM, о чем будет сказано ниже).
Третье. Распределение секторов данных и обьединение секторов,
образующих файл данных, выполняется независимо от
обслуживания самих секторов данных, с помощью механизма,
получившего название Таблицы Распределения Файлов (ТРФ). И
последнее. Каждая дискета имеет справочник или таблицу
гсодержимого, котороая служит для учета файлов, хранящихся на
дискете файлов. Описанная схема хранения данных предполагает
существование четырех различных типов секторов, один из
которых используется для хранения данных, а три других имеют
специальное назначение.
Как уже упоминалось в предыдущей главе, любая дискета,
которая должна использоваться для запуска операционной
системы, должна иметь программу загрузки, записывающуюся в
самом первом секторе дискеты. Программа загрузки всегда
записывается в первый сектор любой форматируемой дискеты
(если задан сообтветствующий режим форматирования) независимо
от того, будет ли она когда-нибудь использоваться для запуска
системы. Сектор с программой загрузки представляет собой
первый специальный тип сектора в ДОС.
Второй специальный тип сектора используется для хранения
таблицы таблиы размещения файлов (ТРФ). ТРФ занимает два
сектора, следующих за сектором с программой загрузки. Таблица
размещения файлов служит для индикации занятости секторов
данных на дискете.
Третий и последний специальный тип сектора используется
для хранения справочника дискеты. Справочник располагается
следом за ТРФ. Справочник может иметь различные размеры:
односторонние дискеты имеют четыре сектора справочника, а
двусторонние дискеты - семь.
Все эти сектора специального назначения занимают семь
первых секторов односторонней дискеты или десять -
двусторонней. Bcе остальные сектора используются для хранения
данных. На рис. 5.3 показано размещение всех этих четырех
типов секторов на дискете.
Справочник и таблица размещения файлов располагаются в
начале дискеты. На первый взгляд это представляется
оптимальным размещением. Однако, при доступе к файлу ДОС
сначала должен найти элемент этого файла в справочнике, а
потом обратиться собственно к данным на дискете. В среднем,
расстояние между справочником и собственно файлом на дискете
составляет 20 дорожек, то есть, практически половину дискеты.
Перемещение головок чтения-записи в дисководе является самой
медленной операцией. Так что расстояние между справочником и
самим файлом может иметь важное значение с точки зрения
временных характеристик работы.
Если бы справочник располагался в середине дискеты, то
среднее расстояние до секторов данных уменьшилось бы вдвое,
т.е., до 10 дорожек. С другой стороны, работа с пространством
данных, состоящим из двух частей, по обе стороны от
справочника, будет значительно сложнее. Для операционных
систем персональных компьютеров выгода от размещения
справочника посредине дискеты слишком мала, чтобы браться за
разрешение возникающих при этом дополнительных проблем. Такой
прием обычно используется в больших компьютерных системах.
Далее мы подробно рассмотрим справочник дискеты и
таблицу размещения файлов. Разобравшись в этом вопросе нам
легче будет понять, как производится распределение
пространства на диске между файлами.
5.6. Организация справочника
Справочник дискеты содержит список всех файлов,
находящихся на дискете. Элементы справочника содержат всю
необходимую информацию о файле, за исключением информации о
размещении файла (которая хранится в ТРФ).
Каждый элемент справочника имеет длину 32 байта.
Следовательно, в 512-байтном секторе помещается ровно 16
элементов справочника. На односторонней дискете выделено 4
сектора для справочника, что позволяет хранить 64 элемента
справочника. Семь секторов справочника двусторонней дискеты
позволяет разместить 112 элементов.
Большая часть из 32 байтов элемента справочника
используется для хранения информации о файле, однако имеется
ряд неиспользуемых полей, зарезервированных для дальнейшего
использования. Одно из различий между версиями ДОС 1.00 и
1.10 заключается в использовании некоторых из этих полей, а
ДОС версии 2.00 еще более расширяет использование
справочника.
Теперь подробно рассмотрим каждую часть элемента
справочника.Листинг программы 5.1 содержит об~явления
форматов данных на языке Паскаль, а листинг 5.3 содержит
несколько процедур для работы со справочником - чтения,
интерпретации и записи обратно на дискету.
Программа DiskLook, входящая в пакет программ,
прилагаемых к этой книге, разработана для отображения полной
информации из справочника дискеты. Во время изучения этой
главы можно использовать эту программу, чтобы лучше понять
назначение всех полей элемента справочника. Если используется
программа DiskLook, то для получения на экране информации из
справочника нужно нажать функциональную клавишу F4.
Каждый элемент справочника состоит из восьми частей или
полей следующего назначения:
ИМЯ ФАЙЛА: Это поле имеет длину восемь байт,
расположенных в элементе справочника со смещениями от 0 до 7
и содержит имя файла. Если длина имени меньше восьми
символов, то недостающие символы заменяются пробелами.
Правилами оформления имен файлов в ДОС запрещается
включать пробелы в середину имени файла. Но такие имена
файлов все же могут создаваться. Это можно делать на языке
Бейсик, поскольку в нем ограничителем имени служат кавычки.
Например, следующий оператор Бейсика позволяет создать файл,
имя которого содержит пробел:
OPEN "AA BB.FIL"
Программа "IBM Typing Tutor", написанная на Бейсике,
использует файлы, имена которых содержит пробелы. При
использовании программы поиска имени файла в справочнике, не
следует считать, что имя файла завершается первым же
встреченным пробелом - имя может продолжаться и после этого
пробела.
Если первый байт имени файла имеет шестнадцатеричное
значение Е5, CHR$(229), это означает, что элемент справочника
не используется. Это может значить, что он никогда не
использовался или что файл, которому соответствовал этот
элемент, уже уничтожен. Проверка второго байта имени
позволяет установить отличие неиспользовавшегося элемента от
элемента уничтоженного файла (если значение второго байта
больше символьного кода "Z", этот элемент не использовался).
В последних версиях ДОС неиспользованные элементы справочника
содержат в первом байте 0.
После уничтожения файла с ним происходит следующее:
занимаемое им место возвращается в общий пул (об этом будет
подробнее сказано в следующем разделе) и первый символ имени
файла заменяется шестнадцатеричным кодом Е5, CHR$(229). Вся
информация в элементе справочника, за исключением первого
символа имени, сохраняется. Благодаря этому, программа
DiskLook может отображать имена уничтоженных файлов, а
программа подобная UnErase - восстанавливать файлы.
Еще один код, который может встретиться в первом байте
имени файла - это шестнадцатеричный код 2Е, который указывает
на справочник нижнего уровня.
РАСШИРЕНИE: Это поле имеет длину три байта, которые
расположены со смещениями от 8 до 10 от начала элемента
справочника. Оно содержит расширение имени файла. Как и в
случае с самим именем, короткое расширение дополняется
пробелами. Если файл не имеет расширения, то это поле
содержит три пробела.
АТРИБУТ: Это поле состоит из одного байта,
расположенного со смещением 11 от начала элемента
справочника. Поле атрибута используется для установления
признака "скрытого" файла, т.е. такого файла, имя которого не
обнаруживается обычными программами работы со справочниками.
Два бита этого байта служат для индикации атрибутов
"скрытого" и "системного" файла. Остальные шесть бит не были
определены в ранних версиях ДОС и только начиная с версии
2.00 часть из них стала использоваться. Во всех более ранних
версиях эти биты не определены и устанавливаются в нуль.
Седьмой бит байта атрибутов с числовым значением 2
определяет скрытый файл, а шестой, с числовым значением 4, -
системный файл. Таким образом, обычный видимый файл будет
иметь нулевой байт атрибута, для скрытого файла байт атрибута
имеет значение 2, для системного файла - 4, а для скрытого
системного файла - 6.
Хотя обработка системного атрибута осуществляется
независимо от скрытого, оба эти атрибута практически
совпадают по своему функциональному назначению. При
использовании любого из них файл становится "невидимым" для
обычных программ работы со справочниками. Системный атрибут
зарезервирован не для использования в будущем, а (по
сведениям фирмы "Майкрософт") для обеспечения совместимости с
другими операционными системами.
В версиях ДОС, следующих за версией 2.00 используются
еще четыре бита. Бит 0 (с единичным значением) указывает, что
файл доступен только для чтения. Такой файл защищен от
изменений и уничтожения средствами ДОС.
Бит 3 (с числовым значением 8) указывает, что элемент
справочника содержит метку тома. Сама метка хранится в полях
имени файла и расширения, которые воспринимаются в этом
случае как одно целое.
Бит 4 (с числовым значением 16) используется для
указания элементов справочника, соответствующих справочникам
нижнего уровня. Поскольку справочники нижнего уровня хранятся
на диске подобно обычным файлам данных, им необходим
собственный элемент в корневом справочнике. В этом элементе
используются все поля, кроме размера файла, в данном случае
равного нулю. Действительный размер файла справочника нижнего
уровня легко определяется из соответствующей последовательно-
сти в ТРФ.
Бит 5 (с числовым значением 32) предусмотрен для
облегчения создания резервных копий файлов на жестких дисках.
Для файлов на гибких дисках этот атрибут практически
бесполезен.
ЗАРЕЗЕРВИРОВАННОЕ ПОЛЕ: Это поле зарезервировано для
возможного использования в будущем. В первой версии ДОС это
поле имело длину 12 байт, но в дальнейшем его сократили до 10
байт, расположенных со смещениями от 12 до 21 относительно
начала элемента справочника.
Любые новые операции над справочником файлов, которые
могут использовать это поле. Когда элемент справочника
находится в активном состоянии (используется), то эти байты
принимают значение 00. В исходном состоянии байты этого поля
имеют шестнадцатеричные значения F6, установленные командой
FORMAT. Любые другие значения этого поля указывают на
какой-либо вариант его использования.
ВРЕМЯ: Это поле имеет длину два байта в формате
16-разрядного целого числа без знака, расположенные со
смещениями 22 и 23 относительно начала элемента. Начиная с
версии ДОС 1.10 в этом поле хранится время создания или
модификации файла. В первой версии ДОС хранилась только дата,
а это поле было частью зарезервированного поля.
Большинство операций, использующих это поле, таких как
операция распечатки содержимого справочника DIR, выдают время
с точностью до минут, хотя число хранящееся в поле времени
позволяет определить время с точностью до двух секунд.
Код времени, хранящийся как 16-разрядное целое число без
знака, вычисляется по следующей формуле:
время = часы * 2048 + минуты * 32 + секунды / 2
ДАТА : Это поле состоит из двух байт, хранящихся со
смещениями 24 и 25 от начала элемента. Как и время, даты
хранятся в виде целого 16-разрядного числа без знака, которое
вычисляется по формуле:
Дата = (год - 1980) * 512 + Месяц * 32 + День
Диапазон изменения лет составляет от 1980 до 2099,
причем хранятся они в виде относительных величин от 0 до 199.
Хотя формат позволяет задавать относительный номер года 127 (
что соответствует 2107 году), программы ДОС позволяют
работать с годами только до 2099. Никто, правда, не ожидает,
что ДОС будет использоваться так долго.
Как формат, так и размещение полей даты и времени
подобраны таким образом, чтобы вместе они образовывали единое
четырехбайтовое поле, которое можно использовать в операциях
сравнения. Достаточно просто извлекать компоненты даты и
времени из соответствующих полей и вычислять их разность.
Например, для разделения даты на составные части можно
использовать следующие формулы, записанные на Паскале:
год := 1980 + поле_даты div 512
месяц := (поле_даты mod 512) div 32
день := поле_даты mod 32
НОМЕР НАЧАЛЬНОГО КЛАСТЕРА : Это двухбайтовое поле,
расположенное со смещением 26, 27 от начала элемента,
содержит 16-разрядное число, являющееся смещением до
начальной точки файла в таблице размещения файлов (ТРФ);
подробнее от этом сказано в следуцющем разделе. Начальный
кластер является первой частью пространства данных на
дискете.
РАЗМЕР ФАЙЛА : Это поле состоит из четырех байтов,
размещенных со смещениями от 28 до 31 от начала элемента.
Размер файла задается в байтах и хранится в формате
четырехбайтового целого числа без знака, которое может
рассматриваться как пара двухбайтовых чисел. Размер файла не
всегда указывает точное число байтов. Для всех файлов это
поле должно соответствовать размеру файла в секторах.( Если
по какой-либо причине это не так, то процедура ДОС CHKDSK
сообщит об ошибке и установит правильную длину.)
Для программных файлов, представленных в формате типа
".COM" и для файлов, созданных из данных фиксированной длины,
только поле размера файла позволяет точно определить, где
находится конец данных. Для этих файлов значение в поле
размера файла хранится с точностью до байта.
Для файлов некоторых других форматов такая точность не
обязательна и размер файла, указанный в соответствующем поле,
может отличаться от действительного. Наиболее часто это
случается с текстовыми файлами, которые будут описаны в
разделе 5.9 . Текстовые файлы в коде ASCII имеют маркер
(признак) конца файла, хранящийся в самом файле, который
фиксирует точный конец данных. По этой причине многие
программы, работающие с текстовыми файлами, не слишком
заботятся о сохранении действительного размера файла.
Например, если программа формирует текстовой файл не
побайтно, а блоками по 128 байт, то ДОС определит размер
файла с точностью до 127 байт. Для программ редактирования
текстов значительно эффективнее читать и записывать данные
большими блоками, чем делать это побайтно. Такой подход
является довольно распространенным и не следует чересчур
доверять значению размера файла, по крайней мере, для
текстовых файлов.
Справочники нижнего уровня
___________________________
Существуют два типа справочников: корневые и справочники
нижнего уровня. Содержимое и характер использования
справочников обоих типов по существу одинаковы - те и другие
хранят имена файлов и сведения о них и их расположении на
диске. Однако, характеристики этих справочников различаются.
Корневые справочники (или просто справочники) имеют
фиксированный размер и хранятся в определенном месте на
дискете. Справочник нижнего уровня является дополнением
корневого справочника и может храниться как обычный файл в
любом месте на дискете. Справочники нижнего уровня могут
использоваться любой версией ДОС, следующей за версией 2.00.
Справочники нижних уровней хранятся в пространстве
данных диска как обычные файлы. Форматы полей и содержимое
справочников нижнего уровня такие же как у корневого
справочника, с той лишь разницей, что размер справочника
нижнего уровня не ограничен. Справочники нижнего уровня
всегда связаны с порождающим справочником, который может быть
как корневым справочником, так и справочником более высокого
уровня.
В порождающем справочнике всегда имеется элемент для
справочника нижнего уровня,отличающийся от обычного элемента
установленным битом 4 байта атрибутов и нулевым значением
размера файла. Действительный размер справочника можно
определить, проследив всю цепочку в таблице размещения
файлов.
При создании справочников нижнего уровня в них
выделяются два элемента, в которых в качестве имени файла
указана точка и две точки ( "." и "..").
Элемент с одной точкой относится к этому справочнику, а
элемент с двумя точками - к его порождающему справочнику.
Номера начальных кластеров в этих элементах указывают
соответственно местоположение самого справочника и его
порождающего.
Если номер начального кластера для порождающего
справочника равен нулю, то порождающим является корневой
справочник.
Когда размер файла уменьшается, ДОС возвращает
освободившееся место на дискете в общий пул. Однако, если
информация о файле хранится в справочнике нижнего уровня, то
освободившееся место нельзя будет использовать, пока не будет
уничтожен весь этот справочник.
5.7 Структура Таблицы Размещения Файлов (ТРФ)
Процедура распределения пространства памяти на дискете
между файлами реализуется с помощью таблицы размещения файлов
(ТРФ). Использование ТРФ и интерпретация ее содержимого
представляет собою непростую задачу - следовательно
необходимо некоторое более подробное разъяснение. Основной
принцип организации ТРФ заключается в создании таблицы,
каждый элемент которой соответствует одному кластеру или
фрагменту дискового пространства выделяемого файлу. Элементы
таблицы содержат признаки занятости кластера или что он
свободен и может быть отведен для файла. Доступные или
свободные элементы таблицы содержат нулевые значения. Участки
пространства на дискете, принадлежащие файлу, связаны в
цепочку. Элемент справочника файла содержит номер элемента в
ТРФ, который соответствует первому из участков, выделенных
для файла. Элемент ТРФ содержит номер элемента следующего
файла и так далее, пока не будет достигут последний участок
файла. В последнем элементе ТРФ для файла находится признак
конца файла. Схема такой организации изображена на рис. 5.4 .
Такова в общих чертах схема ТРФ. Рассмотрим теперь ее
подробнее.
Во-первых, рассмотрим кластеры выделяемого пространства
памяти. Для односторонних дмскет пространство выделяется по
одному сектору. Для двухсторонних дискет выделяются каждый
раз два сектора . Если в кластер входит больше одного
сектора, то объединяются последовательные сектора. Для
двухсторонних дискет кластер состоит из четного и нечетного
секторов одной и той же дорожки. Таким образом, каждая
дорожка двухсторонней дискеты состоит из четырех кластеров на
каждой стороне или всего восьми кластеров. В первый кластер
входят сектора 1 и 2, во второй - 3 и 4 и так далее . (Если
будут добавлены диски большей емкости, то можно будет
организовать кластеры большего размера. В четвертой главе уже
упоминалось, как можно динамически включить в BIOS программы
обслуживания устройств для ДОС всех версий, начиная с версии
2.00. Описанная методика позволяет добавлять дисковые
устройства, логическая организация которых будет совместима с
используемыми дискетами. Помимо других характеристик, которые
могут задаваться для новых устройств, можно указать и число
секторов в кластере.)
Выделение места на двухсторонней дискете двухсекторными
кластерами может показаться нерациональным, ведь в ряде
случаев файл будет использовать лишь часть первого из двух
секторов. Однако, пространство на двухсторонних дискетах
теряется ничуть не больше чем на одностронних. Выделение
пространства кластерами большими одного сектора позволяет
ограничить увеличение размеров таблицы размещения файлов при
использовании дискет все больших и больших размеров.
Раздел данных дискеты начинается сразу за справочником и
занимает все место до конца дискеты. Первый кластер данных
имеет номер 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. Размещение файлов
Теперь можем рассмотреть метод выделения секторов данных
для файлов. Этот метод довольно прост.
При записи на дискету данных файла для нее по одному
выделяются кластеры секторов дискеты. Когда необходим
очередной кластер для данных, то выбирается доступный кластер
с наименьшим номером. Такая простая схема используется как
при создании файла, так и при его удлинении (путем добавления
данных в конец файла).
В отличие от некоторых других операционных систем (таких
как р-система Калифорнийского университета в Сан-Диего), ДОС
выделяет место на дискете по одному кластеру, когда в этом
есть необходимость, не заботясь о том, чтобы все данные файла
хранились в одной непрерывной области диска. При разработке
любой схемы распределения дискового пространства в любой
операционной системе приходится выбирать между свободным
выделением пространства по одному кластеру, в результате чего
файл может оказаться "размазанным" по всей дискете, и
выделением места большими непрерывными сегментами , что
усложняет задачу управления пространством на дискете.
Операционная система ДОС использует более простой первый
метод.
Если дискета пуста, то все доступное на ней место
представляет собой одну большую чистую область. Когда файлы
копируются на такую дискету, они оформляются в виде удобно
размещенных непрерывных фрагментов дискового пространства. Но
впоследствии, если файлы будут удлиняться, то дополнительное
место будет выделяться в первых свободных кластерах, которые
могут находится в любом месте дискеты.
Когда файлы копируются на новую дискету и оставляются
без изменения, их размещение на дискете остается экономичным.
Но если создаются или удаляются какие-либо данные, то
использование места на дискете становится весьма запутанным.
Это наиболее вероятно происходит, когда программа
создает одновременно два файла. Если файлы увеличиваются
параллельно, то их расположение на дискете обязательно будет
перемежающимся.
Изучение динамики распределения пространства на дискете
может оказаться довольно интересным и поучительным. Если у
Вас есть моя утилита Disklook, то можно изучать распределение
пространства на Вашей дискете, устанавливать расположение
пространства всех файлов и проверять, фрагментировано ли
пространство на диске.
Итак, схема распределения пространства на дискете в ДОС
довольно хороша, она равномерно использует все пространство и
не требует нашего вмешательства. Однако, все эти преимущества
достигаются ценою "размазывания" файлов по дискете. Из-за
этого может увеличиться время доступа к файлу, поскольку
магнитная головка чтения/записи должна перемещаться по всей
дискете для поиска нужных дорожек. Поскольку обращения к
дискете являются наиболее медленными операциями и основными
ограничивающими факторами производительности IBM/PC, такое
размещение файлов может породить проблемы, хотя обычно этого
не случается.
По этой причине, необходимо уделять внимание
потенциальной проблеме фрагментации пространства, занимаемого
файлами на дискете. Обычно эти проблемы Вас волновать не
будут, но иногда они могут приобрести чрезвычайное значение.
В тех случаях, когда фрагментация файлов покажется Вам
нежелательной, скопируйте файл на новую дискету. Это же
полезно делать, если Вам покажется, что дисковод слишком
долго выполняет поиск дорожек при чтении файла.
При копировании файлов на новую дискету можно заодно
улучшить их последовательность, разместив в начале часто
использующиеся файлы или переставив их в таком порядке, в
каком Вам хотелось бы их видеть в распечатке справочника. В
некоторых случаях упорядочение данных может оказаться
особенно полезным: файлы на дискете, хранящей
корреспонденцию, лучше размещать в хронологическом порядке,
для дискеты с множеством вспомогательных файлов
предпочтительнее всего алфавитный порядок, ускоряющий
просмотр. Полезно бывает, также, упорядочивать файлы по
расширениям, которые обычно обозначают тип файла или способ
его использования. Такое упорядочивание можно производить
либо вручную, ллибо с помощью какой-либо сервисной программы
(такого рода программы имеются в составе пакета "Norton
Utilities" (служебные программы Нортона)).
5.9.Формат текстового файла
Наиболее часто использующийся и один из самых важных
форматов для файлов данных, размещаемых на дискетах,- это
текстовый файл в коде ASCII. Такие файлы содержат обычную
алфавитную информацию, тексты или отчеты, состоящие из
алфавитных символов.
Текстовые файлы являются, вероятно, наибольшим
приближением к универсальному формату для всех персональных
компьютеров. Такой формат поддерживается практически всеми
персональными компьютерами и имеет множество различных
применений.
Большинство текстовых редакторов, включая и текстовые
процессоры, используют текстовый формат. Редактор,
поставляемый в составе ДОС, ЕDLIN, создает и использует
текстовые файлы.
Текстовый формат используется для хранения исходного
текста программ (исходной, нетранслировавшейся версии).
Практически все языковые процессоры (такие как интерпретатор
языка БЕЙСИК, компилятор языка Паскаль или Ассемблер) ожидают
ввода входного файла в текстовом формате в коде ASCII.
Интерпретатор языка БЕЙСИК для IBM/PC работает с тремя
форматами файлов программ на языыке БЕЙСИК одним из которых
является стандартный текстовый формат в коде ASCII. Для
записи программы на языке БЕЙСИК в текстовый файл в коде
ASCII нужно использовать ключ "А" в операторе SAVE:
10 SAVE "PROGRAM.BAS",А
Файлы пакетной обработки, одно из самых мощных и
полезных вспомогательных средств ДОС, также хранятся в
текстовом формате.
Чтобы понять структуру файлов, необходимо сначала понять
саму кодировку, принятую в Американском стандартном коде для
обмена информацией (ASCII). Код ASCII в основном состоит из
кодов символов. Всем символам присваиваются определенные
комбинации битов, например, код для заглавной буквы "А" будет
выражаться шестнадцатиричным числом 41.
Существует 128 различных кодов в системе ASCII,
поскольку в ней используются семибитовые коды. Большинство
компьютеров, включая IBM/PC, используют восьмибитовую
кодировку символов, так что коды ASCII составляют лишь
половину из ансамбля 256 возможных кодов. Для большинства
компьютеров, и для IBM/PC, коды ASCII занимают первые 128
кодов, от CHR$ (0) до СHR$ (127).
Вообще говоря, имеется три различных категории кодов
ASCII и две из них будут нас интересовать. Прежде всего,
имеются коды ASCII, соответствующие буквам, знакам
препинания, цифрам и т.п. Это первая из категории кодов ASCII
и, конечно, они будут использоваться во всех наших работах,
выполняемых с помощью персонального компьютера.
Следующую категорию я бы назвал символами
форматирования. Использование этих символов следует уже из их
названий, например, "возврат на шаг", "возврат каретки" и
"перевод строки". Форматирующие символы разрабатывались
специально для управления устройством печати. Эта категория
нам также понадобится и мы еще к ней вернемся.
Третью категорию символов ASCII можно назвать символами
связи. Они имеют такие имена как "начало-текста" или
"конец-передачи" и используются главным образом в качестве
управляющих сигналов при использовании кода ASCII для
передачи информации по линиям связи. Эти символы позволяют
управлять процессами установления связи и передачи данных.
Полное разъяснение назначения этих символов тесно связано с
изложением принципов осуществления взаимодействия по линиям
связи, что не входит в сферу изложения данной книги.
Поскольку эта категория символов не используется среди данных
или в структуре файлов, она больше не будет нас интересовать.
Подведем некоторые итоги: одна из трех категорий кодов
ASCII используется для кодировки данных, таких как буквы,
цифры и знаки пунктуации. Вторая используется для
форматирования, т.е., для указания того, где заканчивается
одна строка и начинается другая; эти коды используются не
только для управления форматом печати, но и для
структурирования файлов. И, наконец, третья категория для
управления передачей данных и никак не связаны с форматом
текстовых файлов.
Обычные символы текста в коде ASCII имеют значения от
CHR$(32) до CHR$(126). Символы ASCII двух специальных
категорий - форматирующие и символы связи,- имеют коды от
CHR$(0) до CHR$(31). Все эти коды должны использоваться для
различных управляющих функций и они обычно используются
отдельно от кодов данных. Если Ваша программа попытается
непосредственно использовать эти коды, могут происходить
странные вещи. Некоторые ситуации описываются в приложении 4.
Ниже приведены три простые программы на языке Бейсик,
которые демонстрируют ряд экспериментов со специальными
кодами ASCII от 0 до 31:
10 REM вывод на экран дисплея
20 FOR I=0 TO 31
30 PRINT CHR$(I)
40 NEXT I
10 REM вывод на печать
20 FOR I=0 TO 31
30 LPRINT CHR$(I)
40 NEXT I
10 REM манипулирование режимом экрана
20 DEF SEG=&HB800 'цветная графика
30 DEF SEG=&HB000 'монохромный
40 FOR I=0 NJ 31
50 POKE 1*2,I
60 NEXT I
Теперь рассмотрим текстовые файлы в коде ASCII. Это
файлы, содержащие текст, который состоит из обычных символов,
например, букв алфавита. Символы текстового файла
организуются в строки, подобно тому как они записываются на
бумаге.
Границы строк отмечаются форматирующими символами кода
ASCII: возврат каретки, CHR$(13), и перевод строки, CHR$(10).
Можно было бы использовать любой символ для обозначения конца
строки, но используются именно эти два символа, поскольку они
управляют процессом перехода к новой строке на печатающем
устройстве.
Одна из причин использования двух символов, обзначающих
конец строки, состоит в обеспечении возможности наложения
строк. Наиболее часто такая возможность используется для
выполнения подчеркивания. При этом на печать в конце строки
выдается только возврат каретки, а затем накладывающиеся
символы. Поскольку перевод строки не выполнялся, новые
символы печатаются поверх уже напечатанных. Такую операцию
можно произвести с печатающим устройством, но нельзя с
дисплеем.
Таким образом, физические команды, необходимые
печатающему устройству для завершения строки, используются
также в качестве логических меток конца строки в файле. Такой
прием позволяет копировать текстовые файлы непосредственно на
печатающее устройство, причем текст будет распечатываться
правильно. Вы можете сами проверить это, использовав команду
COPY для пересылки файла непосредственно на устройство печати
или на зкран дисплея следующими командами:
COPY имя файла LPT1
COPY имя файла CON
Длина строки тектового файла ничем не ограничивается,
строка продолжается, пока не встретятся символы возврата
каретки и перевода строки. Однако, большинство программ,
работающих с текстовыми файлами, ограничивают длину строки
255 символами, что обычно значительно больше, чем может
потребоваться (некоторые редакторы и текстовые процессоры
ограничивают длину строки данных таким образом, чтобы они
укладывались в строку экрана дисплея: 80 символов).
Формат текстового файла определяется не только
разделением на строки. Все файлы в коде ASCII имеют один
общий элемент - маркер конца файла, значение которого
CHR$(26). Этот маркер однозначно указывает конец файла.
Обнаружение положения кода CHR$(26) позволяет точно
установить размер файла, отличающийся от размера, указанного
в справочнике.
С клавиатуры этот специальный символ с кодом CHR$(26)
можно ввести, нажав клавишу "Z" и удерживая в нажатом
состоянии клавишу "CONTROL" (управление). Если в любом
тексте, связанном с персональными компьютерами, Вам
встретится сочетание "CONTROL-Z", то имеется в виду функция
конца файла, или значение CHR$(26) .
Кроме описанных трех универсальных кодов, возврата
каретки, перевода строки и конца файла, имеются и другие
форматирующие коды ASCII, которые используются с различной
интенсивностью. Символ табуляции (CHR$(9)) используется для
замены нескольких пробелов, следующих один за другим.
Поскольку не существует общепринятого количества позиций
табуляции, этот символ используется не так широко, как можно
было бы ожидать.
Символ перевода страницы (CHR$(12)) обозначает переход к
началу новой страницы. Большинство устройств печати
отрабатывает этот код соответствующим образом и некоторые
программы редактирования используют его для разделения текста
на страницы. Использование этого символа также далеко от
универсальности. Его стоит применять только для управления
устройством печати.
Программы редактирования и, особенно, текстовые
процессоры требуют большего числа символов форматирования и
они определяют собственные коды для своих целей, таких как
отметка границ параграфов, подчеркивания и тому подобного.
Поскольку универсальных кодов для таких функций не
существует, их включение в текстовой файл не позволит другим
программам его использовать.
Прежде чем завершить рассмотрение текстовых файлов
необходимо сделать еще ряд замечаний, касающихся обычных
символов текста. Любая система кодирования определяет
упорядоченную последовательность - своего рода эквивалент
алфавитного порядка символов. В коде ASCII все обычные знаки
пунктуации предшествуют буквенным кодам. Заглавные буквы
располагаются перед строчными. Кроме того, в отличие от кода
EBCDIC, используемого универсальными компьютерами фирмы
"ИБМ", цифры располагаются перед буквами.
Коды заглавных букв отличаются от кодов строчных букв на
32 (на 32 меньше). Этот факт можно использовать в программах
преобразования текстовых данных из верхнего регистра в нижний
или наоборот.
5.10. Форматы записей данных
После текстовых файлов в коде ASCII наиболее
распространены файлы с фиксированной длиной записей. В таком
файле логические единицы информации называются записями и
размер этих записей одинаков во всем файле. Файлы такого
формата создаются интерпретатором БЕЙСИКА в качестве
произвольных файлов, такой же формат имеют прямые файлы
Паскаля и другие нетекстовые файлы. При выполнении каждой
операции чтения или записи (обозначаемых в языке БЕЙСИК как
INPUT# и WRITE#) пересылается одна запись.
Если текстовые файлы включают метки, отмечающие концы
строк и конец файла, то в файле с фиксированой длиной
записей, записи ничем не отделяются друг от друга. В таких
файлах хранятся только данные без каких-либо разделителей.
Поскольку записи в таком файле имеют одинаковую длину,
можно использовать простейшие арифметические вычисления для
определения места, где заканчивается одна запись и начинается
другая. Служебные программы ДОС для чтения и записи
информации в файл, описанные в главе 4, используют такой
метод как при последоваательном, так и при произвольном
обращении к файлу. Когда Ваши программы обращаются к файлам,
ДОС выполняет все функции поиска записей, так что Вашим
программам не нужно заботится ни о каких подробностях,
связанных с поиском.
Рассмотрим пример. Если длина записей файла 100 и у ДОС
запрашивается чтение записи с номером 24, то ДОС вычисляет
смещение в байтах от начала файла умножением 24 х 100.
Разделив полученное значение 2400 на размер сектора, 512
байт, получим частноее 4 и остаток 352. Это значит, что
запись расположена в пятом секторе файла (пропускаются 4
сектора) со смещением 352 байта.
(Такой способ подсчета предполагает, что нумерация
записей начинается с нуля. Если номер первой записи единица,
то необходимо сооветствующим образом изменить формулу, хотя
сам метод остается неизменным).
В файлах с фиксированной длиной записи ДОС не приходится
заниматься выравниванием записей - они располагаются одна за
другой. Если длина записи не укладывается точно в
512-байтовый размер сектора, то некоторые записи могут
размещаться в нескольких секторах, что несколько снижает
эффективность операций чтения и записи.
В нашем примере со 100-байтными записями, очередная, 25
запись, частично размещается в 5-ом, а частично - в 6-ом
секторе. Чтобы записать в файл эту запись, необходимо сначала
считать, а затем записать обратно на диск два сектора.
Если Вы будете выбирать длину записи так, чтобы она была
кратна 512, то скорость чтения и записи несколько повысится.
ДОС, однако, позволяет работать с записями разной длины и,
если не считать некоторого снижения эффективности при
чтении/записи записей, располагающихся в нескольких секторах,
Вам не нужно заботиться о размере записи.
Как Вы, вероятно, догадались, существует множество
других форматов файлов, помимо текстовых файлов и файлов с
фиксированной длиной записи. Мы так подробно остановились на
этих двух форматах в связи с их широким распространением.
Другие форматы хранения данных обычно имеют структурные
требования, усложняющие процесс их чтения и записи, что может
потребовать использования специальных программ для работы с
ними. Существенное достоинство зтих двух форматов заключается
в их гибкости - в самых различных ситуациях - так что они
могут использоваться в очень многих приложениях. Поскольку
они поддерживаются очень многими программами, в том числе
различными языковыми процессорами и операционными системами,
их очень удобно использовать. На практике получается, что в
связи с удобством работы с текстовым форматом и широкой
поддержкой его различными программами редактирования и
языками программирования, можно обнаружить случаи
приспосабливания форматов данных программ к текстовому
формату в коде ASCII.
5.11. Форматы программных файлов.
Существует два формата файлов для хранения программ. Для
них зареэервированы два расширения имен: ".COM" и ".EXE".
Подробности организации программных файлов потребуют полного
изложения организации ДОС, так что мы не будем сейчас их
описывать, отметив только наиболее важные моменты. (Файлы
программ БЕЙСИКА с расширением ".BAS" строго говоря не
являются программными файлами - это файлы данных, которые
считываются и используются интерпретатором БЕЙСИКА.)
Программные файлы типа COM с расширением имени файла
".COM" - это непосредственно загружаемые программы. В этих
файлах хранится точный образ задач в том виде, в котором они
находятся в памяти. Для них не требуется практически никакой
подготовки к запуску после их загрузки в память средствами
ДОС. Если Вы будете просматривать файл типа COM, например,
программой DiskLook, Вы увидите команды машинного языка и
данные, образующие программу, и ничего больше. Когда ДОС
подготавливает програму из файла типа COM к выполнению, она
формирует специальный сегмент-приставку, необходимый для всех
программ, загружает программу, устанавливает регистры
сегментов, присваивая им стандартные значения, и передает
управление программе.
Программные файлы типа EXE с расширением имени файла
".EXE" несколько отличаются от файлов типа COM. Чтобы
загрузить их для выполнения требуется определенная
подготовка. Наиболее важная часть такой подготовки называется
перемещением.
Программа может содержать адреса, значения которых
должны меняться в зависимости от того, в каком месте памяти
находится программа. Если программе это не требуется, то она
называется само-перемещаемой. Программы типа COM должны быть
само-перемещаемыми, а перемещение программ типа EXE должно
выполняться специальной программой ДОС - загрузчиком.
Программы типа EXE начинаются специальной двухбайтовой
меткой, 4D5A, которая используется для различения программ
разных типов. За этой меткой следует определенная управляющая
информация, включающая таблицу, указывающую какое перемещение
необходимо. Далее размещается собственно программа.
Помимо перемещения, во время загрузки для программ типа
EXE может быть определен сегмент стека. Программы типа EXE
могут определять куда они должны загружаться - в верхнюю или
в нижнюю часть доступной памяти.
В связи с простотой формата COM, можно создавать
относительно короткие и простые файлы типа COM в машинных
кодах непосредственно, либо с помощью программ для
модификации содержимого файлов на дискетах, таких как DEBUG
или SecMod, либо путем написания короткой программы на
БЕЙСИКЕ, которая будет записывать байты программы прямо в
файл типа COM. Такого рода программ создано уже очень много.
Формат типа COM проще, компактнее и быстрее загружается
в память. Для программ, которым не нужны специальные услуги,
обеспечиваемые форматом типа EXE, предпочтительнее
использовать формат типа COM.
Приложение 5.1. Текст программы анализа структуры
справочника (Паскаль).
const
directory_sectors_single_sided=4;
directory_sectors_double_sided=7;
directory_entries_single_sided=64; {4*16}
directory_entries_double_sided=112; {7*16}
hidden_attribute =wrd(2);
system_attribute =wrd(4);
{========================================================}
type
directory_entry_type=
record
filename : string(8);
extension : string(3);
attribute : byte; {hidden=2; system=4}
reserved : array[1..10] of byte;
creation_time : word; {hour*2048+minute*32+
secs}
creation_date : word; {(year-1980)*512+
month*32+day}
starting_cluster_number : word;
file_size : array[1..2] of word;
end;
{==========================================================}
complete_directory_type=array[1..112] of directory_entry_type;
Приложение 5.2. Текст программы анализа структуры
таблицы размещения файлов (Паскаль).
const
minimum_cluster = 2;
maximum_cluster_single_sided = 314;
maximum_cluster_double_sided = 316;
usual_fat_end_of_file = 4095;
minimum_fat_end_of_file = 4088;
bad_cluster_fat = 4087;
single_sided_indicator_byte = 254;
double_sided_indicator_byte = 255;
{==========================================================}
type
fat_sector_type=array[0..511] of byte;
fat_sector_structured_type=
record
scrambled_fat_pair: array[0..158]
of
record
scrambled_byte_1 : byte;
scrambled_byte_2 : byte;
scrambled_byte_3 : byte;
end;
unused_bytes_of_sector : array[1..35] of byte;
end;
[ Оглавление ]