Научно-технический кооператив "Спрайт" г. Новосибирск 1992 ОПЕРАЦИОННАЯ СИСТЕМА "С П Р А Й Т" (версия 1.3) РУКОВОДСТВО СИСТЕМНОГО ПРОГРАММИСТА I.2. Драйвер устройств внешней памяти RWTS СОДЕРЖАНИЕ 1. ОБЩИЕ СВЕДЕНИЯ 2. ВНЕШНИЙ (ТИПОВОЙ) ИНТЕРФЕЙС RWTS 2.1. Абстрактные устройства 2.1.1. Общие свойства 2.1.2. Конкретизация для дисководов 2.1.3. Конкретизации для других устройств 2.2. Стандартный внешний программный интерфейс RWTS 2.2.1. Область применения стандарта 2.2.2. Вызовы RWTS 2.2.3. Обращение и входные данные 2.2.4. Выходные данные 2.2.5. Вектор перехвата ошибок 2.2.6. Вектор смены диска 2.2.7. Признак проверки записи 2.3. Стандартный внешний системный интерфейс RWTS 2.3.1. Область применения стандарта 2.3.2. Настройка устройств 2.3.3. Текущее состояние обмена 2.3.4. Порядок обработки общего сброса 3. ПРОМЕЖУТОЧНЫЙ ИНТЕРФЕЙС RWTS 3.1. Промежуточный уровень представления данных 3.1.1. Общие сведения 3.1.2. Конкретизация для дисководов 3.1.3. Конкретизации для других устройств 3.2. Стандарт промежуточного интерфейса RWTS 3.2.1. Область применения стандарта 3.2.2. Драйвер обобщенного устройства 3.2.3. Сменная таблица характеристик устройства 3.2.4. Оформление, настройка и размещение драйвера 3.2.5. Описание интерфейса драйверных программ Приложение. Модуль программной спецификации интерфейса RWTS (в файле \SYSTEM\DEFINES\RWTS.DEF) 1. ОБЩИЕ СВЕДЕНИЯ RWTS является программой-драйвером устройств внешней па- мяти. Она состоит из ядра и сменных драйверов устройств. В RWTS выделены три уровня представления устройства: - физический: физические устройства, представленные сред- ствами управления их контроллерами через адресное про- странство ввода-вывода ПЭВМ, или программные модели виртуальных устройств; все управление ими с целью орга- низации хранения данных сосредоточено в драйвере; - обобщенный: представление устройств в виде совокупности стандартных характеристик и процедур, реализующих сред- ства доступа более высокого уровня, описываемой унифи- цированным для всех устройств "паспортом"; реализация этого представления накладывает ряд требований на внут- реннюю структуру и функциональные свойства драйвера; - абстрактный: представление устройства в виде абстрактно- го линейного массива блоков памяти с функциями поблоч- ного обмена; настройка и реализация средствами обобщен- ного представления конкретного устройства сосредоточены в типовом ядре. Таким образом, все разнообразие внешней памяти сводится к одному абстрактному типу. Ядро RWTS является универсаль- ным типовым драйвером, реализующим абстрактное типовое представление с помощью обобщенных описаний устройств, реа- лизуемых, в свою очередь, на физическом уровне конкретными драйверами. Ядро RWTS имеет, т.о., два интерфейса: внешний, для пользования абстрактным устройством, и промежуточный, для подключения новых драйверов. Ниже приводятся стандартные спецификации обоих интерфей- сов и сведения по их настройке для конкретных устройств. 2. ВНЕШНИЙ (ТИПОВОЙ) ИНТЕРФЕЙС RWTS 2.1. Абстрактные устройства 2.1.1. Общие свойства С точки зрения пользователя RWTS, абстрактное устройст- во - это внешняя память, устроенная по типу диска (блочные структура и обмен, последовательно-прямой доступ к блоку). Память представляется линейным массивом блоков, имеющих в нем сквозную целочисленную нумерацию (адреса), начиная с 0. Блоки можно читать в ОЗУ или записывать из ОЗУ целиком. Принято дополнительное подразделение массива блоков на "треки" - линейные участки равной длины (весь массив должен состоять из целого числа треков). Понятие трека обобщено для всех устройств по аналогии с дисками и имеет содержа- тельный смысл единицы памяти, внутри которой реализуется последовательный доступ к блоку, в то время как доступ к самим трекам - прямой. Впрочем, реальный смысл треку прида- ется конкретным драйвером. RWTS позволяет отрабатывать обращение к памяти в т.н. "ленивом" режиме, т.е. с отсрочкой фактического исполнения чтения-записи. Отсрочка выполняется в пределах обработки одного трека и служит обычно для оптимизации обработки бло- ков при последовательном доступе. Если команда RWTS задана с отсрочкой, то фактический обмен откладывается до: - обращения к блоку из другого трека, - повторного обращения к тому же блоку, - явного выключения данного устройства или обращения к другому устройству. Решение проблем подключения нужных сегментов памяти, со- хранения данных для записи на время отсрочки, использования считанных данных только после их фактического поступления, потери всего отсроченного обмена при ошибке и др. оставля- ется пользователю. RWTS позволяет работать поочередно с несколькими устрой- ствами, различаемых своими логическими номерами. Внутри эти номера заменяются физическими, согласно ассоциациям, по ко- торым затем происходит настройка на конкретные драйверы. При любом обращении к устройству оно включается (выпол- няется некоторая процедура инициализации). Выключение (ана- логичная процедура) происходит в двух случаях: - при явном указании команды выключения; - при обращении к другому устройству. Таким образом, в каждый момент времени только одно уст- ройство может быть включено. Здесь оно будет называться те- кущим (не путать с текущим устройством в ДОС!). Устройство может иметь сменные носители информации (то- ма), различающиеся индивидуальными номерами. RWTS позволяет контролировать, что обмен выполняется с нужным томом. 2.1.2. Конкретизация для дисководов Блокам обычно соответствуют сектора на диске, трекам - дорожки, томам - сменные диски. "Ленивый" режим эффективен при чтении-записи файлов (которые обычно хранятся более-ме- нее последовательно). Невыключение дисковода до завершения всей накопленной работы позволяет экономить время на разго- не мотора. 2.1.3. Конкретизации для других устройств По описанной схеме могут быть реализованы также: - "электронный" диск в дополнительной памяти (для него по- нятия включения, выключения и "ленивости" вырождаются); - распределенная по сети внешняя память, в которой роль трека играет адрес удаленной файловой станции, или же трек имеет смысл буфера для обмена; включение и выклю- чение могут иметь смысл захвата и освобождения канала связи. 2.2. Стандартный внешний программный интерфейс RWTS 2.2.1. Область применения стандарта Стандарт внешнего программного интерфейса применяется к абстрактному устройству внешней памяти и фиксирует: - набор вызовов (выполняемых действий) RWTS; - набор входных и выходных параметров, нужных для реализа- ции вызовов; - спецификацию параметров; - спецификацию обращения. Нестандартное использование параметров, передача на вход и возврат другой информации, а также дополнительные вызовы со своими интерфейсами допускаются только в специализиро- ванных программах, использующих особенности конкретного устройства. 2.2.2. Вызовы RWTS Вызовы и их коды таковы: C_DO (0) - завершить отсроченные работы и выключить уст- ройство; также просто выключить устройство; C_DO_D (1) - завершить отсроченные работы и оставить уст- ройство; также просто включить устройство; C_RD (2) - считать блок без отсрочки; C_RD_D (3) - считать блок с отсрочкой; C_WR (4) - записать блок без отсрочки; C_WR_D (5) - записать блок с отсрочкой; C_FORM (6) - разметить трек. Кроме того, 7 бит кода вызова = 0/1 - с/без проверки на- личия устройства (носителя). 2.2.3. Обращение и входные данные Входная точка RWTS - адрес BE00 в RAM1. Входные данные RWTS передаются через таблицу параметров IOB, находящуюся в адресах A000-A00A RAM1 (в скобках даны размеры в байтах): *IOB.CURDRV (1) - номер текущего (включенного) устройства или 0, если все выключены; IOB.DRIVE (1) - номер устройства, заказанного для обмена; IOB.VOLUME (1) - номер тома требуемого носителя (0 - без контроля носителя); IOB.BLOCK (2) - номер блока для обмена; IOB.BUFFER (2) - адрес 256-байтового буфера данных в ОЗУ; IOB.ACTION (1) - код вызова RWTS (см. 2.2.2); *IOB.ACTVOL (1) - номер тома установленного носителя; IOB.EXTRA (2) - резерв, для расширений. Помеченные параметры RWTS поддерживает сама, остальные не изменяет. При разметке трека (вызов C_FORM) в IOB.BLOCK передается N трека, а IOB.BUFFER[7]=0/1 - без/с рекалибровкой головки (для дисководов). При записи блока в буфере данных по адресу IOB.BUFFER передаются 256 байтов записываемых данных. 2.2.4. Выходные данные RWTS возвращает: - C=0, Y=A=0 - при успешном окончании обмена; C=1, Y=A=код ошибки - если была ошибка; - IOB.ACTVOL - номер текущего носителя на устройстве; - IOB.CURDRV = IOB.DRIVE или 0, если устройство выключено; Сохраняется значение бита I в слове состояния процессора, но внутренние прерывания IRQ и NMI всегда выключаются и не восстанавливаются. Коды ошибок RWTS: 1 - несовпадение номера заказанного тома носителя с фактическим (при включенном контроле), 2 - общая ошибка обмена, 3 - попытка записи на защищенный носитель. Следует учитывать, что при отсрочке работ по вызовам ошибка обмена может возникнуть только в процессе фактичес- кой отработки, т.е. с запозданием; при этом точное опреде- ление блока, при обработке которого произошла ошибка, воз- можно только путем разбора специальных таблиц (см.2.3.3.2). При ошибке обмена часть отсроченных действий может пропасть. 2.2.5. Вектор перехвата ошибок В RWTS выделен вектор H_CHKERR, содержащий адрес про- граммы-обработчика ошибок обмена еще в контексте цикла от- работки отсрочки RWTS. Контекст вызова позволяет, в частно- сти, повторить обработку (например, запись на защищенный диск после снятия защиты). Программа-обработчик имеет следующий интерфейс: на входе: A=1-3 - N ошибки (см.2.2.4); в стеке: 2 б. - адрес возврата в контекст вызова; 2 б. - возврат из TREKPROC, 1 б. - регистр P на входе в RWTS с битом I, 2 б. - адрес возврата из RWTS; на выходе: Z=1 - повторить попытку обмена, Z=0,C=0,Y=0 - игнорировать ошибку, Z=0,C=1,Y=2 - возврат с ошибкой 2. Стандартная реакция устанавливается Командером и предус- матривает выдачу сообщения об ошибке и запрос продолжения, повторения или возврата с ошибкой. Настройка вектора произ- водится спецвходом Командера (SETVECTOR). 2.2.6. Вектор смены диска Еще один вектор RWTS - H_INSTDR - вызывается при обраще- нии к "спаренному" логическому устройству (т.е. имеющему один физический номер с другим), если последнее обращение было не к нему. Программа-обработчик получает на входе: X - физический N у-ва, Y - логический. Стандартный обработчик, устанавливаемый Командером, вы- дает сообщение 'ВСТАВЬТЕ ДИСК Y: В УСТРОЙСТВО X' и ждет на- жатия любой клавиши. Вектор настраивается так же. 2.2.7. Признак проверки записи Признак VFYWRITE в теле RWTS управляет режимом VFY (кон- трольное считывание каждого записанного блока). Изменение признака достигается прямой записью в ячейку VFYWRITE ново- го значения: A9 - режим сброшен, E9 - режим установлен. 2.3. Стандартный внешний системный интерфейс RWTS 2.3.1. Область применения стандарта Стандарт внешнего системного интерфейса фиксирует все, что необходимо для системной поддержки RWTS: - спецификацию параметров настройки; - порядок настройки устройств; - спецификацию параметров текущего обмена (текущее устрой- ство и отсрочка); - порядок обработки общего сброса во время работы RWTS. 2.3.2. Настройка устройств 2.3.2.1. Максимальное число типов устройств (различных драйверов), на которые можно настроить RWTS, определяется размером таблицы драйверов DDEFTAB в рабочей области RWTS, который задан системной константой MAXDCT=8. В DDEFTAB хранятся адреса паспортов драйверов каждого типа. Таблица индексируется четным номером типа -2. Нулевой адрес означает отсутствие драйвера. 2.3.2.2. Максимальное число физических устройств, обслу- живаемых RWTS (часть их может обслуживаться общими драйве- рами), определяется размером таблиц настройки RWTS, который задан системной константой MAXDRN=8. Таблиц настройки пять: - MEDIA - коды типов драйверов (смещения в DDEFTAB, /=0); - SLOTS, DRIVES - номера разъемов и приводов; - CTREKS, CTREKSH - номера текущих треков (по 2 байта). Таблицы индексируются однобайтовым номером физического устройства. Номера разъема (на генплате ПЭВМ) и привода (на плате контроллера) определяют место подключения физического уст- ройства и используются только в его драйвере (обычно хра- нятся разъем * 16 и привод = 0/1). Смысл разъема и привода для виртуальных устройств произволен. Текущий трек - это некоторая информация о текущем состо- янии устройства (для дисководов это положение головки пози- ционера). В CTREKS, CTREKSH она сохраняется на время выклю- чения устройства, а при включении переписываются в ячейки прямого доступа. Используется только в драйверах. Таблицы DDEFTAB, MEDIA, SLOTS, DRIVES заполняются во время загрузки системы при составлении рабочей конфигурации устройств и в дальнейшем не меняются. 2.3.2.3. Максимальное число логических устройств (часть которых может быть ассоциировано с одними и теми же физи- ческими) задано системной константой MAXLDR=8, определяющей размер таблицы ассоциаций LOGPHYS, в которой для каждого логического устройства указывается физический номер. Ассоциации в LOGPHYS меняются динамически вызовом ДОС SELDRIVE. Таблица LASTLDR размером MAXDRN задает обратное соответ- ствие: последнее по времени обращения логическое устройство с данным физическим номером. Таблица поддерживается динами- чески по ходу работы самой RWTS (вектор H_INSTDR срабатыва- ет именно тогда, когда одно из полей LASTLDR меняется). 2.3.3. Текущее состояние обмена Текущее состояние обмена определяется состоянием текуще- го устройства и незавершенной работой (отсрочкой). 2.3.3.1. Номер текущего (включенного) устройства хранит- ся в IOB.CURDRV; если там 0, то все устройства выключены и отсрочки нет. Ячейки SLOT, DRIVE, CURTREK и TABTREK содержат, соот- ветственно, разъем, привод и текущий трек текущего устрой- ства (из SLOTS, DRIVES, CURTREKS,H) и трек текущей отсрочки. TABTREK используется только в ядре RWTS и определяется по номеру блока для обмена. SLOT, DRIVE и CURTREK используются только в драйверах. 2.3.3.2. Размер отсрочки ограничен величиной трека. Мак- симальный размер трека определяетя размером таблиц отсрочки RWTS и задан системной константой MAXSECT=24. Размер текущей отсрочки (число блоков) хранится в ячейке SECTORS. Информация об отсрочке хранится в таблицах: - TCOMS - код отсроченного обмена: 1-чтение, 2-запись, 0- обмен не задан/завершен; - TBUF1,2 - младшие и старшие байты адресов буферов (из IOB.BUFFER); - TCSUM - контрольные суммы блоков, выдаются драйверами при обмене; здесь же: - TERRS - коды драйверных ошибок обработки блоков. Нормальное состояние "отсрочки нет" - нули в SECTORS и во всей TCOMS. Отсрочка сбрасывается при выключении устройства и по лю- бой ошибке (при этом тоже происходит выключение). Для более подробного анализа ошибки программы могут использовать вы- одную информацию из TCSUM. 2.3.4. Порядок обработки общего сброса Сигнал общего сброса может фактически выключить текущее устройство, поэтому в системной реакции на сброс необходимо предусмотреть и формальное выключение: обнулить IOB.CURDRV и сохранить текущий трек. Сброс отсрочки произойдет при первом же включении любого устройства.