РУКОВОДСТВО СИСТЕМНОГО ПРОГРАММИСТА I.2. Драйвер устройств внешней памяти RWTS (продолжение) 3. ПРОМЕЖУТОЧНЫЙ ИНТЕРФЕЙС RWTS 3.1. Промежуточный уровень представления данных 3.1.1. Общие сведения Организация данных на этом уровне непосредственно связа- на с процедурами доступа к ним, т.к. именно набор допусти- мых действий характеризует тип устройства. Внешняя память делится на треки (не более 65535). Доступ к треку (позиционирование) - прямой по номеру, выполняется отдельной программой в драйвере и по времени некритичен. Трек состоит из блоков (не более MAXSECT=24), имеющих локальные номера внутри трека, начиная с 0. Доступ к блокам трека - последовательно-циклический: после блока N доступен блок (N+1+K)mod(размер трека). K - константа пробуксовки - может быть различной для чтения и для записи и зависит от устройства. Необходимость введения пробуксовки - в том, что доступ к блоку может быть критичен по времени, и из-за по- тери времени при возможной перекодировке данных можно не успеть к началу следующего блока. Из-за пробуксовки после- довательный доступ к блокам не всегда выгоден: более эффек- тивное выполнение работы дает механизм отсрочки, когда об- рабатывается первый попавшийся блок из списка отсроченных. Доступ к блоку осуществляется в два приема. Сначала вы- зывается программа чтения адреса, выдающая номер блока, го- тового для обработки, и ведущая попутный контроль номеров тома носителя и трека. Затем для этого блока выполняется заказанный обмен (если есть): чтение или запись данных. Предусмотрена также программа начальной разметки трека пус- тыми (обнуленными) блоками. 3.1.2. Конкретизация для дисководов В рассмотренную выше схему естественно ложатся традици- онные принципы работы с диском. Блок (сектор) записывается в виде двух полей: поля адре- са и поля данных с интервалами (gap'ами) между ними, нужны- ми и достаточно большими для того, чтобы RWTS успела выпол- нить промежуточную обработку. Поле адреса содержит номера сектора в треке, трека и то- ма носителя. Программа чтения просто считывает поле адреса и выдает эти три номера. Затем, при наличии заказанного об- мена, вызываются программы чтения или записи поля данных. Поскольку чтение и запись с диска - операции, критичные по времени, время подготовки к обмену может варьироваться, а скорость вращения диска - меняться, то информация на тре- ке может "плавать". Чтобы предотвратить "дрейф" сектора по треку и наползание одного сектора на другой, во время раз- метки трека записываются заранее рассчитанные интервалы, поля адреса и обнуленные поля данных. В дальнейшем переза- писываются только поля данных, поэтому начало и размер сек- тора остаются сравнительно неизменными: "хвост" сектора хо- тя и "плавает", но сильный дрйф предотвращается. 3.1.3. Конкретизации для других устройств Для "электронных" дисков, распределенной памяти и т.п. возможно реализовать прямой доступ к сектору. В этом случае соображения о пробуксовке теряют смысл. Чтение адреса блока может утратить реальный смысл и свестись к последовательно- му перебору блоков "трека" и росписи требуемых параметров. 3.2. Стандарт промежуточного интерфейса RWTS 3.2.1. Область применения стандарта Стандарт промежуточного интерфейса фиксирует все, что необходимо соблюдать системному программисту при создании драйвера нового устройства с целью настройки на него RWTS: - достаточный набор количественных параметров устройства; - достаточный набор действий, выполняемых подпрограммами драйвера; - спецификацию интерфейса драйвера с ядром RWTS; - требования к оформлению, размещению в памяти и подключе- нию драйвера. 3.2.2. Драйвер обобщенного устройства Драйвер - это набор процедур, реализующих управление и доступ к данным для конкретного устройства. В драйвер выне- сена вся устройство-зависимая работа RWTS. С учетом сказанного в 3.1, драйвер обобщенного устройст- ва образуют 7 программ следующего назначения: - включение устройства; - выключение устройства; - позиционирование к треку; - чтение адреса блока; - чтение данных блока; - запись данных блока; - разметка трека. 3.2.3. Сменная таблица характеристик устройства Вся информация, необходимая для настройки RWTS на кон- кретное устройство, сведена в таблицу характеристик DCT для удобства прямого доступа. Параметры в таблице имеют следую- щие длину (в байтах) и смысл: DCT.TYPE (1) - код типа устройства (общесистемный); DCT.SIDE (1) - число "сторон" носителя (для дисководов [7]=0/1 означает 1/2 стороны, вообще имеет смысл, приданный в драйвере); DCT.TSIZE (1) - размер трека в блоках; DCT.DSIZE (2) - размер тома в треках (по всем сторонам); DCT.WRSKIP (1) - число блоков пробуксовки при записи; DCT.RDSKIP (1) - число блоков пробуксовки при чтении; DCT.DISKON (3) - вектор программы включения устройства; DCT.DISKOFF (3) - вектор программы выключения устройства; DCT.SEEK (3) - вектор программы позиционир-я к треку; DCT.GETADRES (3) - вектор программы чтения адреса блока; DCT.GETDATA (3) - вектор программы чтения данных блока; DCT.PUTDATA (3) - вектор программы записи данных блока; DCT.FORMAT (3) - вектор программы разметки трека. Все параметры, кроме первых четырех, являются характери- стиками драйвера, а четыре первых могут характеризовать сменный носитель, если драйвер это допускает. Это позволяет расширить класс однородных устройств: например, все MFM- диски с разным числом треков, "электронные" диски разной емкости и др. Параметры, характеризующие носитель, хранятся также в его DPB в 0-м блоке. 3.2.4. Оформление, настройка и размещение драйвера Для настройки RWTS на драйвер, необходимо: - составить паспорт драйвера, т.е. заполнить таблицу DCT характеристиками и векторами данного драйвера; - поместить эту таблицу в начало драйвера - ее начало счи- тается адресом драйвера; - поместить адрес драйвера в любую свободную позицию DDEF- TAB, индекс этой позиции - в MEDIA+N-1, где N - номер физического устройства, выбранный для этого драйвера; - заполнить N-1 позиции таблиц настройки SLOTS и DRIVES значениями, соответствующими их смыслу для данного драйвера. На размещение драйвера в памяти накладывается единствен- ное ограничение: таблица его характеристик и программы по входным векторам должны располагаться в видимой RWTS памяти (непараллельно банку RAM1). Для поиска места и загрузки драйвера в память может быть создан специальный инсталлятор. 3.2.5. Описание интерфейса драйверных программ Драйверы могут использовать статические (в т.ч. только при включенности устройства) таблицы: DCT, IOB (входные па- раметры внешнего программного интерфейса), ячейки текущего устройства SLOT, DRIVE, CURTREK, TABTREK - все в строгом соответствии с описанным интерфейсом и без права изменения. Драйверы не должны обращаться к таблицам настройки и от- срочки, менять содержимое ячеек SECTORS, RECLBR, RETROP, RETRY, CURSECT, которые должны сохранять значение в ядре RWTS во время работы драйвера; а также использовать ячейки и программы вне RWTS. Для рабочих нужд можно пользоваться ячейками 0-й страницы 0-F, сохраняемой рабочей области RWTS. Часть из них имеет целевое назначение (передача информации из/в типовой драйвер). Кодом физической ошибки может быть любая информация (1б). 3.2.5.1. DCT.DISKON - включение устройства вход: N = IOB.ACTION[7] = 0/1 - с/без проверки наличия устройства; выход: C = 0/1 - нет ошибки / ошибка включения. 3.2.5.2. DCT.DISKOFF - выключение устройства вход: нет; выход: нет; сохраняет C,Y. 3.2.5.3. DCT.SEEK - позиционирование к треку вход: Y = номер нужного трека (из TABTREK) C = 0/1 - без/с рекалибровкой; выход: нет. Поддерживает CURTREK (2 байта) - положение позиционера. 3.2.5.4. DCT.GETADRES - чтение адреса блока вход: нет выход: C = 0 - нет ошибок: RDSECT,RDTREK,RDVOLM - сектор, трек, том первого попавшегося блока; C = 1 - ошибка: A - код ошибки физической ошибки. 3.2.5.5. DCT.GETDATA - чтение поля данных блока вход: BUFFER = адрес буфера, CURSECT = номер сектора для сверки при контрольном чтении адреса; выход: CHSUM = контрольная сумма данных, C = 0 - нет ошибки: в (BUFFER) - данные, C = 1 - ошибка: A - код физической ошибки. 3.2.5.6. DCT.PUTDATA - запись поля данных блока вход: (BUFFER) - данные; выход: CHSUM - контрольная сумма данных, C = 0 - нет ошибки, C = 1, Z = 1 - носитель защищен от записи, Z = 0, A - код другой ошибки; Сама включает и выключает режим записи. 3.2.5.7. DCT.FORMAT - разметка трека вход: RDTREK, RDVOLM - трек и том носителя для разметки; выход: C = 0 - нет ошибки, C = 1 - защищен. Сама включает и выключает режим записи.