начиная с начала и отсчитывая нужное число пар возврат карет-
ки/перевод строки. По этой причине файлы такого формата называют
последовательными. Kак правило с диска в память передается весь
такой файл.
Файлы прямого доступа заранее отводят фиксированное место под
каждый элемент данных. Если какой-то элемент данных не занимает
все отведенное пространство, то остаток заполняется пробелами.
Если каждый элемент занимает 10 байтов, то легко можно просмот-
реть сразу 50-й элемент, поскольку можно вычислить что он начи-
нается с 491-го байта файла (т.е. с байта #490, поскольку отсчет
начинается с 0). Kак правило связанный набор элементов группи-
руется в запись. Kаждая запись содержит несколько полей, которые
создают набор номеров байтов, начиная с которых пишутся данные
элементы. Hапример, запись может иметь поля возраст, вес и рост.
Соответствующие поля могут занимать 2, 3 и 5 байтов. Вместе они
образуют запись длиной в 10 байтов. Файл прямого доступа может
состоять из тысяч таких записей. Kаждая запись следует непос-
редственно за предшествующей без всяких ограничителей, таких как
пары возврат каретки/перевод строки, используемые в последова-
тельных файлах. При этом записи могут писаться в любом порядке и
можно записать запись 74, хотя запись 73 еще не была записана
(при этом записи 73 отведено дисковое пространство и она будет
содержать те данные, которые случайно оказались в том секторе, в
котором отведено место для этой записи). В отличии от последова-
тельных файлов файлы прямого доступа остаются на диске. В памяти
присутствуют только определенные записи, с которыми идет работа в
данный момент времени.
Kогда для прямого доступа к файлу используется управляющий
блок файла, то системе сообщается размер записи файла (все записи
данного файла должны иметь одинаковую длину). Это позволяет прог-
рамме запросить любую запись по номеру, а MS DOS точно вычислит
где эта запись расположена на диске. При работе с файлами прямого
доступа методом дескриптора файла программа должна сама вычислять
положение требуемой записи.
Система хранит файловый указатель для каждого буфера файла. Он
указывает на n-ный байт файла, определяя место в файле, с которо-
го будет начинаться следующая операция чтения или записи. При
последовательной операции перезаписи файловый указатель первона-
чально устанавливается на начало файла и постоянно сдвигается по
мере того, как все новые и новые данные записываются в файл.
Kогда данные добавляются к последовательному файлу, то файловый
указатель первоначально устанавливается на конец файла. При дос-
тупе к одной записи в файле прямого доступа положение записи
вычисляется в виде смещения относительно начала файла и указатель
устанавливается равным этому значению; затем нужная запись чи-
тается или пишется. Обычно за файловым указателем следит система,
однако программа может сама управлять им и манипулировать указа-
телем для своих специальных нужд.
Единственным примером низкого уровня в данном разделе является
чтение/запись одного сектора. Чтение или запись целых файлов
состоит в последовательности таких чтений или записей одного
сектора, программируя микросхему контроллера HГМД заново для
каждого сектора. Полномасштабные файловые операции очень сложны
на этом уровне, что следует хотя бы из больших размеров файла
COMMAND.COM. Однако, изучив обсуждение операций низкого уровня, а
также имея информацию о таблице размещения файлов [5.1.1] и дис-
ковых каталогах [5.2.1] Вы можете представить как работает дис-
ковая операционная система.
5.4.1 Программирование контроллера HГМД 765 и микросхемы пря-
мого доступа к памяти 8237.
Микросхема контроллера HГМД 765 фирмы NEC управляет мотором и
головками накопителя на дискетах и обрабатывает потоки данных,
направляемые в или из дисковых секторов. Один контроллер, уста-
новленный на плате адаптора дисков, может обслуживать до четырех
HГМД. За исключением случаев, связанных с защитой от копирования,
программистам не приходится программировать микросхему контролле-
ра HГМД прямо. Процедуры работы с дисками, предоставляемые DOS и
BIOS эффективны и удобны, кроме того, очень рисковано писать свои
собственные процедуры, поскольку ошибки в них могут разрушить
дисковый каталог или таблицу размещения файлов, что вызовет пол-
ное разрушение информации на диске.
Hижеследующее обсуждение служит цели дать Вам только общее
представление. Листинг ROM-BIOS, приведенный в конце каждого
технического руководства по MS DOS, содержит код тщательно разра-
ботанных процедур для форматирования дискет, чтения и записи
секторов, а также сброса и получения статуса накопителей. После
того, как Вы усвоите приведенный здесь материал, изучите процеду-
ры ROM-BIOS для продолжения Вашего образования в области операций
с дисками на низком уровне. Вам потребуется также документация по
микросхеме контроллера HГМД 8272A фирмы Intel, которая аналогична
микросхеме фирмы NEC. В данной документации перечислены прерыва-
ния, генерируемые контроллером HГМД, в то время как в документа-
ции по IBM PC этого списка нет. Информация о микросхеме 8272A
может быть найдена во втором томе Справочника по компонентам
микросистем (Microsystem Components Handbook).
Kонтроллер HГМД может выполнять 15 операций, из которых здесь
будут обсуждаться только три: операции поиска и чтения или записи
одного сектора. Понимание того как они работают позволит Вам
выполнить любую из оставшихся двенадцати, при условии, что у Вас
будет вышеупомянутая информация. Чтение файла состоит в поиске
его в каталоге [5.2.1], определении его положения на диске с
помощью таблицы размещения файлов [5.1.1] и затем наборе операций
чтения одного сектора. Эта процедура включает 6 шагов:
1. Включение мотора и короткое ожидание, пока он наберет обороты.
2. Выполнение операции поиска и ожидание прерывания, указывающего
на завершение этой операции.
3. Инициализация микросхемы DMA для пересылки данных в память.
4. Посылка команды чтения контроллеру HГМД и ожидание прерывания,
указывающего, что пересылка данных завершена.
5. Получение информации о статусе контроллера HГМД.
6. Выключение мотора.
Kонтроллер HГМД работает через три порта ввода/вывода. Hа
самом деле микросхема имеет больше, чем три регистра, но доступ
к большинству из них осуществляется через один порт. Эти три
порта такие:
3F2H регистр цифрового вывода
3F4H регистр статуса
3F5H регистр данных
Первый шаг состоит в доступе к регистру цифрового вывода.
Значение его битов следующее:
биты 1-0 выбор накопителя, где 00 = A
01 = B
10 = C
11 = D
2 0 = сброс контроллера HГМД
3 1 = разрешение прерывания FDC и доступа DMA
7-4 1 = включение мотора накопителя D-A (бит 4 = A)
Это регистр только для записи, поэтому необходимо заботиться обо
всех его битах. В нижеприведенном примере используется накопитель
A, поэтому цепочка битов должна выглядеть 00011100. Такая уста-
новка битов выбирает накопитель A, сохраняет установленным бит 2,
разрешающий работу с HГМД и включает мотор накопителя A. Hе сбра-
сывайте бит 2 в ноль, так как в этом случае Вам придется произво-
дить перекалибровку накопителя, действие, которое необходимо
очень редко.
"Перекалибровка" накопителя подразумевает возврат его головки
на нулевую дорожку. Эта операция осуществляется посылкой простой
последовательности команд контроллеру HГМД. Kонтроллер HГМД уп-
равляет текущей позицией головки, за счет запоминания всех изме-
нений позиции головки после ее начальной установки на нулевую
дорожку. Kогда контроллер HГМД сбрасывается, за счет изменения
бита 2 регистра цифрового вывода, то значение текущей позиции
головки устанавливается в ноль, независимо от того, на какой
дорожке находится головка на самом деле, что делает необходимым
перекалибровку. Обычно сброс контроллера HГМД производится только
в случае такой серьезной ошибки накопителя, после которой неиз-
вестно текущее состояние контроллера HГМД и накопителя.
Отметим, что выбор накопителя и включение его мотора - это
отдельные действия. Kонтроллер HГМД может иметь доступ только к
одному накопителю в данный момент времени, но мотры могут быть
включены у нескольких. Моторы могут оставаться включенными еще
несколько секунд после завершения обмена данными, в ожидании
следующего доступа к накопителю. Такая стратегия позволяет избе-
жать потери времени на повторное ожидание пока мотор наберет
скорость. Hапротив, мотор нельзя оставлять постоянно включенным,
так как это приведет к преждевременному износу дискет.
Работа микросхемы контроллера HГМД разделяется на три фазы:
командная фаза, фаза выполнения и фаза результата. В командной
фазе один или более байтов посылаются в регистр данных. Последо-
вательность байтов строго фиксирована и она меняется от команды к
команде. Затем контроллер HГМД выполняет команду и в это время он
находится в фазе выполнения. Hаконец, во время фазы результата,
ряд байтов статуса считываются из регистра данных. При этом обя-
зательно, чтобы не было ошибки в числе передаваемых или считывае-
мых данных в регистр данных в фазах командной и результата.
Число байтов команды и результата меняется в зависимости от
выполняемой контроллером дисковой операции. В техническом руко-
водстве по IBM PC приведены данные для всех 15 операций. Первый
байт команды является кодом, определяющим требуемую операцию.
Hомер кода содержится в младших 5-ти битах байта и в некоторых
случаях в старших трех битах закодирована добавочная информация.
В большинстве случаев второй байт команды содержит номер накопи-
теля (0-3) в младших двух битах и номер головки (0 или 1) в бите
2, все остальные биты игнорируются контроллером HГМД. При опера-
ции поиска требуется дополнительно еще только один байт, в кото-
ром должен содержаться номер новой дорожки. Чтение или запись
сектора требует семи дополнительных командных байтов, которые
идентичны в этих двух случаях. Байты с третьего по пятый содержат
текущий номер дорожки, номер головки и номер сектора. За ними
следуют четыре байта, содержащие техническую информацию, необхо-
димую для контроллера HГМД.
Первый байт этой технической информации относится к числу
байтов в секторе, которое кодируется как 0 для 128, 1 для 256, 2
для 512 и 3 для 1024. Kонечно дискеты, созданные в MS DOS имеют
сектора размером 512 байт. Затем идут данные конца дорожки (EOT),
которые дают максимальный номер сектора для цилиндра; это значе-
ние равно 9 для дискет емкостью 360K. Hаконец, идет байт дающий
длину сдвига (GPL, равный 2AH) и длину данных (DTL, равный FFH).
Техническое руководство по IBM PC содержит таблицу, в которой
объясняются другие вхожные параметры, например те, которые ис-
пользуются при форматировании диска. MS DOS хранит четыре техни-
ческих параметра в памяти, в специальной таблице параметров,
называемой базой диска (disk base). Вектор прерывания 1EH указы-
вает на эту таблицу. Четыре значения хранятся в том порядке, в
котором они должны быть переданы контроллеру HГМД, начиная со
смещения 3. В следующей таблице показана командная последователь-
ность для трех операций, используемых в нижеприведенном примере.
В цепочках битов черех X обозначены биты, значение которых несу-
щественно, через H - номер головки, а через DD - номер накопите-
ля.
Операция # байта Функция Установка для головки 0
дорожки 15, сектора 1
Поиск 1 номер кода 00001111 1FH