  
                             
 
 
   Утвержден
 
   2б.00152-01 97 07-2-ЛУ
 
 
 
 
 
 
 
 
 
 
 
 
 
 
                  Операционная система  МОС ВП
   
                 Подсистема системного сервиса
  
             Р А З Р А Б О Т К А   Д Р А Й В Е Р О В 
 
                     Руководство оператора
 
                       2б.00152-01 97 07-2
 
                          Листов 308/4К
  
  
  
  
    
   
   
 
 
  
  
  
   1K  
   5K  
   304К  
   305К 
  
  
  
  
  
  
  
  
                              1987 
 
     Перв. примен.                              Литера
     2б.00152-01
 
 
 
 
 
 
 
 
  
  
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
                  Операционная система  МОС ВП
   
                 Подсистема системного сервиса
  
            Р А З Р А Б О Т К А   Д Р А Й В Е Р О В
 
                     Руководство оператора
 
                       00152-01 97 07-2
 
                          Листов 304
  
  
  
  
    
   
   
 
 
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
                              1987 
 
 
 
 
                             - 2 -
 
                        00152-01 97 07-2
 
 
 
 
 
 
                            АННОТАЦИЯ
 
 
 
 
 
        Данный документ предназначен для  системного  програм-
 
   миста. В документе описывается загрузка драйверов в систему
 
   МОС ВП. В приложении описывается база данных ввода/вывода и
 
   точки входа в драйвер. В документе рассмотрены  стандартные
 
   программы и макросы МОС ВП, которые могут вызываться  драй-
 
   верами и  перечислены  начальные  физические  адреса  общей
 
   шины. В качестве образца для написания  содержится  драйвер
 
   устройства преобразования сигнала  из  аналоговой  формы  в
 
   цифровую. В конце документа приведен словарь основных  тер-
 
   минов, относящихся к вводу/выводу и драйверу.
 
 
        Справочный  материал,   содержащийся   в   приложении,
 
   является важным пособием при написании и загрузке драйверов
 
   устройств, не поддерживаемых системой МОС ВП.
 
 
 
 
 
 
 
 
                             - 3 -
 
                        00152-01 97 07-2
 
 
 
 
 
 
                           СОДЕРЖАНИЕ
 
 
 
 
 
   1.  ЗАГРУЗКА ДРАЙВЕРА УСТРОЙСТВА                          6
 
 
   1.1.    Подготовка к загрузке                             6
 
   1.2.    Загрузка драйвера                                 7
 
   1.2.1.    Команда LOAD                                    8
 
   1.2.2.    Команда CONNECT                                10
 
   1.2.3.    Команда RELOAD                                 16
 
   1.2.4.    Команда SHOW/ADAPTER                           18
 
   1.2.5.    Команда SHOW/CONFIGURATION                     19
 
   1.2.6.    Команда SHOW/DEVICE                            20
 
   1.3.    Автоконфигурация                                 21
 
   1.3.1.    Средство автоконфигурации в SYSGEN             21
 
   1.3.2.    Таблица устройств SYSGEN                       22
 
   1.3.3.    Управление автоконфигурацией  драйвером
 
             устройства                                     27
 
   1.3.4.    Вычисление плавающего адреса вектора           29
 
   1.3.5.    Вычисление плавающего адреса CSR               29
 
   1.3.6.    Правила для конфигурации                       30
 
   1.3.7.    Пример конфигурации общей шины                 31
 
 
   2.  ОТЛАДКА ДРАЙВЕРА УСТРОЙСТВА                          32
 
 
   2.1.    Начальная  загрузка  системы  вместе  с
 
           XDELTA                                           32
 
   2.1.1.    Действия от начальной точки останова           34
 
   2.2.    Загрузка драйвера                                34
 
 
 
                             - 4 -
 
                        00152-01 97 07-2
 
 
   2.3.    Помещение  точек  останова  в  исходную
 
           программу                                        35
 
   2.4.    Вычисление базы драйверного кода                 37
 
   2.5.    Запрос программного прерывания XDELTA            38
 
   2.6.    Обзор таблицы векторов переходов                 38
 
   2.7.    Установка базового регистра XDELTA               39
 
   2.8.    Разрушение содержимого регистров                 41
 
   2.9.    Проверка блоков UCB, IRP, а также PSL            42
 
   2.10.   Команды XDELTA                                   43
 
   2.10.1.   Значения и выражения                           44
 
   2.10.2.   Специальные символы                            44
 
   2.10.3.   Операторы                                      45
 
   2.10.4.   Команда открытия и индикации значении          45
 
   2.10.5.   Команда индикации инструкции                   46
 
   2.10.6.   Команда закрытия и индикации  следующей
 
             ячейки                                         47
 
   2.10.7.   Команда индикации зоны                         48
 
   2.10.8.   Косвенная команда                              48
 
   2.10.9.   Команда индикации предшествующей ячейки        49
 
   2.10.10.  Команда показа значения                        49
 
   2.10.11.  Команда шаг по инструкции                      50
 
   2.10.12.  Команда   шаг   по   инструкции   через
 
             подпрограмму                                   51
 
   2.10.13.  Установка точек останова                       51
 
   2.10.14.  Сброс точек останова                           52
 
   2.10.15.  Индикация списка точек останова                53
 
   2.10.16.  Установка базовых регистров                    53
 
   2.10.17.  Продолжение работы от точки останова           54
 
   2.10.18.  Загрузка РС и продолжение                      54
 
   2.10.19.  Управление режимом индикации                   55
 
 
                             - 5 -
 
                        00152-01 97 07-2
 
 
   2.10.20.  Команда выполнения строки                      56
 
   2.10.21.  Установка сложных точек останова               58
 
   2.10.22.  Команды, сохраняемые в XDELTA                  58
 
   2.10.23.  Сохраняемые базовые регистры                   59
 
   2.11.   DELTA                                            60
 
   2.11.1.   Команда выхода                                 60
 
   2.11.2.   Чтение и изменение ячеек в пространстве
 
             процесса                                       60
 
   2.12.   Общее  указание  по  отладке  драйверов
 
           устройств                                        61
 
   2.12.1.   Обращения к системным адресам                  61
 
   2.12.2.   Открытие регистров устройства в XDELTA         62
 
   2.12.3.   Некорректное обращение к регистрам             62
 
   2.12.4.   XDELTA и сбои системы                          62
 
 
   Приложение 1. База данных ввода/вывода                   64
 
 
   Приложение 2. Макросы МОС ВП, вызываемые драйверами     127
 
 
   Приложение 3. Программы операционной системы МОС ВП     154
 
 
   Приложение 4. Точки входа в драйвер устройства          232
 
 
   Приложение 5.
 
       Пример       драйвера       аналого-цифрового
 
       преобразователя                                     255
 
 
   Приложение 6. Основные термины                          276
 
 
   Приложение 7. Перечень принятых сокращений              302
 
 
 
 
   ПЕРЕЧЕНЬ ССЫЛОЧНЫХ ДОКУМЕНТОВ                           304
 
 
 
 
                             - 5К -
 
                        00152-01 97 07-2
 
 
   2.10.20.  Команда выполнения строки                      58
 
   2.10.21.  Установка сложных точек останова               59
 
   2.10.22.  Команды, сохраняемые в XDELTA                  59
 
   2.10.23.  Сохраняемые базовые регистры                   61
 
   2.11.   DELTA                                            61
 
   2.11.1.   Команда выхода                                 61
 
   2.11.2.   Чтение и изменение ячеек в пространстве
 
             процесса                                       62
 
   2.12.   Общее  указание  по  отладке  драйверов
 
           устройств                                        62
                                                              
   2.12.1.   Обращения к системным адресам                  63
 
   2.12.2.   Открытие регистров устройства в XDELTA         63
 
   2.12.3.   Некорректное обращение к регистрам             63
 
   2.12.4.   XDELTA и сбои системы                          64
 
 
   Приложение 1. База данных ввода/вывода                   65
 
 
   Приложение 2. Макросы МОС ВП, вызываемые драйверами     128
 
 
   Приложение 3. Программы операционной системы МОС ВП     155
 
 
   Приложение 4. Точки входа в драйвер устройства          232
 
 
   Приложение 5.
 
       Пример       драйвера       аналого-цифрового
 
       преобразователя                                     255
 
   Приложение 6. Основные термины                          276
 
 
   Приложение 7. Перечень принятых сокращений              302
 
 
   ПЕРЕЧЕНЬ ССЫЛОЧНЫХ ДОКУМЕНТОВ                           304 
 

   ПЕРЕЧЕНЬ ССЫЛОЧНЫХ ДОКУМЕНТОВ                           304К
 
                                                             
 
                             - 6 -
 
                        00152-01 97 07-2
 
 
                1. ЗАГРУЗКА ДРАЙВЕРА УСТРОЙСТВА
 
 
 
 
        Драйвер устройства,  написанный  пользователем,  можно
 
   загрузить в любое время после начальной  загрузки  системы.
 
   Если драйвер содержит ошибку и эта ошибка не вызывает  раз-
 
   рушения или искажения операционной системы, необходимо исп-
 
   равить ошибку и перезагрузить новую версию драйвера.
 
 
 
        1.1. Подготовка к загрузке
 
 
 
        При загрузке драйвера устройства, выполняются  следую-
 
   щие действия:
 
 
        - драйвер устройства записывается в  одном  или  более
 
   исходных файлах.  Если  драйвер  размещается  в  нескольких
 
   исходных файлах, надо вставить директиву .PSECT перед  каж-
 
   дой генерируемой программой во всех файлах, за  исключением
 
   файла, который содержит вызовы макрокоманд DPTAB  и  DDTAB.
 
   Должна быть использована следующая PSECT:
 
 
              .PSECT   $$$115_DRIVER
 
 
        Если драйвер содержится в одном файле, не нужно указы-
 
   вать директив .PSECT. Об'явление  макрооператоров  DPTAB  и
 
   DDTAB правильно устанавливает драйверные  программные  сек-
 
   ции;
 
 
        - оттранслируйте исходный файл (или файлы) с системной
 
   библиотекой макрокоманд (SYS$LIBRARY:LIB.MLB). Например:
 
 
        $ MACRO MYDRIVER.MAR+SYS$LIBRARY:LIB.MLB/LIBRARY
 
 
 
 
                             - 7 -
 
                        00152-01 97 07-2
 
 
        - свяжите об'ектный файл с таблицей глобальных  симво-
 
   лов операционной системы, которая размещается в  SYS$SYSTEM
 
   и называется SYS.STB. Если драйвер  состоит  из  нескольких
 
   исходных файлов, вы должны указать файл,  который  содержит
 
   прологовую таблицу драйвера, в  качестве  первого  файла  в
 
   списке. Файл необязательных параметров компоновщика  должен
 
   содержать  оператор  BASE,  указывающий  нулевую  базу  для
 
   выполняемого образа. В следующем примере показано  создание
 
   файла необязательных параметров и команда LINK,  используе-
 
   мая для компоновки драйвера:
 
 
        $ CREATE MYDRIVER.OPT
 
        BASE=0
 
       <CTRL Z>
 
        $ LINK /NOTRACE MYDRIVER1[,MYDRIVER2,...],-
 
                MYDRIVER.OPT/OPTIONS,-
 
                SYS$SYSTEM:SYS.STB/SELECTIVE_SEARCH
 
 
        Результирующий  образ  должен  содержать  единственную
 
   секцию образа. Линкер сообщит, что образ не содержит  адре-
 
   сов передачи.
 
 
 
        1.2. Загрузка драйвера
 
 
 
        После выполнения  компоновки  драйвера  корректно,  он
 
   готов к загрузке. Чтобы  загрузить  драйвер  в  виртуальную
 
   память системы, надо  вызват  программу  генерации  системы
 
   (SYSGEN) со счетом администратора системы или любым другим,
 
   имеющим привилегию изменения режима на режим ядра.  Исполь-
 
   зуется следующая команда:
 
 
 
 
                             - 8 -
 
                        00152-01 97 07-2
 
 
        $ RUN SYS$SYSTEM:SYSGEN
 
 
        SYSGEN ответит подсказкой и будет ожидать  дальнейшего
 
   ввода:
 
 
        SYSGEN>
 
 
        В документе [1] описывается полный набор команд  гене-
 
   рации системы. Для загрузки драйверов используются  следую-
 
   щие команды:
 
 
        - LOAD - загрузить (требует привилегии  для  изменения
 
   режима на режим ядра - CMKRNL);
 
 
        - CONNECT - соединить (требует привилегии CMKRNL);
 
 
        - RELOAD - перезагрузить (требует привилегии CMKRNL);
 
 
        - SHOW/ADAPTER - показать адаптер (требует  привилегии
 
   CMEXEC);
 
 
        - SHOW/CONFIGURATION - показать конфигурацию  (требует
 
   привилегии смехес);
 
 
        - SHOW/DEVICE - показатель устройство (требует  приви-
 
   легии CMEXEC).
 
 
        Средства автоматической конфигурации SYSGEN описывают-
 
   ся в подразделе 1.3.
 
 
 
        1.2.1. Команда LOAD
 
 
 
        Чтобы загрузить драйвер устройства, используйте коман-
 
   ду LOAD. Если контроллер имеет только одно присоединенное к
 
   нему устройство, используйте команду CONNECT.
 
 
                             - 9 -
 
                        00152-01 97 07-2
 
 
        Формат команды:
 
 
        LOAD спецификация-драйверного-файла
 
 
   спецификация-драйверного-файла
 
          - спецификация файла образа, содержащего загружаемый
 
            драйвер ввода/вывода.  Команда  загрузки  получает
 
            имя драйвера из поля DPT$T_NAME в прологовой  таб-
 
            лице драйвера. Если имя драйвера,  который  должен
 
            быть загружен, совпадает с именем любого драйвера,
 
            уже присутствующего  в  конфигурации,  то  команда
 
            загрузки не будет  загружать  драйвер.  SYS$SYSTEM
 
            является именем устройства и каталога  по  умолча-
 
            нию. EXE является типом файла по умолчанию.
 
 
        Описание.
 
 
        Процедура загрузки драйвера сравнивает имя в  пролого-
 
   вой таблице загружаемого драйвера с полем имени в  пролого-
 
   вых таблицах, уже загруженных в системную память драйверов.
 
   Если  совпадения  не  обнаруживается,  процедура  загружает
 
   новый драйвер в смежные ячейки нестраничного пула и  связы-
 
   вает прологовую таблицу драйвера со  связным  списком  DPT.
 
   Если процедура обнаруживает совпадение,  она  не  выполняет
 
   никаких последующих действий.
 
 
        Пример.
 
 
        SYSGEN> LOAD CRDRIVER
 
 
        Команда    загружает    драйвер,     находящийся     в
 
   SYS$SYSTEM:CRDRIVER.EXE (драйвер считывателя перфокарт).
 
 
 
 
 
                            - 10 -
 
                        00152-01 97 07-2
 
 
        1.2.2. Команда CONNECT
 
 
 
        Команда  присоединения  создает  управляющие  блоки  в
 
   базе. Кроме того, эта команда загружает драйвер, если драй-
 
   вер не был ранее загружен в системную память.
 
 
        Формат команды:
 
 
        CONNECT имя обязательные-квалификаторы
 
                [необязательные квалификаторы]
 
 
   имя    - имя устройства, блоки управления  которого  должны
 
            быть добавлены к  базе  данных  ввода/вывода.  Имя
 
            устройства указывается в формате: DDCU , где DD  =
 
            код устройства (до 9  алфавитных  символов),  C  =
 
            наименование контроллера (алфавитный), U  =  номер
 
            устройства. Например,  LPA0  указывает  построчную
 
            печать (устройство) на контроллере а(С) с  номером
 
   [6~         0(U). Когда указываете имя устройства,  не  сопро-
 
            вождайте его двоеточием (:). Код устройства и спе-
 
            цификация контроллера  должны  быть  уникальной  и
 
            точной комбинацией имени устройства и контроллера.
 
            Если блоки управления для указанных  устройства  и
 
            контроллера  уже  существуют,  процедура  загрузки
 
            драйвера не создает каких-либо блоков управления и
 
            не выполняет никаких операций инициализации.  Если
 
            имя  контроллера/устройства  не  является  точным,
 
            процедура загрузки драйвера создаст  ложные  блоки
      6~
            управления.
 
 
        Квалификаторы:
 
 
 
 
                            - 11 -
 
                        00152-01 97 07-2
 
 
        /[NO]ADAPTER = номер позиции (нексус)
 
        /CSR = адрес регистра команд и состояния;
 
        /CSR_OFFSET = смещение CSR;
        6[6~
        /VECTOR = адрес вектора;
 
        /VECTOR_OFFSET = смещение вектора;
 
        /DRIVERNAME = имя драйвера (необязательный);
 
        /NUMVEC = количество векторов (необязательный);
 
        /ADPUNIT = номер устройства (необязательный);
 
        /MAXUNITS = количество (необязательный).
 
 
   /[NO]ADAPTER=номер позиции
 
          - значение номера позиции для  адаптера  общей  шины
 
            или другого контроллера, к которому присоединяется
            6;
            устройство. Это значение  может  быть  числом  или
 
            характерным именем, перечисленным в  квалификаторе
 
            /ADAPTER для команды SHOW программы генерации сис-
 
            темы (п. 1.2.4). Диапазон значений от 0 до 15. Для
 
            настоящей разработки номер позиции равен 3. Коман-
 
            да CONNECT с квалификатором /NOADAPTER использует-
 
            ся для присоединения драйверов, связанных с  прог-
 
            раммными устройствами. Примером такого типа  драй-
 
            веров является драйвер почтового ящика.
 
 
   /CSR=адрес CSR
 
          - адрес на общей шине для регистра управления и сос-
 
            тояния устройства. Все цифровые значения интерпре-
 
            тируются как десятичные, пока они не  предваряются
 
            указателем системы счисления (%О или %Х).
 
 
   /CSR_OFFSET=смещение CSR
 
          - смещение от адреса CSR платы до  адреса  CSR  уст-
 
 
 
                            - 12 -
 
                        00152-01 97 07-2
 
 
            ройства для многоустройственной платы. Все  цифро-
 
            вые значения интерпретируются как десятичные, пока
 
            они не предваряются указателем  системы  счисления
 
            (%О или %X).
 
 
   /VECTOR=адрес вектора
 
          - адрес на общей шине вектора прерывания устройства.
 
            Все цифровые значения интерпретируются  как  деся-
 
            тичные, пока они не предваряются указателем систе-
 
            мы счисления (%O или %X). Подраздел 1.3 предостав-
 
            ляет дополнительную информацию относительно  расп-
 
            ределения адресов CSR и векторов.
 
 
   /VECTOR_OFFSET=смещение вектора
 
          - для устройства на многоустройственной платы смеще-
 
            ние от вектора прерывания платы до вектора  преры-
 
            вания присоединяемого устройства.
 
 
   /NUMVEC=число
 
          - число векторов  прерывания  для  устройства.  Если
 
            этот квалификатор опущен,  то  число  векторов  по
 
            умолчанию равно 1. Значение, указанное  квалифика-
 
            тором /VECTOR, является адресом младшего  вектора.
 
            Вектора должны быть смежными.
 
 
   /DRIVERNAME=имя драйвера
 
          - имя  драйвера,  который  управляет  присоединяемым
 
            устройством. Если этот квалификатор опускается, за
 
            CONNECT следует выполнение одной из двух  процедур
 
            для получения имени по умолчанию.  Если  присоеди-
 
            няемое устройство является первым  устройством  на
 
            контроллере, CONNECT соединяет первые два  символа
 
 
                            - 13 -
 
                        00152-01 97 07-2
 
 
            кода устройства с "DRIVER", например, LPDRIVER.  В
 
            противном случае, CONNECT получает имя драйвера из
 
            поля DDB$T_DRVNAME в блоке данных устройства  дан-
 
            ного контроллера.
 
 
   /MAXUNIT=число
 
          - максимальное количество устройств,  присоединяемых
 
            к контроллеру. Это число определяет размер  списка
 
            UCB, добавляемого к блоку диспетчеризации прерыва-
 
            ния. Если этот квалификатор указан, то  максималь-
 
            ное число устройств, указанное в прологовой табли-
 
            це драйвера во внимание не принимается. Максималь-
 
            ное число устройств сохраняется в поле IDB$W_UNITS
 
            блока IDB.
 
 
        Описание.
 
 
        База данных ввода/вывода содержит связный список  про-
 
   логовых таблиц драйверов. Команда CONNECT ищет драйвер уст-
 
   ройства, просматривая прологовые таблицы драйверов и  срав-
 
   нивая поле DPT$T_NAME каждой DPT с указанным именем драйве-
 
   ра или с его именем по умолчанию. Если совпадения не  обна-
 
   руживается, процедура  загрузки  драйвера  загружает  образ
 
   драйвера (п. 1.2.1).
 
 
        SYS$SYSTEM:имя_драйвера.EXE
 
 
        Процедура загрузки проверяет базу данных  ввода/вывода
 
   на наличие блоков управления, которые поддерживают  указан-
 
   ное  устройство.  Эта  процедура  создает  следующие  блоки
 
   управления, если они не существуют:
 
 
 
 
 
                            - 14 -
 
                        00152-01 97 07-2
 
 
        - блок данных устройства. Процедура создает блок  дан-
 
   ных   устройства   для   указанного   характерного    имени
 
   устройства/контроллера (указанная строка), если такой  блок
 
   данных устройства не существует.  Когда  процедура  создает
 
   блок данных устройства для устройства на  общей  шине,  она
 
   также создает блок запроса канала  и  блок  диспетчеризации
 
   прерывания;
 
 
        - блок управления устройством. Процедура создает  блок
 
   управления устройством, если она только  что  создала  блок
 
   данных устройства или если блок управления  устройством  не
 
   существует для указанного устройства. Если блок  управления
 
   устройством уже существует, процедура продолжает выполнять-
 
   ся, но более не делает никаких модификаций  в  базе  данных
 
   ввода/вывода.
 
 
        После создания блока  управления,  процедура  загрузки
 
   драйвера выполняет следующие операции инициализации:
 
 
        - выполняет операции инициализации, указанные макроко-
 
   мандой DPT_STORE, в секторах инициализации и  реинициализа-
 
   ции прологовой таблицы драйвера;
 
 
        - переопределяет все адреса  в  диспетчерской  таблице
 
   драйвера и таблице выбора функций  в  абсолютные  системные
 
   виртуальные адреса;
 
 
        - повышает приоритетный уровень до IPL$_POWER, так что
 
   инициализация не прерывается;
 
 
        - если был создан новый блок запроса канала, процедура
 
   вызывает  программу  инициализации  контроллера  (если  она
 
   существует), указанную в CRB$L_INTD+VEC$L_INITIAL;
 
 
                            - 15 -
 
                        00152-01 97 07-2
 
 
        - вызывает программу  инициализации  устройства  (если
 
   она существует), указанную в DDT$L_UNITINIT.  Если  DDT  не
 
   содержит программы инициализации, процедура вызывает  прог-
 
   рамму инициализации устройства (если она есть), указанную в
 
   CRB$L_INTD+VEC$L_UNITINIT.
 
 
        Команду CONNECT необходимо указать  крайне  осторожно.
 
   Процедура загрузки драйвера и базы  данных  выполняют  лишь
 
   небольшую проверку ошибок. Если указывается вектор, который
 
   уже был  определен,  процедура  отклонит  команду  CONNECT.
 
   Однако, если команда CONNECT указывает неверный адрес  CSR,
 
   база данных ввода/вывода имеет вероятность  повреждения.  В
 
   результате возникает системная ошибка.
 
 
        Если команда CONNECT указывает существующий контроллер
 
   и новое устройство, процедура создает блок управления  уст-
 
   ройством для нового устройства и вызывает для него програм-
 
   му инициализации.
 
 
        Команда CONNECT, которая указывает  имя  устройства  с
 
   новым контроллером, вынуждает процедуру  загрузки  драйвера
 
   создать блок данных устройства, блок запроса  канала,  блок
 
   диспетчеризации прерывания и блок управления устройством, а
 
   также вызвать программы инициализации  контроллера  и  уст-
 
   ройства.
 
 
        Пример.
 
 
   SYSGEN> CONNECT LPA0 /ADAPTER=UBO/CSR=%о777514/VECTOR=%О200
 
 
        Эта команда загружает драйвер LPDRIVER, если он еще не
 
   загружен, и создает базу данных устройства (DDB, CRB, IDB и
 
   UCB), необходимую для описания LPA0.
 
 
                            - 16 -
 
                        00152-01 97 07-2
 
 
        1.2.3. Команда RELOAD
 
 
 
        Команда загружает драйвер и изымает ранее  загруженную
 
   версию этого драйвера. Она обеспечивает все функции команды
 
   LOAD, за исключением того, что загружает драйвер вне  зави-
 
   симости от того, был ли он загружен ранее.
 
 
        Если какое-либо из устройств, относящихся к  драйверу,
 
   занято, драйвер не может быть перезагружен;  SYSGEN  выдает
 
   сообщение об ошибке.
 
 
        Формат команды:
 
 
        RELOAD спецификация-драйверного-файла
 
 
   спецификация-драйверного-файла
 
          - спецификация  файла  содержащего  образ  драйвера,
 
            который должен быть загружен.
 
 
        Описание:
 
 
        Чтобы перезагрузить драйвер, процедура загрузки  драй-
 
   вера сравнивает поле имени в прологовой  таблице  драйвера,
 
   который должен загружаться, с полем имени в прологовых таб-
 
   лицах драйверов, уже загруженных в системную  память.  Если
 
   совпадения не обнаруживается, RELOAD загружает драйвер, как
 
   это описано в п. 1.2.1.
 
 
        Если процедура обнаруживает  совпадение,  она  сначала
 
   убеждается, что текущий драйвер может  быть  заменен  новым
 
   драйвером по следующим шагам:
 
 
        - убеждается, что флажок DPT$M_NOUNLOAD  в  прологовой
 
   таблице драйвера не установлен;
 
 
                            - 17 -
 
                        00152-01 97 07-2
 
 
        - вызывает программу выгрузки текущего драйвера,  если
 
   она существует, и проверяет является ли  возвращенное  сос-
 
   тояние кодом успешного завершения;
 
 
        - проверяет, что ни одно устройство,  которое  исполь-
 
   зует текущий драйвер, не занято, (состояние занятости  ука-
 
   зывает установленный бит UCB$V_BSY в UCB$W_STS).
 
 
        Если все  эти  проверки  успешны,  процедура  замещает
 
   текущий драйвер новым. Процедура загружает новый драйвер  в
 
   смежные ячейки нестраничной системной памяти  и  ищет  базу
 
   данных ввода/вывода со ссылками на драйвер. Если какой-либо
 
   блок данных устройства ссылается на  перезагруженный  драй-
 
   вер, процедура реинициализирует поля блоков управления уст-
 
   ройством и контроллером в соответствии  с  инструкциями  по
 
   реинициализации в прологовой  таблице  нового  драйвера.  В
 
   разделе 8 документа [2] рассматривается поля  реинициализа-
 
   ции DPT.
 
 
        Поля, которые должны  быть  реинициализированы,  когда
 
   драйвер перезагружается, включают  поля,  которые  содержат
 
   относительные адреса внутри драйвера:
 
 
        - адреса драйверных программ обслуживанния прерывания;
 
 
        - адреса программ инициализацции устройства и контрол-
 
   лера;
 
 
        - адрес диспетчерской таблицы драйвера.
 
 
        После повторной инициализации полей управляющих блоков
 
   процедура загрузки вызывает драйверную программу  инициали-
 
   зации контроллера. (она не вызывает программу инициализации
 
 
 
                            - 18 -
 
                        00152-01 97 07-2
 
 
   устройства).  После  этого,  процедура  удаляет  замещенный
 
   драйвер из списка DPT и освобождает несстраничную системную
 
   память, которую занимал старый драйвер. Наконец,  процедура
 
   загрузки связывает адрес прологовой таблицы нового драйвера
 
   со списком DPT.
 
 
        Команда RELOAD используется только когда все устройст-
 
   ва, поддерживаемые драйвером, неактивны. Проверка активнос-
 
   ти, выполняемая командой RELOAD, может не  обнаружить  всех
 
   активных устройств, а изменение драйвера в  процессе  обра-
 
   ботки запроса ввода/вывода вызовет сбойную ситуацию в  сис-
 
   теме.
 
 
 
        1.2.4. Команда SHOW/ADAPTER
 
 
 
        Команда показывает на экране  список  номеров  позиций
 
   адаптеров в конфигурации системы. Использование этой коман-
 
   ды требует привилегии изменения  режима  на  исполнительный
 
   (CMEXEC).
 
 
        Формат команды:
 
 
        SHOW/ADAPTER
 
 
        Описание.
 
 
        Команда показывает на экране номера позиций  и  харак-
 
   терные имена адаптеров общей шины,  контроллеров  памяти  и
 
   устройств связи.
 
 
        Пример.                              
 
 
        SYSGEN> SHOW/ADAPTER
 
 
 
                            - 19 -
 
                        00152-01 97 07-2
 
 
        1.2.5. Команда SHOW/CONFIGURATION
 
 
 
        Команда отображает на экране информацию о конфигурации
 
   системы.
 
 
        Формат команды:
 
 
            SHOW/CONFIGURATION [/ADAPTER=номер позиции]
 
                               [/COMMAND_FILE]
 
                               [/OUTPUT=FILE-SPEC]
 
 
   /ADAPTER=номер позиции
 
          - квалификатор  указывает  номер  позиции   адаптера
 
            общей шины, которые выводятся на экран.
 
 
   /COMAND_FILE
 
          - квалификатор указывает для SYSGEN формировать дан-
 
            ные об устройстве из команд CONNECT и копировать в
 
            указанный выходной файл.
 
 
   /OUTPUT=FILE-SPEC
 
          - файловая  спецификация  необязательного  выходного
 
            файла.
 
 
        Описание.
 
 
        Команда показывает на экране имя устройства, количест-
 
   во устройст6;в, номер и позиции тип, а  также  адреса  CSR  и
 
   векторов устройств, присоединенных к системе или  введенных
 
   в нее с помощью средств автоконфигурации. Можно непосредст-
 
   венно записать эту информацию в выходной файл, указанный  с
 
   помощью квалификатора /OUTPUT. Если комбинируется  квалифи-
 
   каторы /OUTPUT и /COMMAND_FILE, SYSGEN форматирует все дан-
 
 
 
                            - 20 -
 
                        00152-01 97 07-2
 
 
   ные об устр[6~ойствах в команды CONNECT и копирует их  в  ука-
 
   занный выходной файл. Таким образом можно из'ять устройство
 
   из плавающего адресного пространства без сложной перекомму-
 
   тации адресов CSR и векторов остальных устройств.
 
 
        Пример.
 
 
        SYSGEN> SHOW/CONFIGURATION/ADAPTER=UB0
 
 
 
        1.2.6. Команда SHOW/DEVICE
 
 
 
        Команда показывает на экране местоположение драйвера и
 
   базы данных ввода/вывода,  описывающей  его  устройства,  в
 
   системной виртуальной памяти.  Команда  требует  привилегии
 
   изменения режима на исполнительный (CMEXEC).
 
 
        Формат команды: SHOW/DEVICE[=имя]
 
 
   имя    - имя драйвера, информация  о  котором  должна  быть
 
            выведена на экран. Если имя драйвера не указывает-
 
            ся, команда выводит на  экран  информацию  о  всех
 
            драйверах, известных системе.
 
 
        Описание.
 
 
        По этой команде выводится следующая информация:
 
 
        - имя драйвера;
 
 
        - начальный и конечный  виртуальные  адреса  драйвера;
 
   начальный адрес - адрес прологовой таблицы драйвера;
 
 
        - характерные имена устройства/контроллера,  связанных
 
   с драйвером;
 
 
 
                            - 21 -
 
                        00152-01 97 07-2
 
 
        - адреса блока данных устройства, блока запроса  кана-
 
   ла, блока данных  прерывания  для  характерных  устройства/
 
   контроллера, поддерживаемых драйвером;
 
 
        - номера устройств и адреса UCB для каждого  устройст-
 
   ва, связанного с драйвером;
 
 
        Пример.
 
 
        SYSGEN> SHOW/DEVICE=TMDRIVER
 
 
   _RIVER_START__END_DEV_DDB__CRB_IDB_UNIT_UCB
 
   TMDRIVER 8009DF00 8009F020
 
                             MTA 800BA660 800BA6C0
 
                                               800BA360
 
                                                    0 8009F020
 
                                                    1 8009F0С0
 
 
 
        1.3. Автоконфигурация
 
 
 
        Стандартный файл  запуска  системы  МОС  ВП  запускает
 
   SYSGEN,  чтобы  создать  и  инициализировать  базу   данных
 
   ввода/вывода, которая описывает всю периферию  поддерживае-
 
   мую в МОС ВП. Подготовка базы данных для всех  поддерживае-
 
   мых устройств, присоединенных к каждой общей шине, запраши-
 
   вается следующей командой SYSGEN:
 
 
        SYSGEN> AUTOCONFIGURE ALL
 
                                             
 
        1.3.1. Средство автоконфигурации в SYSGEN
 
 
 
        Программа SYSGEN автоматически  конфигурирует  адаптер
 
 
 
                            - 22 -
 
                        00152-01 97 07-2
 
 
   общей шины следующим образом:
 
 
        - инициализирует плавающее пространство значениями 300
 
   (восьмеричное) и 760010 (восьмеричное) для векторов и  CSR,
 
   соответственно;
 
 
        - проверяет  пространство  фиксированных  и  плавающих
 
   адресов CSR для всех известных в системе устройств;
 
 
        - когда для  данного  CSR  обнаруживается  устройство,
 
   SYSGEN резервирует, если это необходимо, пространство  пла-
 
   вающих CSR и вектора;
 
 
        - ищет имя драйвера, связанного с устройством,  прове-
 
   ряя  таблицу  устройств  SYSGEN  (п.   1.3.2)   и   каталог
 
   SYS$SYSTEM. Если драйвер уже был  загружен  или  существует
 
   как файл образа в SYS$SYSTEM, SYSGEN создает и  инициализи-
 
   рует базу данных ввода/вывода для этого устройства и загру-
 
   жает, если необходимо, образ драйвера.  Если  устройства  с
 
   этим CSR поддерживается в МОС ВП, а SYSGEN не  может  найти
 
   связанный с ним образ драйвера, он генерирует сообщение  об
 
   ошибке. Если устройство не поддерживается и не имеет  отно-
 
   сящегося к нему драйвера (образа драйвера), то SYSGEN игно-
 
   рирует это ситуациию.
 
 
 
        1.3.2. Таблица устройств SYSGEN
 
 
 
        Таблица устройств  SYSGEN  перечисляет  характеристики
 
   устройств и для каждого типа устройств указывает  следующую
 
   информацию:
 
 
        - имя контроллера устройства;
 
 
 
                            - 23 -
 
                        00152-01 97 07-2
 
 
        - имя драйвера устройства и сообщение о его поддержке;
 
        - имя устройства, опознаваемое МОС ВП;
 
        - вектор прерывания;
 
        - количество векторов прерывания на контроллер;
 
 
        - адрес первого регистра устройства для каждого  конт-
 
   роллера,  (первым  регистром  обычно,  но,  но  не  всегда,
 
   является регистр CSR);
 
 
        - количество регистров на контроллер.
 
 
        В табл.1 перечислены устройства, которые  в  настоящее
 
   время содержит таблица устройств SYSGEN.
 
                                                     Таблица 1
                    Tаблица устройств SYSGEN
 
   -----------------------------------------------------------
   Уст-  IИмя  I Вектор IЧис-IВы- I Адрес IЧислоIДрайверIПод-
   ройст-Iпро- I        Iло  Iрав-I  CSR  Iре-  I       Iдерж-
   во    Iтоти-I        Iвек-Iни- I       Iгист-I       IKA
         Iпа   I        ITO- Iва- I       Iров  I       I
         I     I        Iров Iние I       I     I       I
   ----------------------------------------------------------
   CR    CR11    230               777160        CRDRIVER  да
   DM    RK611   210               777440        DMDRIVER  да
   LP    LP11    200               777514        LPDRIVER  да
                 170               764004
                 174               764014
                 270               764024
                 274               764034
   DL    RL11    160               774400        DLDRIVER  да
   MS    TS11    224               772520        TSDRIVER  да
   DY    RX211   264               777170        DYDRIVER  да
   DQ    RB730   250               775606        DQDRIVER  да
   PU    UDA     154               772150        PUDRIVER  да
   PT    TU81    260               774500        PUDRIVER  да
   XE    UNA     120               774510        XEDRIVER  да
   XQ    QNA     120               774440        XQDRIVER  да
   OM    DC11 плавающий   2    8   774000        OMDRIVER  нет
                                   774010
                                   774020
                                   774030
                                     .
                                     .
                                     .
                                  мах. до
                                  32 у-ств
   DD    TU58 плавающий   2    8   776500        DDDRIVER  да
                                   776510
 
 
                            - 24 -
 
                        00152-01 97 07-2
 
 
                                           Продолжение табл. 1
   -----------------------------------------------------------
   Уст-  IИмя  I Вектор IЧис-IВы- I Адрес IЧислоIДрайверIПод-
   ройст-Iпро- I        Iло  Iрав-I  CSR  Iре-  I       Iдерж-
   во    Iтоти-I        Iвек-Iни- I       Iгист-I       IKA
         Iпа   I        ITO- Iва- I       Iров  I       I
         I     I        Iров Iние I       I     I       I
   ----------------------------------------------------------
                                   776520
                                   776530
                                     .
                                     .
                                     .
                                  мах. До
                                  16 у-ств
   OB    DN11 плавающий  1    4    775200        OBDRIVER  нет
                                   775210
                                   775220
                                   775230
                                     .
                                     .
                                     .
                                  мах. До
                                  16 у-ств
   YM    DM118 пла-       1    4   770500        YMDRIVER  нет
               вающий              770510
                                   770520
                                   770530
                                     .
                                     .
                                     .
                                  мах. До
                                  16 у-ств
   OA    DR11C пла-       2    8   767600        OADRIVER  нет
               вающий              767570
                                   767560
                                   767550
                                     .
                                     .
                                     .
                                  мах. До
                                  16 у-ств
   PR    PR611 пла-       1    8   772600        PRDRIVER  нет
               вающий              772604
                                   772610
                                   772614
                                     .
                                     .
                                     .
                                  мах. До
                                  8 у-ств
   PP    PP611 пла-       1    8   772700        PPDRIVER  нет
               вающий              772704
                                   772710
                                   772714
                                     .
                                     .
                                     .
                                  мах. До
 
 
                            - 25 -
 
                        00152-01 97 07-2
 
 
                                           Продолжение табл. 1
   -----------------------------------------------------------
   Уст-  IИмя  I Вектор IЧис-IВы- I Адрес IЧислоIДрайверIПод-
   ройст-Iпро- I        Iло  Iрав-I  CSR  Iре-  I       Iдерж-
   во    Iтоти-I        Iвек-Iни- I       Iгист-I       IKA
         Iпа   I        ITO- Iва- I       Iров  I       I
         I     I        Iров Iние I       I     I       I
   ----------------------------------------------------------
                                  8 у-ств
   OC    DT11 плавающий   2    8   777420        OCDRIVER  нет
                                   777422
                                   777424
                                   777426
                                     .
                                     .
                                     .
                                  мах. До
                                  8 у-ств
   OD    DX11 плавающий   2   8    776200        ODDRIVER  нет
                                   776240
   YL    DL11C пла-       2   8    775610        YLDRIVER  нет
               вающий              775620
                                   775630
                                   775640
                                     .
                                     .
                                     .
                                  мах. До
                                  31 у-ва
   YJ    DJ11 плавающий   2    8  плавающий   4  YJDRIVER  нет
   YH    DH11    "        2    8      "       8  YHDRIVER  нет
   OE    GT40    "        4    8   772000        OEDRIVER  нет
                                   772010
   LS    LPS11   "       6    8    770400        LSDRIVER  нет
   OR    DQ11    "        2    8  плавающий   4  ORDRIVER  нет
   OF    KW11W   "        2    8   772400        OFDRIVER  нет
   XU    DU11    "        2    8  плавающий   4  XUDRIVER  нет
   XW    DUP11   "        2    8      "       4  OODRIVER нет
   XV    DV11    "        3    8   775000        XVDRIVER  нет
                                   775040
                                   775100
                                   775140
   OG    LK11    "        2    8  плавающий   4  OGDRIVER  нет
   XM    DMC11   "        2    8      "       4  XMDRIVER  да
   TT    DZ11    "        2    8      "       4  DZDRIVER  да
   XK    KMC11   "        2    8      "       4  XKDRIVER  нет
   OH    LPP11   "        2    8      "       4  OHDRIVER  нет
   OI    VMV21   "        2    8      "       4  OIDRIVER  нет
   OJ    VMV31   "        2    8      "       8  OJDRIVER  нет
   OK    DWR70   "        2    8      "       4  OKDRIVER  нет
   DL    RL11    "        1    4      "       4  DLDRIVER  да
   MS    TS11    "        1    4    772524       TSDRIVER  да
                                    772530
                                    772534
   LA    LPA11   "        2    8    770460       LADRIVER  да
   LA    LPA11   "        2    8   плавающий   8 LADRIVER  да
   OL    KW11C   "        2    8       "       4 OLDRIVER  нет
   RSV   RSV     "        1    8       "       4 RSVDRIVER нет
   DY    RX211   "        1    4       "       4 DYDRIVER  да
 
 
                            - 26 -
 
                        00152-01 97 07-2
 
 
                                           Продолжение табл. 1
   -----------------------------------------------------------
   Уст-  IИмя  I Вектор IЧис-IВы- I Адрес IЧислоIДрайверIПод-
   ройст-Iпро- I [6~       Iло  Iрав-I  CSR  Iре-  I       Iдерж-
   во    Iтоти-I        Iвек-Iни- I       Iгист-I       IKA
         Iпа   I        ITO- Iва- I       Iров  I       I
         I     I        Iров Iние I       I     I       I
   ----------------------------------------------------------
   XA    DR11W   "        1    4       "       4 XADRIVER  да
   XB    DR11B   124                772410       XBDRIVER  нет
   XB    DR11B плавающий  1    4    772430     4 XBDRIVER  нет
   XB    DR118   "        1    4   плавающий   4 XBDRIVER  нет
   XD    DMP11   "        2    8       "       4 XDDRIVER  да
   ON    DPV11   "        2    8       "       4 ONDRIVER  нет
   IS    ISB11   "        2    8       "       4 ISDRIVER  нет
   XD    DMV11   "        2    8       "       8 XDDRIVER  нет
   XE    UNA     "        1    4       "       4 XEDRIVER  нет
   PU    UDA     "        1    4       "       2 PUDRIVER  да
   TX    DMF32   "        8    4       "      16 YCDRIVER  да
   XG                                            XGDRIVER  да
   LC                                            LCDRIVER  да
   XI                                            XIDRIVER  нет
   XS    KMS11   "        3    8       "       8 XSDRIVER  нет
   XP    PCL11   "        2    8    764200       XPDRIVER  нет
                                    764240
                                    764300
                                    764340
   VB   VS100 плавающий  1    4    плавающий   8  VBDRIVER  не
   PT   TU81  плавающий  1    4    плаваючий   2 PUDRIVER  нет
   OQ   KMV11 плавающий  2    8    плавающий   8 OQDRIVER  нет
   UK   KCT32 плавающий  2    8     764400       UKDRIVER  нет
                                    764440
                                    764500
                                    764540
   IX   IEQ11 плавающий  2    8     764100       IXDRIVER  нет
   TX   DHV11 плавающий  2    8    плавающий   8 YFDRIVER  да
   TX  DMZ32/ плавающий  6    4    плавающий  16 YCDRIVER  да
        CP132
   XG   CP132 плавающий  6    4    плавающий  16 XGDRIVER  да
   DT   TC11     214                777340       DTDRIVER  нет
   VC   VC01B    060                777200       VCDRIVER  да
 
 
 
        Созданные пользователем устройства должны иметь назна-
 
   ченные адреса CSR и  векторов  вне  пространстве  плавающих
 
   адресов, зарезервированных системой МОС ВП.
 
 
        Для присоединения к  системе  устройств  с  плавающими
 
   векторами,  которые  не  опознает  команда   AUTOCONFIGURE,
 
   используйте команду CONNECT.
 
 
 
 
 
                            - 27 -
 
                        00152-01 97 07-2
 
 
        1.3.3. Управление автоконфигурацией  драйвером
 
               устройства
 
 
 
        Средства автоконфигурации в SYSGEN предусматривают две
 
   возможности, которые  могут  использоваться  драйвером  для
 
   управления автоматической конфигурацией устройств, которыми
 
   он управляет. Эти особенности могут быть использованы через
 
   аргументы DEFUNITS и DELIVER в макрокоманды DРТАВ.
 
 
        Аргумент DEFUNIT в макрокоманде DPTAB указывает  коли-
 
   чество устройств, которое должно быть присоединено к систе-
 
   ме  по  умолчанию.  DPTAB  копирует  это  значение  в  поле
 
   DPT$W_DEFUNIT в прологовой таблице драйвера. Средство авто-
 
   конфигурации SYSGEN читает это поле и создает блоки  управ-
 
   ления устройством, нумеруемые от нуля  до  количества  уст-
 
   ройств по умолчанию минус единица.
 
 
        Аргумент DELIVER в макрокоманде DPTAB указывает  адрес
 
   специфической для драйвера программы  доставки  устройства.
 
   Смещение на эту программу  хранится  в  поле  DPT$W_DELIVER
 
   прологовой таблицы драйвера. Когда этот аргумент  присутст-
 
   вует, средства автоконфигурации в SYSGEN вызывают программу
 
   доставки драйвера для каждого устройства из того  количест-
 
   ва, которое указывается аргументом DEFUNIT.
 
 
        Программа доставки устройства запрещает  создание  UCB
 
   для устройств, которые не отвечают при проверке об их нали-
 
   чии.
 
 
        Если программа доставки  устройства  записывает  в  R0
 
   состояние истинности, данное устройство включается в конфи-
 
   гурацию. Если в R0 записано  состояние  ложности,  средства
 
 
                            - 28 -
 
                        00152-01 97 07-2
 
 
   автоконфигурации не включают данное устройство в конфигуга-
 
   цию. Если аргумент DELIVER не используется средства достав-
 
   ки устройства запрещены.
 
 
        SYSGEN вызывает программу доставки устройства инструк-
 
   цией JSB в следующем контексте:
 
 
        - уровень приоритета прерывания равен IPL$_POWER (31);
 
        - регистры от R0 до R2 доступны для использования;
 
 
        - R3 содержит адрес блока диспетчеризации  прерывания,
 
   если он существует. Если его нет, R3 содержит нулевое  зна-
 
   чение;
 
 
        - R4 содержит адрес регистра  управления  и  состояния
 
   для контроллера;
 
 
        - R5 содержит номер устройства для которого  программа
 
   должна установить включать или не включать в конфигурацию;
 
 
        - R6 содержит базовый адрес пространства  ввода/вывода
 
   адаптера общей шины;
 
 
        - R7 содержит  адрес  блока  управления  конфигурацией
 
   (ACF);
 
 
        - R8 содержит адрес блока управления  адаптером  общей
 
   шины.
 
 
        Блок управления конфигурацией описан в приложении 1.
 
 
        Драйвер устройства МПДА(DZ11) в МОС  ВП  определяет  8
 
   устройств по умолчанию, но неуказывает программы для  авто-
 
   матического включения в конфигурацию этих восьми терминаль-
 
   ных устройств. Драйвер устройства СМ5408  RK611  определяет
 
 
                            - 29 -
 
                        00152-01 97 07-2
 
 
   по умолчанию 8 устройств, а также указывает адрес  доставки
 
   устройства, которая вызывается для каждого из  8  возможных
 
   устройств на контроллере.
 
 
 
        1.3.4. Вычисление плавающего адреса вектора
 
 
 
        Для вычисления плавающего  адреса  вектора  устройства
 
   SYSGEN округляет текущую базу плавающего вектора (CFVB)  до
 
   следующей действительной границы адреса вектора  следующего
 
   устройства в таблице.
 
 
        Если  устройство  присутствует,   SYSGEN   резервирует
 
   пространство плавающего вектора для  него,  вычисляя  новую
 
   CFVB:
 
 
        CFVB + (4* количество векторов)---> CFVB
 
 
 
        1.3.5. Вычисление плавающего адреса CSR
 
 
 
        Для  вычисления  плавающего  адреса  CSR   устройства,
 
   SYSGEN округляет текущую базу плавающего CSR (CFCB) до сле-
 
   дующего действительного плавающего  адреса  CSR.  Плавающие
 
   адреса CSR должны располагаться на 8-байтовой границе.
 
 
        SYSGEN проверяет адрес CSR (CFCB) для следующего  уст-
 
   ройства в таблице устройств, выполняя  инструкцию  проверки
 
   слова (TSTW) по этому адресу и отмечая, имеется  ли  отклик
 
   по данному адресу.
 
 
        Если  устройство  присутствует,   SYSGEN   резервирует
 
   пространство плавающих адресов CSR для данного  устройства,
 
   вычисляя новую CFCB:
 
 
                            - 30 -
 
                        00152-01 97 07-2
 
 
        CFCB + число_байтов_в_наборе_регистров----> CFCB
 
 
        Когда все устройства данного типа  были  обнаружены  и
 
   зарезервировано пространство для их плавающих CSR ,  SYSGEN
 
   резервирует дополнительный блок пространства CSR для указа-
 
   ния перехода к устройствам нового типа:
 
 
        CFCB + 8 ----> CFCB
 
 
        Если устройство отсутствует, SYSGEN резервирует допол-
 
   нительный блок для указания перехода  к  новому  типу  уст-
 
   ройств (добавляя 8 к округленному CFCB):
 
 
        CFCB + 8 ----> CFCB
 
 
 
        1.3.6. Правила для конфигурации
 
 
 
        Правила конфигурации сводятся к следующим принципам:
 
 
        - устройства с фиксированными адресами CSR и с  фикси-
 
   рованными векторными адресами должны присоединяться в соот-
 
   ветствии с таблицей устройств SYSGEN;
 
 
        - устройства с плавающими адресами  CSR  или  векторов
 
   должны присоединяться в том порядке, в  котором  они  появ-
 
   ляются в таблице устройств SYSGEN;
 
 
        - между каждыми различными типами  устройств,  которые
 
   расположены в пространстве плавающих  адресов  должен  быть
 
   зарезервирован 8-байтный промежуток;
 
 
        - для каждого типа устройства, не имеющего контроллера
 
   в своей конфигурации, должен быть зарезервирован  8-байтный
 
   промежуток в пространстве плавающих адресов CSR;
 
 
                            - 31 -
 
                        00152-01 97 07-2
 
 
        - дополнительный  8-байтный  промежуток  должен   быть
 
   зарезервирован в пространстве плавающих адресов  CSR  между
 
   линейным таймером (KW11C) и СМ5063 (RX11).
 
 
        При назначении плавающих адресов векторов и  регистров
 
   для устройств не поддерживаемых системой, необходимо  оста-
 
   вить промежуток между этими адресами и  адресами  устройств
 
   поддерживаемых системой, так как при  последующем  развитии
 
   МОС ВП в таблицу  устройств  SYSGEN  могут  быть  добавлены
 
   новые устройства.
 
 
 
        1.3.7. Пример конфигурации общей шины
 
 
 
        Пример показывает  корректную  конфигурацию  устройств
 
   общей шины с плавающими адресами CSR и векторов. Контролле-
 
   ры отмеченные звездочкой (*) неподдерживается системой.
 
 
     Пример.
 
     Контроллер  вектор(ы)  CSR (первый регистр)
 
     1 DN11*       300             775200
 
     1 DU11*       310             760040
 
     1 DV11*       320             775000
 
     1 DMC11       340             760100
 
     2 DZ11        350             760120
 
                   360             760130
 
     2 TS11        224             772520
 
                   370             772524
 
     3 DR11B       124             772410 (CSR-третий регистр)
                    [[6~
                   400             772430
 
                   410             760300
 
     1 устройство  420             760320
 
 
                            - 32 -
 
                        00152-01 97 07-2
 
 
       покупателя  (или выше)      (или выше)
 
 
 
 
 
                 2. ОТЛАДКА ДРАЙВЕРА УСТРОЙСТВА
 
 
 
 
        DELTA и XDELTA являются отладочными средствами,  кото-
 
   рые могут быть использованы  для  слежения  за  выполнением
 
   пользовательских программ и операционной  системы  МОС  ВП.
 
   Когда DELTA связывается с пользовательским образом, который
 
   выполняется в непривилегированном процессе, DELTA  является
 
   отладочным в режиме пользователя. Однако, когда  выполнение
 
   происходит в привилегированном процессе, DELTA работает как
 
   многорежимный отладчик; это позволяет вести отладку в поль-
 
   зовательском режиме, или изменить его для отладки в  режиме
 
   ядра. DELTA не поддерживает отладки при повышенных IPL.
 
 
        XDELTA синтаксически идентична DELTA, но также  позво-
 
   ляет отлаживать программы, которые исполняются при повышен-
 
   ных IPL. XDELTA используется для автономной отладки драйве-
 
   ров и управляющей программы.
 
 
 
        2.1. Начальная  загрузка  системы  вместе  с
 
             XDELTA
 
 
 
        Драйверы являются  частью  операционной  системы.  Для
 
   возможности отладки XDELTA обычно при выполнении  начальной
 
   загрузки системы, используются два флажка. Один из  флажков
 
   вынуждает процедуру начальной загрузки включить  в  систему
 
   XDELTA. Другой флажок указывает останов  в  точке  останова
 
   при  инициализации  системы.  Выполнение  инструкции  точки
 
 
                            - 33 -
 
                        00152-01 97 07-2
 
 
   останова вызывает передачу управления  обработчику  ошибок,
 
   находящемуся в XDELTA.
 
 
        Помимо обычных  командных  файлов  начальной  загрузки
 
   системы кассетные магнитные ленты консоли в СМ1700 содержат
 
   два командных файла, которые выполняют  начальную  загрузку
 
   системы вместе с XDELTA:
 
 
           -  DQAXDT
 
           -  DQ0XDT
 
 
        Чтобы загрузить систему вместе XDELTA, необходимо сле-
 
   довать процедуре описанной в [8] и указать один из  команд-
 
   ных файлов, DQAXDT, DQ0XDT.
 
 
        Пример.
 
 
   >>> D/G/L 3 1    поместить номер 1 устройства в R3.
 
   >>>  @DQAXDT     загрузить систему с DQA1. Процедура загру-
 
   (или @DQ0XDT)   жает систему и выдает пользователью подска-
 
                   зку из SYSBOOT.
 
   SYSBOOT>         введите   любую  команду  SYSBOOT. Если не
 
                   установили    или  не  загрузили  системные
 
                   параметра помощью   команды USE, то система
 
                   использует  системные параметры, хранящиеся
 
                   в образе  системы. Для  предохраения  авто-
 
                   матической  перезагрузки системы после
 
                   обнаружения ошибки, можно установить в ноль
 
                   системный параметр BUGREBOOT.
 
   SYSBOOT>CONTINUE продолжить действие по загрузке.
 
 
        Когда устройством загрузки является DQA0, можно  опус-
 
   тить первый шаг и выполнить командную процедуру DQ0XDT.
 
 
                            - 34 -
 
                        00152-01 97 07-2
 
 
        2.1.1. Действия от начальной точки останова
 
 
 
        После начальной загрузки  система  выводит  свое  при-
 
   ветственное сообщение и останавливается в XDELTA:
                                 
 
                  1 BRK  AT NNNNNNNN
 
                  адрес/NOP
 
 
        XDELTA ожидает ввода данных. (XDELTA никогда не выдает
 
   подсказок в явном виде).  Обычно,  работа  продолжается  от
 
   данной точки следующей командой:
 
 
                  ; Р <RET>
 
 
        Все команды XDELTA описываются в подразделе 2.10.
 
 
        Если операционная система останавливается  по  причине
 
   фатальной ошибки, система печатает сообщение об  ошибке  на
 
   консольном терминале. Затем, поскольку  системный  параметр
 
   BUGREBOOT был установлен в нуль, XDELTA  выдает  подсказку.
 
   Информация об ошибке содержит:
 
 
        - тип ошибки;
 
        - значения регистров;
 
        - результат выгрузки (ДАМПА) одного или более стеков.
 
 
        Счетчик команд  и  содержимое  стека  показывает,  как
 
   отлаживаемый драйвер разрушил систему. Затем  можно  прове-
 
   рить состояние системы, используя команды XDELTA.
 
 
 
        2.2. Загрузка драйвера
 
 
 
        После загрузки системы и зарегистрирований в  ней  как
 
 
 
                            - 35 -
 
                        00152-01 97 07-2
 
 
   администратор системы загружается отлаживаемый драйвер.
 
 
        Для загрузки драйвера запускается  SYSGEN  и  задается
 
   соотвествующие команды LOAD и CONNECT. На  примере  показан
 
   образец диалога.
 
 
        Пример.
 
 
   $ RUN SYS$SYSTEM:SYSGEN
 
   SYSGEN>   LOAD DMA0:[YOUR.DIRECTORY]YRDRIVER.EXE
 
   SYSGEN>   SHOW/DEVICE=YRDRIVER
 
   _RIVER__START__END__EV_DB_RB_DB_NIT_CB
 
   YRDRIVER  80060E5C 80061070
 
   SYSGEN>  CONNECT YR /ADAP=3/VEC=%O274/CSR=%O776240
 
   SYSGEN>  SHOW/DEVICE=YRDRIVER
 
   _RIVER_START__END__DEV_DB_RB_DB_NIT_CB__
 
   YRDRIVER 80060E50 80061070  YRA 8005FDC0
 
                                        80060B70
 
                                         8005FE00 0 80060B20
 
   SYSGEN>  EXIT
 
 
        Первая команда в  примере  (SHOW  /DEVICE)  заставляет
 
   SYSGEN  вывести  на   индикацию   местоположение   драйвера
 
   YRDRIVER в памяти системы. Затем данное устройство  опреде-
 
   ляется для операционной системы. Вторая команда SHOW приво-
 
   дит к индикации местоположения драйвера  и  адресов  блоков
 
   DDB, CRB, IDB и UCB устройства.
 
 
 
        2.3. Помещение  точек  останова  в  исходную
 
             программу
 
 
 
 
 
 
                            - 36 -
 
                        00152-01 97 07-2
 
 
        SYSGEN команда CONNECT вызывает программы  инициализа-
 
   ции конроллера и устройства. Чтобы начать отладку драйвера,
 
   неоходимо убедиться, что отладочная программа  режима  ядра
 
   XDELTA получила управление драйвером до  того,  как  начнут
 
   выполняться эти программы. Это делается помещением  вызовов
 
   специальной системной программы  INI$BRK  внутри  исходного
 
   текста программы инициализации контроллера,  или  программы
 
   инициализации устройства. Для вызова  INI$BRK  используется
 
   следующая инструкция:
 
 
                  JSB   G^INI$BRK
 
 
        Программа содержит две инструкции - BPT и  RSB.  Когда
 
   процессор выполняет инструкцию BPT, XDELTA получает  управ-
 
   ление и сообщает адрес точки останова:
 
 
                  1 BRK  AT  NNNNNNNN
 
 
        INI$BRK используется в качестве отладочного инструмен-
 
   та и обращения к ней помещаются внутри любой части исходно-
 
   го текста программы драйвера.
 
 
        Для определения последняго драйверного РС перед точкой
 
   останова, считывается стек режима ядра. Стековым  регистром
 
   является регистр RE (шестнадтиричный формат):
 
 
        RE/адрес/адрес/
 
 
        Команда индикации (/)  показывает  содержимое  вершины
 
   стека, т.е., адрес  возврата  к  драйверу,  который  вызвал
 
   INI$BRK.
 
 
 
 
 
 
 
                            - 37 -
 
                        00152-01 97 07-2
 
 
        2.4. Вычисление базы драйверного кода
 
 
 
        Перед  отладкой  драйвера  полезно  вычислить  базовый
 
   адрес драйверной программы следующим образом:
 
 
        1)  запустить  SYSGEN  и  выдать  команду  SHOW/DEVICE
 
   (показать  устройство).  Результирующая  индикация  покажет
 
   местоположение в бесстраничной области, куда SYSGEN  загру-
 
   зила длайвер;
 
 
        2) посмотреть карту загрузки драйвера  (получается  во
 
   время обработки драйвера редактором сязи  -  линкирования).
 
   Драйвер размещается в двух программных секциях (PSECT):
 
 
        $$$105_PROLOGUE -  прологовая таблица драйвера;
 
        $$$115_DRIVER -  программа драйвера;
 
 
        Адреса, указанные в листинге драйвера, являются смеще-
 
   ниями $$$115_DRIVER. Для вычисления базового адреса драйве-
 
   ра можна прибавить адрес, по которому был загружен драйвер,
 
   к смещению, относящемуся к PSECT $$$115_DRIVER,  указанному
 
   в карте загрузки.
 
 
        При отсутствии карты загрузки,  в  прологовой  таблице
 
   драйвера в листинге драйвера найдите  адрес  DPT_STORE_END,
 
   который формирует двухбайтный  вход  окончания  DPT.  Чтобы
 
   получить базовый адрес драйверного  кода,  прибавьте  адрес
 
   DPT_STORE_END+2 к адресу, которого был загружен драйвер.  В
 
   базовый регистр XDELTA можно установить базовый адрес драй-
 
   вера; эта процедура описывается в подразделе 2.7.
 
 
 
 
 
 
 
                            - 38 -
 
                        00152-01 97 07-2
 
 
        2.5. Запрос программного прерывания XDELTA
 
 
 
        При завершении выполнений программ инициализации  кон-
 
   толлера и устройства, может понадобиться  установить  точки
 
   останова для отладки драйвера. Точку останова можно устано-
 
   вить в исходном тексте драйвера, помещая туда  вызов  прог-
 
   раммы INI$BRK, как это рассмотрено в подразделе 2.3.  Также
 
   можно вызвать XDELTA для установки точек останова в  диало-
 
   говом режиме, запрашивая программное прерывание XDELTA.
 
 
        Процедуры, рассматриваемые в подразделах  2.6  и  2.7,
 
   будут вызывать программные прерывания процессора на  уровне
 
   IPL 5. Программа обслуживания прерывания этого уровня обра-
 
   батывает прерывание, вызывая программу INI$BRK, которая,  в
 
   свою очередь, обслуживает  первую  точку  останова  XDELTA.
 
   После этого XDELTA выдает такое сообщение:
 
 
           1 BRK AT NNNNNNNN
 
           адрес/NOP
 
 
        Для запроса прерывания XDELTA , выдаются на консольный
 
   терминал следующие команды:
 
 
        $ CTRL/P
 
        >>>D/I 14 5
 
        >>>C
 
 
 
        2.6. Обзор таблицы векторов переходов
 
 
 
        Используя точку останова при инициализации  контролле-
 
   ра, можно определить адрес драйверной программы  обслужива-
 
   ния прерывания, так как одним из входов является адрес  IDB
 
 
                            - 39 -
 
                        00152-01 97 07-2
 
 
   процедура для нахождения программы обслуживания  прерывания
 
   следующая:
 
 
        Процедура с прямым вектором
        - - - - - - - - - - - - - -
 
        R5/IDB-адрес  Q+10/адр-адрес
 
        Q+10/адрес-таблицы-векторов
 
        Q+шестнадцатеричный-адрес-вектора+2/адрес-JSB-B-CRB
 
        Q!JSB-инструкция
 
 
        Обнаружение адреса драйверной  программы  обслуживания
 
   прерывания по ожидаемому вектору еще  не  гарантирует,  что
 
   прерывание от устройства будет отсылать к драйверной  прог-
 
   рамме обслуживания прерывания. Если физический вектор  уст-
 
   ройства установлен на какой-либо другой  адрес,  прерывание
 
   от устройства может быть отослано к какой-то  другой  прог-
 
   рамме обслуживания прерывания или на неиспользуемый вектор.
 
 
        Список векторов приводится в таблице устройств SYSGEN,
 
   в разделе 1.
 
 
 
        2.7. Установка базового регистра XDELTA
 
 
 
        Во время сеанса отладки  драйвера  можно  использовать
 
   регистр релокации XDELTA в качестве базового,  от  которого
 
   проверяется драйверный код и задаются точки останова внутри
 
   драйвера. Для определения базового адреса драйверной  прог-
 
   раммы необходимо установить  регистр  релокации,  используя
 
   следующую команду:
 
 
        Адрес-базы-драйвера,0;Х  <RET>
 
 
 
 
 
                            - 40 -
 
                        00152-01 97 07-2
 
 
        Команда устанавливает в регистре релокации X0  базовый
 
   адрес драйверного кода. Используя базовые  регистры,  можно
 
   обращаться к ячейкам памяти, задавая адреса  ячеек  в  виде
 
   смещений от базы:
 
 
        Х0 + смещение/NNNNNNNN                  или
 
        Х0 + смещение!инструкция
 
 
        XDELTA также использует базовый регистр для вывода  на
 
   индикацию значений адресов в формате базового регистра плюс
 
   смещение. Предположим, например, что драйвер содержит  сле-
 
   дующие коды:
 
 
         50  81  90  00D3  132  10$:  MOVB    (R1)+,R0
 
             10  13  00D6  133        BEQL    20$
 
         20  50  91  00D8  134        CMPB    R0,#^A/ /
 
             F6  19  00DB  135        BLSS    10$
 
     7A  8F  50  91  00DD  136        CMPB    R0,#^A/Z/
 
             F0  14  00E1  137        BGTR    10$
 
         82  50  90  00E3  138        MOVB    R0,(R2)+
 
             EB  11  00E6  139        BRB     10$
 
 
        Если базовый регистр 0 содержит базовый адрес  драйве-
 
   ра, то возможен следующий диалог с XDELTA:
 
 
             X0+D3,X0+E6!X0+D3/MOVB  (R1)+,R0
 
             X0+D6/BEQL     X0+E8
 
             X0+D8/CMPB     R0,#20
 
             X0+DB/BLSS     X0+D3
 
             X0+DD/CMPB     R0,#7A
 
             X0+E1/BGTR     X0+D3
 
             X0+E3/MOVB     R0,(R2)+
 
 
 
                            - 41 -
 
                        00152-01 97 07-2
 
 
             X0+E6/BRB      X0+D3
 
 
        Для установки точек останова в драйверном коде исполь-
 
   зуется следующая команда:
 
 
        X0 + смещение;В  <RET>
 
 
        Для отображения инструкции драйвера и установки  точки
 
   останова,  смещение  инструкции  прибавляется  к   базовому
 
   регистру, например:
 
 
        X0+1C!инструкция  .;В  <RET>
 
 
        Последняя команда XDELTA устанавливает точку  останова
 
   по отображенному адресу. Более подробное обсуждение  команд
 
   XDELTA можно найти в подразделе 2.10.
 
 
 
        2.8. Разрушение содержимого регистров
 
 
 
        Драйвер часто  обращается  к  программам  ввода/вывода
 
   операционной системы, то необходимо предусмотреть использо-
 
   вание регистров  этими  программами.  Большинство  программ
 
   поддержки  ввода/вывода  в  операционной  системе  свободно
 
   используют регистры от R0 до R3. Частая ошибка  в  драйвере
 
   является загрузка величины в R3 и ожидании найти его нетро-
 
   нутым после обращения за выделением или загрузкой  ресурсов
 
   адаптера общей шины.
 
 
        Некоторые  программы  операционной  системы  пишут   в
 
   регистр R4. В некоторых случаях использование R4  очевидно;
 
   например, программа IOC$REQSCHANL записывает в R4 адрес CRB
 
   устройства. В других случаях  вы  можете  и  не  предвидеть
 
   использование R4.
 
 
                            - 42 -
 
                        00152-01 97 07-2
 
 
        Например, EXE$IOFORK сохраняет содержимое R4  вызываю-
 
   щей программе форк-блоке, а затем пишет  приоритетный  уро-
 
   вень прерывания устройства в R4. Поскольку  нормальный  ход
 
   событий состоит в том, что программа обслуживания  прерыва-
 
   ния возвращается в драйвер по  инструкции  JSB,  а  драйвер
 
   затем вызывает EXE$IOFORK,  которая  возвращает  управление
 
   программе обслуживания прерывания, инструкции, следующие за
 
   JSB в программе обслуживания прерывания, может рассчитывать
 
   только на то, что нетронутым остался R5. Кодовая последова-
 
   тельность такова:
 
 
     MOVQ UCB$L_FR3(R5),R3; восстановить R3, R4.
 
     JSB  @UCB$L_FPC(R5)  ; восстановить драйверный процесс.
 
     .
 
     .
 
 
        Между этими инструкциями программа обслуживания преры-
 
   вания не может сделать никаких  предположений  относительно
 
   содержимого R0-R4.
 
 
     .
 
     .
 
     POPR    #M^<R0,R1,R2,R3,R4,R5> ;восстановить регистры
 
                                    ;прерывания
 
     REI                            ;выйти из прерывания
 
 
 
        2.9. Проверка блоков UCB, IRP, а также PSL
 
 
 
        Кроме использования XDELTA для отладки драйвера  можно
 
   также с ее помощью проверить  содержимое  блока  управления
 
   устройством и соответствующий пакет запроса ввода/вывода.
 
 
 
                            - 43 -
 
                        00152-01 97 07-2
 
 
        Этот инструмент также полезен для проверки содержимого
 
   PSL во время сбоя системы. PSL например, определяет приори-
 
   тетный уровень прерывания в этот момент. При  возникновении
 
   ошибки в системе содержимое PSL и других регистров распеча-
 
   тывается на консольном терминале.
 
 
        Пока система работает, для проверки PSL можно  исполь-
 
   зовать следующую команду в XDELTA:
 
 
        RF+4/
 
 
        Tо-есть, PSL сохраняется в длинном слове, следующем за
 
   PC.
 
 
 
        2.10. Команды XDELTA
 
 
 
        Табл.2 представляет сводку команд XDELTA.
 
                                                     Таблица 2
                      Сводка команд XDELTA
 
   -----------------------------------------------------------
            I
    Команда I    Функция
 
   -----------------------------------------------------------
    /        Открыть ячейку (индицировать содержимое в текущем
             режиме)
    !        Открыть ячейку (индицировать содержимое как инст-
             рукцию)
    <RET>    Закрыть текущую ячейку
    <LF>     Закрыть текущую ячейку; открыть следующую
    <TAB>    Открыть ячейку, указанную текущим значением
    <ESC>    Индицировать предшествующую ячейку
    =        Индицировать значение выражения; установить Q
    +        Прибавить
    -        Вычесть
    Пробел   Прибавить
    *        Умножить
    @        Сдвинуть
    %        Разделить
    ,        Разделитель полей
    Q        Последняя индицированная величина
    RN       Регистр N
    XN       Базовый регистр N
    RN       Прцессорный регистр N
 
 
                            - 44 -
 
                        00152-01 97 07-2
 
 
                                           Продолжение табл. 2
   -----------------------------------------------------------
            I
    Команда I    Функция
 
   -----------------------------------------------------------
    G        Прибавить ^X80000000 к последующему или предшест-
             вующему значению
    Н        Прибавить ^X7FFE0000 к последующему или предшест-
             вующему значению
    .        Текущая ячейка
    S        Выполнить одну инструкцию
    O        Выполнить одну инструкцию, перешагнуть вызов под-
             программы ( CALLX, JSB, BSBX)
    ;Р       Работать от точки останова
    ;В       Установить/сбросить/индицировать точку останова
    ;Е       Выполнить командную строку
    ;G       Перейти к ячейке и работать
    ;X       Установить базовый регистр
    [B       Установить байтовый режим
    [W       Установить режим слова
    [L       Установить режим двойного слова
    [I       Установить режим инструкций
    "        Установить режим ASCII
    'STRING' Поместить строку в текущую точку, выполнить авто-
    (строка) инкремент для этой точки. Одиночная кавычка огра-
             ничивает строку; каждое нажатие   <RET>   и <LF>
             будет запоминаться.
 
 
        2.10.1. Значения и выражения
 
 
 
        Все цифровые значения интерпретируются по шестнадцате-
 
   ричному основанию. Выражения являются строками состоящие из
 
   значений и двоичны операторов, в которых первый и последний
 
   элементы всегда являются значениями, например:
 
 
        G4A32 + 24 - .
 
        Хвостовые операторы игнорируются.
 
 
 
        2.10.2. Специальные символы
 
 
 
        XDELTA определяет следующие специальные символы:
 
 
    .      Текущая ячейка; устанавливается  косой  чертой  (/)
 
           восклицательным знаком и операциями TAB (табуляции)
 
 
                            - 45 -
 
                        00152-01 97 07-2
 
 
    Q      последняя индицированная величина.
 
   X0-->XF базовые регистры; используются для запоминания
 
           значений.
 
   R0-->RF имена общих регистров.
 
   P0--PNN внутренние регистры процессора.
 
   RF+4    PSL
 
   G       ^X80000000; префикс для адресов системного простран
 
           ства; например, G2E эквивалентно ^X8000002E
 
   H       ^X7FFE0000; префикс для адресов области  управления
 
           например, H2E эквивалентно ^X7FFE002E.
 
 
 
        2.10.3. Операторы
 
 
 
        XDELTA опознает следующие операторы:
 
 
   + или пробел  Прибавить
 
   -            Отрицать, вычесть
 
   *            Умножить
 
   %            Разделить
 
   @            Арифметический сдвиг
 
 
        Вычисление выражений производится  слева  направо  без
 
   предшествования (без учета старшинства операторов).
 
 
 
        2.10.4. Команда открытия и индикации значении
 
 
 
        Синтаксис:
 
 
        Адресное-выражение/старое-значение [выражение-нового-
 
        Значения]
 
 
 
 
 
                            - 46 -
 
                        00152-01 97 07-2
 
 
        Введите адресное выражение с последующей косой  чертой
 
   (/).  XDELTA   индицирует   содержимое   указанной   ячейки
 
   (старое-значение) с  последующим  символом  пробела.  Можно
 
   изменить содержимое ячейки, вводя новое значение и  нажимая
 
   после этого клавишу RETURN (возврат, ВК). При нажатии  кла-
 
   виши без  предварительного  указания  некоторого  значения,
 
   старое содержимое остается неизменным.
 
 
        Индикация и запись величины по умолчанию являются дли-
 
   насловными шестнадцатеричными  значениями.  Длина  величины
 
   может быть изменена на байтовую или словную командами изме-
 
   нения установки режима.
 
 
        Косая черта с предшествующим пустым  адресным  выраже-
 
   нием позволяет использовать индицированное значение  (Q)  в
 
   качестве адреса. Это свойство удобно для следующей  цепочки
 
   адресов:
 
 
        Адресное-выражение /старая-величина /старая-величина
 
        /старая-величина
 
 
 
        2.10.5. Команда индикации инструкции
 
 
 
        Синтаксис:
 
 
        Адресное-выражение!декодированная инструкция
 
 
        Введите адресное выражение с последующим восклицатель-
 
   ным знаком (!). XDELTA индицирует содержимое памяти в  виде
 
   инструкции языка MACRO, начиная с указанного адреса.
 
 
        XDELTA не делает  никаких  различий  между  "разумной"
 
   инструкцией и "неразумной" инструкцией или потоком инструк-
 
 
                            - 47 -
 
                        00152-01 97 07-2
 
 
   ций; декодирование всегда начинается с  указанного  адреса.
 
   Команда индикации инструкции  не  позволяет  модифицировать
 
   индицируемую ячейку. Команда устанавливает флажок,  который
 
   обязывает последующие команды закрытия и индикации  следую-
 
   щей или косвенной ячейки выполнять  декодирование  инструк-
 
   ции. Сбросить этот флажок можна командой открытия и индика-
 
   ции величины.
 
 
        Всякий раз, как адрес появляется в  качестве  операнда
 
   инструкции, XDELTA устанавливает для этого  адреса  послед-
 
   нуюю индицированную величину (Q). XDELTA изменяет Q  только
 
   для операндов, которые используют режимы адресации по счет-
 
   чику инструкций или переходов со смещением. Это удобно  при
 
   следующих ветвлениях:
 
 
        Адресное-выражение!BRW адрес-2!инструкция-по-адресу-2
 
 
 
        2.10.6. Команда закрытия и индикации  следующей
 
                ячейки
 
 
 
        Синтаксис:
 
 
         <LF>
 
         адрес/старое-значение
 
 
        Нажмите символ смещения  строки  (LINE  FEED).  XDELTA
 
   закрывает текущую открытую ячейку, после чего  открывает  и
 
   индицирует значение следующей ячейки в соответствии с теку-
 
   щим режимом индикации.
 
 
        Если текущим режимом является индикация инструкции, то
 
   XDELTA не помещает значение в  открытую  ячейку.  Следующая
 
 
 
                            - 48 -
 
                        00152-01 97 07-2
 
 
   ячейка является первой ячейкой за только что индицированной
 
   инструкцией. Если текущий режим является режимом  индикации
 
   значения, то можно занести некоторое  значение  в  открытую
 
   ячейку. В этом  случае,  следующей  ячейкой  будет  текущая
 
   ячейка, инкрементированная текущим размером  данных  (байт,
 
   слово или двойное слово).
 
 
 
        2.10.7. Команда индикации зоны
 
 
 
        Синтаксис:
 
 
        Начальное-адресное-выражение,конечное-адресное-выраже-
 
        Ние/содержимое-начала
 
        Или
 
        Начальное-адресное-выражение,конечное-адресное-выраже-
 
        Ние!содержимое-начала
 
 
        Введите два адресных выражения, разделенных запятой  и
 
   завершенных косой чертой  (/)  или  восклицательным  знаком
 
   (!). XDELTA индицирует зону  адресов,  используя  указанный
 
   режим адресации (значение или инструкции). Если указывается
 
   индикация инструкции, XDELTA декодирует на одну  инструкцию
 
   больше. В противном случае,  XDELTA  индицирует  содержимое
 
   каждой ячейки в текущем режиме типа  данных  (байт,  слово,
 
   двойное слово).
 
 
 
        2.10.8. Косвенная команда
 
 
 
        Синтаксис:
 
 
             <ТАВ>
 
 
 
                            - 49 -
 
                        00152-01 97 07-2
 
 
             адрес/старое-значение
 
 
        Нажмите символ табуляции <ТАВ>. XDELTA использует пос-
 
   леднее индицированное значение в качестве адреса и  индици-
 
   рует этот адрес и его содержимое, используя  текущий  режим
 
   индикации. Эта команда открывает  ячейки  аналогично  косой
 
   черте (/) и восклицательному знаку (!), но печатает  инфор-
 
   мацию на новой строке и индицирует  значение  адреса  перед
 
   показом содержимого адреса.
 
 
 
        2.10.9. Команда индикации предшествующей ячейки
 
 
 
        Синтаксис:
 
 
             <ESC>
 
             адрес/старое-значение
 
 
        Нажмите символ смены регистра <ESC>. Если только теку-
 
   щий режим индикации не является инструкцией, XDELTA  умень-
 
   шает счетчик ячейки на размер текущих данных  и  индицирует
 
   содержимое результирующей ячейки, используя текущий  размер
 
   и тип данных. Эта команда игнорируется в  режиме  индикации
 
   инструкции.
 
 
 
        2.10.10. Команда показа значения
 
 
 
        Синтаксис:
 
 
        Выражение=значение-выражения
 
 
        Введите выражение, с последующим знаком равенства (=).
 
   Выражение может состоять из последовательности  значений  и
 
 
 
                            - 50 -
 
                        00152-01 97 07-2
 
 
   операторов (из множества операторов, перечисленных в сводке
 
   команд). XDELTA показывает значение выражения в  соответст-
 
   вии с текущим типом индицируемых данных. Последняя  индици-
 
   рованная величина (Q) подставляется в значение вычисленного
 
   выражения.
 
 
 
        2.10.11. Команда шаг по инструкции
 
 
 
        Синтаксис:
 
 
        S
 
 
        Напечатайте S. XDELTA вызовет выполнение  одной  инст-
 
   рукции, после чего проиндицирует адрес следующей инструкции
 
   и декодирует эту инструкцию.
 
 
        Команда также  выставляет  флажок,  который  обязывает
 
   последующие команды закрытия и индикации  следующей  ячейки
 
   (или косвенной ячейки) выполнять декодирование  инструкции.
 
   Команда открытия и индикации значения сбрасывает этот  фла-
 
   жок.
 
 
        Если следующей инструкцией являются BSBB,  BSBW,  JSB,
 
   CALLG, CALLS, эта команда переходит в подпрограмму и  инди-
 
   цирует первую инструкцию в этой подпрограмме.
 
 
 
 
 
 
 
 

 
 
 
                            - 51 -
 
                        00152-01 97 07-2
 
 
        2.10.12. Команда   шаг   по   инструкции   через
 
                 подпрограмму
 
 
 
        Синтаксис:
 
 
        О
 
 
        Напечатайте О. XDELTA вызовет выполнение  одной  инст-
 
   рукции, после чего проиндицирует адрес следующей инструкции
 
   и декодирует эту инструкцию.
 
 
        Команда также устанавливает флажок, который  обязывает
 
   последующие команды закрытия и индикации  следующей  ячейки
 
   (или косвенной ячейки) выполнять декодирование  инструкций.
 
   Команда открытия и индикации ячейки (значения ячейки) сбра-
 
   сывает флажок.
 
 
        Если следующими инструкциями являются BSBB, BSBW, JSB,
 
   CALLG или CALLS, XDELTA полностью выполняет подпрограмму  и
 
   индицирует инструкцию, непосредственно следующую за вызовом
 
   подпрограммы; т. е., эта команда перешагивает  через  подп-
 
   рограмму.
 
 
 
        2.10.13. Установка точек останова
 
 
 
        Синтаксис: адресное-выражение;B <RET>
 
 
        Напечатайте адрес, с последующей точкой с запятой  (;)
 
   и буквой в, после чего нажмите RETURN. XDELTA устанавливает
 
   точку останова в указанной ячейке и присваивает  ей  первый
 
   свободный номер точки останова.
 
 
 
 
 
                            - 52 -
 
                        00152-01 97 07-2
 
 
        Альтернативный синтаксис:
 
 
        Адресное выражение,N;B <RET>
 
 
        Напечатайте адрес, в след за ним запятую, одну из цифр
 
   из диапозона от 2 до 8, точку с  запятой  (;),  букву  в  и
 
   затем нажмите RETURN. XDELTA устанавливает точку останова в
 
   указанной ячейке и назначает ей указанный номер точки оста-
 
   нова. Точка останова 1 зарезервирована для INI$BRK.
 
 
        Прежде чем XDELTA выполняет инструкцию как точку оста-
 
   нова, она приостанавливает  обычную  обработку  инструкций,
 
   устанавливает флажок, который обязывает последующие команды
 
   закрытия и индикации следующей или косвенной ячейки  выпол-
 
   нять декодирование инструкций, и выводит следующее  сообще-
 
   ние:
 
 
        N BRK по адресу
 
        Адрес/декодированная-инструкция
 
 
        Теперь можно вводить команды XDELTA, сбросить  флажок,
 
   который управляет  режимом  индикации  инструкции,  задавая
 
   команду открытия и индикации значения.
 
 
 
        2.10.14. Сброс точек останова
 
 
 
        Синтаксис:
 
 
        0,N;B <RET>
 
 
        Напечатайте ноль (0), после чего запятую, единственную
 
   цифру в пределах от 2 до 8, точку с запятой (;), букву в  и
 
   затем нажмите вк. XDELTA сбросит указанную точку  останова.
 
 
 
                            - 53 -
 
                        00152-01 97 07-2
 
 
   точка останова 1 никогда не сбрасывается.
 
 
 
        2.10.15. Индикация списка точек останова
 
 
 
        Синтаксис:
 
 
           ;B   <RET>
 
 
        Напечатайте точку с запятой (;) и следом за ней  букву
 
   в. XDELTA покажет текущее множество  всех  точек  останова.
 
   Для  каждой  точки  останова  XDELTA  индицирует  следующую
 
   информацию:
 
 
        - номер точки останова;
 
        - адрес, по которому установлена эта точка останова;
 
 
        - адрес индикации для  сложных  точек  останова;  (см.
 
   П.2.10.21).
 
 
        - адрес командной строки (для сложных точек останова).
 
 
 
        2.10.16. Установка базовых регистров
 
 
 
        Синтаксис:
 
 
        Адресное-выражение,N;X <RET>
 
 
        Напечатайте выражение, в след за ним запятую (,), одну
 
   цифру в пределах от 0 до  D  (шестнадцатеричная),  точку  с
 
   запятой (;) и букву х. XDELTA присвоит указанное  выражение
 
   базовому регистру с номером N. XDELTA подтверждает установ-
 
   ку базового  регистра,  индицируя  значение,  помещенное  в
 
   базовый регистр.
 
 
 
                            - 54 -
 
                        00152-01 97 07-2
 
 
        Как только XDELTA индицирует адрес, близко расположен-
 
   ный к адресу, храняшемуся в базовом регистре,  она  индици-
 
   рует идентификатор базового регистра  (XN),  сопровождаемый
 
   смещением, которое указывает расположение адреса по отноше-
 
   нию к адресу, сохраненному в  базовом  регистре.  Например,
 
   если базовый регистр 2 содержит 800D046A, а адрес,  который
 
   должна индицировать XDELTA равен 800D052E,  XDELTA  индици-
 
   рует X2+C4. XDELTA вычисляет относительные адреса,  которые
 
   должны быть открыты или  индицированны  и  адреса,  которые
 
   являются операндами инструкций.
 
 
        XDELTA индицирует адрес в формате базовый регистр плюс
 
   смещение в пределах до 800(16) от базового  регистра.  Если
 
   адрес находится за пределами этого диапозона, XDELTA  инди-
 
   цирует его как шестнадцатеричную величину. В пп. 2.10.22  и
 
   2.10.23 рассматриваются  некоторые   заранее   определенные
 
   базовые регистры.
 
 
 
        2.10.17. Продолжение работы от точки останова
 
 
 
        Синтаксис:
 
 
        ;P <RET>
 
 
        Напечатайте точку с запятой (;), сопровождаемую буквой
 
   Р, и затем нажмите клавишу RETURN. XDELTA продолжает выпол-
 
   нение от текущего РС.
 
 
 
        2.10.18. Загрузка РС и продолжение
 
 
 
        Синтаксис:
 
 
 
                            - 55 -
 
                        00152-01 97 07-2
 
 
        Адресное-выражение;G <RET>
 
 
        Напечатайте адрес, точку с запятой  и  G,  после  чего
 
   нажмите RETURN. XDELTA загружает адрес в  рс  и  продолжает
 
   выполнение с нового содержимого счетчика команд.
 
 
 
        2.10.19. Управление режимом индикации
 
 
 
        Синтаксис:
 
 
        [В   байтовый размер
 
        [W   словный размер
 
        [L   длиннословный размер
 
        [I   индикация инструкции
 
        "    индикация в коде ASCII (используя текущий размер)
 
 
        Напечатайте левую прямую  скобку  ([),  сопровождаемую
 
   одной из букв в, W, L, для изменения текущего режима разме-
 
   ра индикации на байтовый, словный или длинасловный,  размер
 
   соответственно. Значение по умолчанию -  длинасловный  раз-
 
   мер. Установка размера  остается  действительной,  пока  не
 
   будет выдана другая команда управления  режимом  индикации.
 
   Например, следующая команда индицирует младший байт, содер-
 
   жащийся по указанному  адресу  и  помещает  новое  значение
 
   только в этот байт:
 
 
        Адресное-выражение [В/ старое-значение новое-значение
 
 
        Напечатайте левую прямую  скобку  ([),  сопровождаемую
 
   буквой I, для изменения текущего режима индикации на формат
 
   инструкции. Эта команда эквивалентна команде  восклицатель-
 
   ного знака (!) и, аналогично ей, отменяется введением косой
 
 
 
                            - 56 -
 
                        00152-01 97 07-2
 
 
   черты (/) или знаком двойной кавычки ("). Режим  инструкции
 
   устанавливает режим индикации ячеек памяти  к  двухсловными
 
   значениями. Пример индикации инструкции см. В п.2.10.5.
 
 
        Содержимое ячеек памяти можно индицировать в  символах
 
   ASCII, вводя адресное выражение в сопровождении знака двой-
 
   ной кавычки ("):
 
 
        Адресное-выражение" старое-значение-в-ASCII
 
 
        Нажатие клавиши смещения строки индицирует (LINE FEED)
 
   следующую ячейку в коде ASCII.
 
 
        Режим индикации остается установленным в  ASCII,  пока
 
   не будет выдана команда косой черты (/) или восклицательно-
 
   го знака (!). В этой точке режим индикации  возвращается  к
 
   шестнадцатеричному. Размер остается неизменным.
 
 
 
        2.10.20. Команда выполнения строки
 
 
 
        Синтаксис:
 
 
        Адресное-выражение;Е <RET>
 
 
        Введите адресное выражение  в  сопровождении  точки  с
 
   запятой (;), буквы Е, после чего  нажмите  клавишу  RETURN.
 
   Эта команда выполняет команды в коде ASCII, находящиеся  по
 
   указанному адресному выражению. Если команды ASCII заканчи-
 
   ваются точкой с запятой, с  последующей  буквой  р,  XDELTA
 
   будет продолжать выполнение программы. Если строка  оканчи-
 
   вается нулями  (один  байт  нулей),  XDELTA  ожидает  новой
 
   команды.
 
 
 
 
                            - 57 -
 
                        00152-01 97 07-2
 
 
        Чтобы создать командную строку, откройте адрес  начала
 
   строки и поместите текст ASCII следующим образом:
 
 
        Адрес/старое-содержимое'XDELTA-команда' <RET>
 
 
        Можно использовать любую команду XDELTA, включая возв-
 
   рат каретки, смещение строки и табуляцию.
 
 
        Для завершения строки нулями, следуйте команде, приве-
 
   денной выше:
 
 
        ./старое-содержимое 0   <RET>
 
 
        Командные строки можно поместить в бесстраничное  сис-
 
   темное пространство корректировки. Для определения  размера
 
   пространства корректировки и его начального адреса, найдите
 
   символ PAT$A_NONPGD в системном файле (SYS$SYSTEM:SYS.MAP).
 
   Этот символ содержит описатель адреса и размера пространст-
 
   ва корректировки, остающейся в системе,  как  это  показано
 
   ниже:
 
 
        PAT$A_NONPGD::
 
            .LONG  размер-в-байтах
 
            .LONG  начальный-адрес-области-пространства
 
 
        Командные строки могут быть предварительно  об'единены
 
   (преассемблированы) с отлаживаемым экспериментальным  драй-
 
   вером. Адреса этих строк определяются как  и  любые  другие
 
   адреса внутри драйвера.
 
 
 
 
 
 
 
 
 
 
 
                            - 58 -
 
                        00152-01 97 07-2
 
 
        2.10.21. Установка сложных точек останова
 
 
 
        Синтаксис:
 
 
        Адресное-выражение,N,адресное-выражение-индикации,адре
 
        Командной-строки;В   <RET>
 
 
        Введите адресное  выражение,  с  последующей  запятой,
 
   одну цифру из диапазона от 2 до 8, другое адресное  выраже-
 
   ние и адрес командной строки. Первый адрес является адресом
 
   точки останова; цифра равна номеру точки  останова.  XDELTA
 
   показывает содержимое адреса  индикации  в  текущем  режиме
 
   индикации по достижении  точки  останова.  Адрес  командной
 
   строки, указанный в последнем параметре команды,  обрабаты-
 
   вается после автоматической индикации.
 
 
 
        2.10.22. Команды, сохраняемые в XDELTA
 
 
 
        XDELTA  содержит  две  заранее   определенные   строки
 
   команд, чьи адреса находятся в базовых регистрах ХЕ  и  ХF.
 
   Эти команды можно использовать при  общей  отладке  системы
 
   так же, как и при отладке драйвера; они выполняют следующие
 
   функции:
 
 
       ХЕ  Использует значение базового регистра Х0 в качестве
 
           номера физической страницы и индицирует базу  дан-
 
           ных PFN для этой страницы;
 
       XF  Устанавливает базовый регистр Х0 значением (PFN)
 
           регистра 0 и выполняет те же функции, что и ХЕ.
 
 
        Сохраняемые  команды  инициализируются   установлением
 
   используемым ими  регистры  релокации  (Х6-ХD).  Для  этого
 
 
                            - 59 -
 
                        00152-01 97 07-2
 
 
   задаются следующие команды:
 
 
        XE;E    <RET>
 
        XF;E    <RET>
 
 
        Теперь  можно  использовать  сохраняемые  команды  для
 
   получения следующей информации о номере физической  страни-
 
   цы:
 
 
        - указанный номер физической страницы (PFN);
 
 
        - состояние PFN;
 
 
        - тип PFN;
 
 
        - счет обращений к PFN;
 
 
        - предыдущий элемент PFN  /индексный  список  рабочего
 
   набора;
 
 
        - следующий элемент PFN /счетчик разделения;
 
 
        - указатель входа таблицы страниц (PTE) на PFN;
 
 
        - адрес вспомогательного хранения PFN;
 
 
        - виртуальный номер блока в процессе обмена образов.
 
 
 
        2.10.23. Сохраняемые базовые регистры
 
 
 
        XDELTA определяет два базовых регистра,  полезных  при
 
   отладке системы: Х4 и Х5. Базовый регистр  4  соответствует
 
   глобальному символу  SCH$GL_CURPCB.  Этот  символ  содержит
 
   адрес блока управления  (РСВ)  текущего  процесса.  Базовый
 
   регистр Х5 соответствует глобальному символу SCH$GL_PCBVEC,
 
 
 
                            - 60 -
 
                        00152-01 97 07-2
 
 
   который содержит начальный адрес списка РСВ.
 
 
 
        2.11. DELTA
 
 
 
        DELTA является  инструментом  отладки,  который  может
 
   быть связан (слинкирован) с пользовательской программой для
 
   контроля за выполнением этой программы.  Для  компоновки  и
 
   запуска используются следующие команды:
 
 
        $  LINK имя-программы
 
        $  DEFINE LIB$DEBUG SYS$LIBRARY:DELTA
 
        $  RUN/DEBUG имя-программы
 
 
        DELTA воспринимает все команды XDELTA плюс две  допол-
 
   нительные команды, рассматриваемые в пп.2.11.1, 2.11.2.
 
 
 
        2.11.1. Команда выхода
 
 
 
        Синтаксис:
 
 
        EXIT <RET>
 
 
        По команде EXIT DELTA возвращает управление  интерпре-
 
   татору команд.
 
 
 
        2.11.2. Чтение и изменение ячеек в пространстве
 
                процесса
 
 
 
        Синтаксис:
 
 
        Идентификатор_процесса:адресное_выражение/старое_содер
 
        жимое
 
 
 
                            - 61 -
 
                        00152-01 97 07-2
 
 
        DELTA  индицирует  текущее  содержимое  по  указанному
 
   адресному  выражению  внутри  указанного  процесса.  Флажок
 
   модификации управляет возможностью изменения ячеек,  откры-
 
   тых по этой команде. Для проверки флажка, введите:
 
 
        ;М   <RET>
 
 
        По умолчанию доступ к ячейке для модификации  запрещен
 
   (М=0). Чтобы открыть, проверить и изменить ячейку,  введите
 
   команды:
 
 
        1;M   <RET>
 
        Идентификатор_процесса:адресное_выражение/старое_содер
 
        жимое новое_содержимое
 
 
 
        2.12. Общее  указание  по  отладке  драйверов
 
              устройств
 
 
 
        В настоящем  подразделе  обсуждаются  ошибки,  которые
 
   являются наиболее частыми в процессе отладки и  описывается
 
   дополнительная отладочная техника.
 
 
 
        2.12.1. Обращения к системным адресам
 
 
 
        При обращении  драйвера  к  системным  адресам  внутри
 
   управляющей программы  должен  использоваться  общий  режим
 
   адресации (G^). Например:
 
 
        JSB     G^INI$BRK
 
 
 
 
 
 
 
 
                            - 62 -
 
                        00152-01 97 07-2
 
 
        2.12.2. Открытие регистров устройства в XDELTA
 
 
 
        Обращение к 16-разрядным  регистрам  устройств  должно
 
   выполняться с помощью инструкции обработки слова; обращения
 
   к 8-разрядным  регистрам  устройств  должно  выполняться  с
 
   помощью инструкций обработки байтов. Эти ограничения  отно-
 
   сятся к команде EXAMINE в XDELTA; поэтому  перед  проверкой
 
   регистров устройства необходимо правильно установить  режим
 
   управления. Например, если адрес устройства CSR находится в
 
   R4, используется следаящую команда:
 
 
        R4/адрес_CSR [W/содержимое_CSR
 
 
 
        2.12.3. Некорректное обращение к регистрам
 
 
 
        Общей ошибкой в драйвере является  обращение  к  несу-
 
   ществующим регистрам устройства или обращение к  существую-
 
   щему регистру, но по инструкции с ошибочной длиной  операн-
 
   да. Эти обращения приводят  к  неисправимым  исключительным
 
   условиям по машинному контролю.
 
 
 
        2.12.4. XDELTA и сбои системы
 
 
 
        Ошибки в драйвере могут привести к такому  приостанову
 
   работы системы, что не  вызвается  XDELTA.  В  этом  случае
 
   единственным выходом является вызов сбойной ситуации в сис-
 
   теме. Для достижения этого, необходимо выполнить процедуру,
 
   описанную в [4], система будет сигнализировать о  появлении
 
   фатальной ошибки.
 
 
 
 
 
                            - 63 -
 
                        00152-01 97 07-2
 
 
        Для передачи управления XDELTA после появления фаталь-
 
   ной ошибки, необходимо остановиться в SYSBOOT во время ини-
 
   циализации системы и установить в ноль параметр  BUGREBOOT.
 
   Система остановится в XDELTA, что позволит  проверить  блок
 
   управления устройством и другие  драйверные  данные,  чтобы
 
   определить ошибки в драйвера.
 
 
        Другой, более полный,  путь  для  определения  причины
 
   сбоя системы - сохранить параметр BUGREBOOT установленным в
 
   1, разрешить перезагрузку системы и затем вызвать программу
 
   анализа аварийного состояния системы, чтобы проверить  сос-
 
   тояние структур  данных  ввода/вывода  во  время  фатальной
 
   ошибки. В документе [3] предоставляется детальная  информа-
 
   ция о формате стека при фатальной ошибке.
 
 
 

 
 
 
 
 
 
 
 
 
 
 
 
 
                            - 64 -
 
                        00152-01 97 07-2
 
 
                                                  Приложение 1
 
 
                    База данных ввода/вывода
 
 

 
                     1. ОСНОВНЫЕ ПОЛОЖЕНИЯ
 
 
 
 
        База данных ввода/вывода представляет  собой  совокуп-
 
   ность управляющих блоков, размещенных в бесстраничной  сис-
 
   темной памяти. Эта база данных обеспечивает выдачу  следую-
 
   щей информации:
 
 
        - пакеты запросов ввода/вывода, в которых описаны зап-
 
   росы продолжающегося ввода или вывода;
 
 
        - характеристики  устройства  для  каждого  типа  уст-
 
   ройств;
 
 
        - количество и тип каждой единицы устройства;
 
 
        - текущую активность каждого устройства;
 
 
        - точки внешних входов для всех драйверов устройств;
 
 
        - точки входов для подпрограмм инициализации  контрол-
 
   лера и устройства;
 
 
        - код диспетчеризации вектора прерывания;
 
 
        - адреса регистров устройств;
 
 
 
 
 
                            - 65 -
 
                        00152-01 97 07-2
 
 
        - карту разрядов пути данных адаптера общей шины.
 
 
        Большая часть этой базы данных ввода/вывода  создается
 
   и используется только подпрограммами МОС ВП.  Другие  части
 
   являются первичным источником  данных  для  драйверов  уст-
 
   ройств. Рассматриваются все управляющие блоки  базы  данных
 
   ввода/вывода и описываются их поля. Описания полей даются в
 
   том порядке, в котором они появляются в управляющих блоках.
 
 
        Код драйвера  должен  рассматривать  поля,  помеченные
 
   звездочкой (*), как  поля,  доступные  только  для  чтения.
 
   Поля,отмеченные  как  "свободные"   или   "неиспользуемые",
 
   резервируются для будущих применений.
 
 
 
        1.1. Блок управления конфигурацией (ACF)
 
 
 
        Блок управления конфигурацией  используется  средством
 
   автоконфигурации SYSGEN для  описания  устройства,  которое
 
   добавляется им в систему. Драйверы устройств могут получать
 
   доступ к этой структуре данных только в том случае, если  в
 
   прологовой таблице драйвера определена подпрограмма  выдачи
 
   устройства, и только тогда, когда подпрограмма находится  в
 
   процессе выполнения. При определенных условиях  информация,
 
   хранимая  в  блоке  управления  конфигурацией,  может  быть
 
   использована подпрограммой выдачи устройства.
 
 
        Поля, описываемые в  блоке  управления  конфигурацией,
 
   иллюстрируются на рис. 1 и представлены в табл. 1.
 
 
 
 
 
 
 
 
 
                            - 66 -
 
                        00152-01 97 07-2
 
 
               Блок управления конфигурацией
 
   -----------------------------------------------------------
   :                    ACF$L_ADAPTER*                       :
   -----------------------------------------------------------
   :                    ACF$L_CONFIGREG*                     :
   -----------------------------------------------------------
   :  ACF$B_AFLAG*:  ACF$B_UNIT*:       ACF$W_AVECTOR*       :
   -----------------------------------------------------------
   :                    ACF$L_CONTRLREG*                     :
   -----------------------------------------------------------
   :ACF$B_NUMUNIT*: ACF$B_CUNIT*:       ACF$W_CVECTOR*       :
   -----------------------------------------------------------
   :                    ACF$L_DEVNAME*                       :
   -----------------------------------------------------------
   :                    ACF$L_DRVNAME*                       :
   -----------------------------------------------------------
   :ACF$B_COMWO_VEC*:ACF$B_CNUMVEC*:    ACF$W_MAXUNITS*      :
   -----------------------------------------------------------
   :  не используется        :ACF$B_NUMUNIT*:ACF$B_COMBO_CSR*:
   -----------------------------------------------------------
   :                    ACF$L_DLVR_SCRH                      :
   -----------------------------------------------------------
 
 
                             Рис. 1
 
 
                                                     Таблица 1
            Содержимое блока управления конфигурацией
 
   -----------------------------------------------------------
                   I
         Поле      I            Содержимое
                   I
   -----------------------------------------------------------
   ACF$L_ADAPTER*
                         Адрес блока управления адаптером для
                     адаптера, включенного к данному  моменту
                     в конфигурацию.
   ACF$L_CONFIGREG*
                        Адрес регистра конфигурации для адап-
                     тера, включенного к данному  моменту   B
                     конфигурацию.
   ACFSW_AVECTOR*
                        Смещение от базы системного управляю-
                     щего блока  (SCB) до  вектора прерывания
                     адаптера, включенного в данный момент  в
                     конфигурацию.
   ACF$B_AUNIT*
                        Номер   устройства    адаптера    для
                     устройства или контроллера,  включенного
                     в данный момент в конфигурацию.
   ACF$B_AFLAG*
                        Флаги, ассоциированные  с   операцией
                     автоматической конфигурации. В этом поле
                     определяются следующие флаги:
                     ACF$V_RELOAD    Перезагружаемый      код
                                     драйвера;
 
 
                            - 67 -
 
                        00152-01 97 07-2
 
 
                                           Продолжение табл. 1
   -----------------------------------------------------------
                   I
         Поле      I            Содержимое
                   I
   -----------------------------------------------------------
                     ACF$V_CRBBL     CRB и IDB для этого уст-
                                     ройства уже построены;
                     ACF$V_SCBVEC    CVECTOR является  смеще-
                                     нием в  SCB;
                     ACF$V_NOLOAD_DB Не загружать базу данных
                                     ввода/вывода,  загружить
                                     только драйвер;
                     ACF$V_SUPPORT  Устройство,поддерживаемое
                                    МОС ВП;
                     ACF$V_GETDONE  Адреса структур данных  в
                                    базе  данных ввода/вывода
                                    получены.
   ACF$L_CONTROLREG*
                        Адрес регистра команд и состояния  для
                     контролера, включенного в данный момент в
                     конфигурацию.
   ACF$W_CVECTOR*
                       Смещение в таблице векторов блока упра-
                     вления адаптером до длинного слову, кото-
                     рое содержит адрес передачи вектора  пре-
                     рывания, используемого      контроллером,
                     включенным в данный момент в конфигурацию
                     (если не установлен флаг ACF$V-SCBVEC ).
                     если ACF$V-SCBVEC установлен, то     это
                     поле содержит смещение от базы   SCB  до
                     вектора прерываний контроллера, включен-
                     ного в данный момент в конфигурацию.
   ACF$B_CUNIT*
                       Номер устройства для устройства, вклю-
                     ченного в данный момент в конфигурацию.
   ACF$L_DEVNAME*
                        Адрес подсчитанной   строки  символов
                     ASCII,в которой задается имя контроллера,
                     включенного в данный момент в конфигура-
                     цию.
   ACF$L_DRVNAME*
                        Адрес строки символов  ASCII CO счет-
                     чиком, в  которой  задается имя драйвера
                     для контроллера, включенного  в   данный
                     момент в конфигурацию.
   ACF$W_MAXUNITS*
                        Максимальное   количество  устройств,
                     которые могут быть присоединенны к конт-
                     ролеру, включенному в данный  момент   в
                     конфигурацию.
   ACF$B_CNUMVEC*
                        Количество  векторов прерывания  для
                     контроллера, включенного в данный момент
                     в конфигурацию.
   ACF$B_COMBO_VEC*
                         Поле называется ACF$B_COMBO_VECTOR_
                     OFSET, и содержит смещение  до векторов
                     комбинированных устройств.
 
 
                            - 68 -
 
                        00152-01 97 07-2
 
 
                                           Продолжение табл. 1
   -----------------------------------------------------------
                   I
         Поле      I            Содержимое
                   I
   -----------------------------------------------------------
   ACF$B_COMBO_CSR*
                         Поле называется ACF$B_COMBO_CSR_OFSET
                     и содержит смещение до начала управляющих
                     регистров  комбинированных устройств.
   ACF$B_NUMUNIT*
                        Число  устройств включаемых в конфигу-
                     рацию для контроллера  включенного в дан-
                     ный момент в конфигурацию.
   ACF$L_DLVR_SCRH
                        Поле, доступное для использования под-
                     программе выдачи устройства. "SYSGEN"
                     никогда не изменяет это поле.
 
 
        1.2. Блок управления адаптером (ADP)
 
 
 
        Адаптер общей шины включенный в конфигурацию  системы,
 
   представляется МОС ВП и подпрограммам драйверов посредством
 
   блока управления адаптером. Блок управления адаптером  хра-
 
   нит характерные для  адаптера  статические  и  динамические
 
   данные, такие как адрес CSR  адаптера  и  очереди  ожидания
 
   регистров отображения.
 
 
        Поля ADP для адаптера  общей  шины  иллюстрируются  на
 
   рис. 2 и описаны в табл. 2.
 
 
 
 
 
 

 
 
 
 
 
 
 
                            - 69 -
 
                        00152-01 97 07-2
 
 
               Блок управления адаптером
 
   ----------------------------------------------------------
   :                    ADP$L_CSR*                          :
   ----------------------------------------------------------
   :                    ADP$L_LINK*                         :
   ----------------------------------------------------------
   : ADP$B_NUMBER*: ADP$B_TYPE* :         ADP$W_SIZE*       :
   ----------------------------------------------------------
   :       ADP$W_ADPTYPE*       :         ADP$W_TR*         :
   ----------------------------------------------------------
   :                    ADP$L_VECTOR*                       :
   ----------------------------------------------------------
   :                    ADP$L_DPQFL*                        :
   ----------------------------------------------------------
   :                    ADP$L_DPQBL*                        :
   ----------------------------------------------------------
   :                    ADP$L_AVECTOR$                      :
   ----------------------------------------------------------
   :                                                        :
   /                    ADP$_BI_ONLY(16 байтов)             /
   /                                                        /
   ----------------------------------------------------------
   :                    ADP$L_MRQFL*                        :
   ----------------------------------------------------------
   :                    ADP$L_MRQBL*                        :
   ----------------------------------------------------------
   :                                                        :
   /                ADP$L_INTD*(12 байтов)                  /
   /                                                        /
   ----------------------------------------------------------
   :                                                        :
   /              ADP$L_UBASCB*(16 байтов)                  /
   /                                                        /
   ----------------------------------------------------------
   :                                                        :
   /              ADP$L_UBASPTE*(2 длинных слова)           /
   /                                                        /
   ----------------------------------------------------------
   :                ADP$L_MRACTMDRS*                        :
   ----------------------------------------------------------
   :     ADP$W_MRNFENCE*        :      ADP$W_DPBITMAP*      :
   ----------------------------------------------------------
   :                                                        :
   /                ADP$W_MRNREGARY* (248 байтов)           /
   /                                                        /
   ----------------------------------------------------------
   :                            :   ADP$W-MRFFENCE*         :
   :                            -----------------------------
   /      ADP$W_MRFREGARY$ (248 байтов)                     /
   /                                                        /
   --------------------------------                         /
   :     ADP$W_UMR_DIS*         :                           :
   ----------------------------------------------------------
 
 
                             Рис. 2
 
 
 
 
                            - 70 -
 
                        00152-01 97 07-2
 
 
                                                       Таблица 2
              Содержимое блока управления адаптером
 
   -------------------------------------------------------------
                  I
       Поле       I              Содержимое
                  I
   -------------------------------------------------------------
   ADP$L_CSR*
                        Виртуальный адрес регистра конфигурации
                    адаптера. Это поле устанавливается при ини-
                    циализации процессора. Регистр конфигурации
                    отмечает базу пространства регистров  адап-
                    тера, область,  содержащую  регистры  путей
                    данных, регистры отображения или любые дру-
                    гие  регистры,  соответствующие  реализации
                    адаптера.
   ADP$L_LINK*
                        Адрес следующего ADP. Это поле  записы-
                    вается программой инициализации процессора.
                    значение 0 показывает,  что  это  последний
                    ADP.
   ADP$W_SIZE*
                        Размер блока управления ADP.  Программа
                    инициализации процессора заполняет это поле
                    при создании ADP. Для адаптера оно включает
                    код  программы  обслуживания  прерываний  и
                    таблица векторов устройства.
   ADP$B_TYPE*
                        Тип управляющего блока. Программа  ини-
                    циализации процессора заносит  в  это  поле
                    символическую константу DYN$C_ADP, во время
                    создания ADP.
   ADP$B_NUMBER*
                        Номер данного типа адаптера  устанавли-
                    вается программой инициализации при  созда-
                    нии ADP.
   ADP$W_TR*
                        Номер гнезда адаптера.  Программа  ини-
                    циализации процессора  заполняет  это  поле
                    при создании ADP. Процедура загрузки  драй-
                    вера  сравнивает  номер,   определенный   в
                    команде CONNECT, с этим полем  каждого  ADP
                    системы для того,чтобы определить, к какому
                    адаптеру присоединено устройство.
   ADP$W_ADPTYPE*
                        Тип адаптера.  Программа  инициализации
                    процессора заносит в это поле символическую
                    константу  AT$_UBA  при  создании  ADP  для
                    адаптер общей шины, адаптера массбас резер-
                    вирован AT$_MBA.
   ADP$L_VECTOR*
                        Адрес таблицы векторов. Таблица  содер-
                    жит 512 байтов векторов размером в  длинное
                    слово, которые соответствуют векторам  пре-
                    рываний устройств ( 0-%0777 ). ADP$L_VECTOR
                    указывает на вторую  или  третью)  страницу
                    системного управляющего блока  (SCB).  Про-
                    цессор использует эту страницу при  диспет-
 
 
                            - 71 -
 
                        00152-01 97 07-2
 
 
                                             Продолжение табл. 2
   -------------------------------------------------------------
                  I
       Поле       I              Содержимое
                  I
   -------------------------------------------------------------
                    черизации прерывания от устройства на драй-
                    верную подпрограмму  обслуживания  прерыва-
                    ния. Каждый  вход  вектора,  который  соот-
                    ветствует используемому  вектору,  содержит
                    адрес  диспетчера  прерываний   контроллера
                    (CRB$L_INTD ). Если обрабатываются  косвен-
                    ные прерывания по вектору, то  ADP$L_VECTOR
                    указывает на  страницу,  распределенную  из
                    нестраничного пула.  Каждое  длинное  слово
                    этой   страницы,   которое    соответствует
                    используемому вектору, содержит адрес  дис-
                    петчера       прерываний        контроллера
                    (CRB$L_INTD+2).когда   адаптер   производит
                    прерывание от имени устройства, подпрограм-
                    ма обслуживания прерываний  адаптера  общей
                    шины сохраняет регистры  R0-R5,  определяет
                    адрес вектора устройства, индексирует  таб-
                    лицу векторов  и  выполняет  инструкцию  из
                    CRB$L_INTD+2.  Таблицы  векторов,   которые
                    соответствуют   неиспользуемым    векторам,
                    содержат  адрес  подпрограммы  обслуживания
                    непредусмотренных прерываний адаптера общей
                    шины.
   ADP$L_DPQFL*
                        Следующий элемент очереди ожидания пути
                    данных.    Программы     IOC$REQDATAP     и
                    IOC$RELDATAP читают и записывают это  поле.
                    когда  форкпроцесс   драйвера   запрашивает
                    буферизованный путь данных, а тот в  данный
                    момент недоступен,  IOC$REQDATAP  сохраняет
                    контекст драйвера  в  форк-блоке  UCB  уст-
                    ройства, заносит адрес форк-блока в очередь
                    ожидания  пути  данных  и  приостанавливает
                    форк-процесс драйвера. Когда другой драйвер
                    вызывает программу IOC$RELDATAP  для  осво-
                    бождения буферизованного пути данных, подп-
                    рограмма удаляет из очереди  ожидания  пути
                    данных адрес форк-блока  UCB,  распределяет
                    путь данных  для  драйвера  и  реактивирует
                    форк-процесс этого драйвера.
   ADP$L_DPQBL*
                         Предыдущий  элемент  очереди  ожидания
                    пути данных.  IOC$REQDATAP  и  IOC$RELDATAP
                    читают и записывают это поле.
   ADP$L_AVECTOR$
                        Адрес первого  вектора  SCB  для  этого
                    адаптера.
   ADP$L_BI_ONLY$
                    Резерв.
   ADP$L_MRQFL*
                         Следующий  элемент  очереди   ожидания
                    регистра       отображения.       Программы
                    IOC$REQMAPREG  и  IOC$RELMAPREG  читают   и
 
 
                            - 72 -
 
                        00152-01 97 07-2
 
 
                                             Продолжение табл. 2
   -------------------------------------------------------------
                  I
       Поле       I              Содержимое
                  I
   -------------------------------------------------------------
                   записывают  эти  поля.  Когда  форк-процесс
                   драйвера запрашивает набор регистров  отоб-
                   ражения, а они в данный момент  недоступно,
                   IOCSREQMAPREG сохраняет форк-контекст драй-
                   вера  в  форк-блоке  UCB  устройства  ства,
                   заносит адрес форк-блока в очередь ожидания
                   регистров  отображения  и  приостанавливает
                   форк-процесс драйвера. Когда другой драйвер
                   вызывает программу IOC$RELMAPREG для  осво-
                   бождения  набора   регистров   отображения,
                   подпрограмма удаляет  из  очереди  ожидания
                   регистров отображения адрес форк-блока UCB,
                   распределяет  для  драйвера   запрошиваемый
                   набор регистров отображения и вновь активи-
                   зирует форк-процесс драйвера.
   ADP$L_MRQBL*
                        Предыдущий  элемент  очереди  ожидания
                   регистров      отображения.       Программы
                   IOC$REQMAPREG  и  IOC$RELMAPREG  читают   и
                   записывают это поле.
   ADP$L_INTD*
                       Вектор передачи прерывания. Когда  уст-
                   ройство  присоединенное  к  адаптеру  общей
                   шины,  запрашивает  аппаратное  прерывание,
                   процессор  передает  управления   на   поле
                   ADP$L_INTD блока управления адаптером общей
                   шины.это поле содержит код,который  диспет-
                   чиризирует прерывание на собственную  подп-
                   рограмму  обслуживания   прерываний   этого
                   драйвера.   Вектор   передачи    прерывания
                   используется только для  адаптера,  который
                   непосредственно порождает прерывания.
   ADP$L_UBASCB*
                       Из четырех длинных слов, которые содер-
                   жат входные значения системного управляюще-
                   го блока, по одному для каждого уровня зап-
                   роса шины (BR) или вектора прерывания.  Эти
                   значения используются процедурой восстанов-
                   ления по сбоям питания адаптера общей шины.
   ADP$L_UCBSPTE*
                       Входные значения страничной таблицы для
                   базы пространства регистров адаптера  общей
                   шины  и  для  базы  пространства  регистров
                   ввода/вывода по общей  шины.  Эти  значения
                   используются при  восстановлении  по  сбоям
                   питания адаптера общей шины.
   ADP$L_MRACTMDRS*
                         Количество   дескрипторов    активных
                   регистров отображения, на которые указывают
                   ADP$L_MRNREARY      и      ADP$L_MRFREGARY.
                   IOC$REQMAPREG  и  IOC$RELMAPREG  используют
                   эти поля при распределении  и  освобождении
                   регистров отображения общей шины.
 
 
                            - 73 -
 
                        00152-01 97 07-2
 
 
                                             Продолжение табл. 2
   -------------------------------------------------------------
                  I
       Поле       I              Содержимое
                  I
   -------------------------------------------------------------
   ADP$W_DPBITMAP*
                       Карта разрядов распределения пути  дан-
                   ных. IOC$REQDATAR и IOC$RELDATAP  читают  и
                   записывают это поле. Программа  инициализа-
                   ции процессора устанавливает  карту  разря-
                   дов, чтобы показать  доступность  буферизо-
                   ванных путей данных, поддерживаемых адапте-
                   ром общей шины. Состояние каждого  из  дос-
                   тупных буферизованных путей данных (находя-
                   щегося в использовании или  просто  доступ-
                   ных) записывается в карте отображения расп-
                   ределения  путей  данных.  Каждому  разряду
                   поля соответствует один путь данных .  Если
                   разряд  сброшен,  то  соответствующий  путь
                   данных в настоящий момент  распределен  под
                   форк-процесс драйвера.
   ADP$W_MRNFENCE*
                        Содержит  отрицательную  единицу.  Это
                   поле действует как ограничитель  определяе-
                   мого ADP$L_MRNREGARY.
   ADF$W_MRNREGARY*
                       Массив из 124 слов "количество  регист-
                   ров"  для  регистра  отображения.количество
                   активных в данных момент  слов,  или  ячеек
                   этого массива содержится в ADP$L_MRACTMDRS.
                     Каждая активная  ячейка  дает  количество
                   свободных  регистров  отображения.   Каждой
                   активной ячейки в этом массиве  ставится  в
                   соответствие   номер   первого   свободного
                   регистра отображения в массиве,  определяе-
                   мом ADP$W_MRFREGARY. Совместно эти значения
                   задают базовый регистр отображения и  коли-
                   чество регистров отображения для блока сво-
                   бодных регистров отображения. Эта  информа-
                   ция используется для распределения и  осво-
                   бождения регистров отображения общей шины.
   ADP$W_MRFFENCE*
                       Слово, содержащее отрицательную  едини-
                   цу. Это поле действует как ограничител  для
                   массива, определяемого ADP$W_MRFREGARY.
   ADP$W_MRFREGARY*
                       Массив из 124 слов "первый регистр" для
                   регистра отображения. Количество активных в
                   данный момент ячеек этого массива содержит-
                   ся  в  ADP$L_MRACTMDRS  .  Каждая  активная
                   ячейка  задает  номер  первого   свободного
                   регистра отображения. Для  каждой  активной
                   ячейки этого масива  существует  соответст-
                   вующая ячейка в массиве количества  регист-
                   ров, которая  задает  количество  свободных
                   регистров отображения. Совместчно эти зназ-
                   начения задают базовый регистр  отображения
                   и количество свободных регистров  отображе-
 
 
                            - 74 -
 
                        00152-01 97 07-2
 
 
                                             Продолжение табл. 2
   -------------------------------------------------------------
                  I
       Поле       I              Содержимое
                  I
   -------------------------------------------------------------
                   ния для блока свободных регистров отображе-
                   ния. Эта информация используется для  расп-
                   ределения и освобождения регистров  отобра-
                   жения общей шины.
   ADP$W_UMR_DIS*
                       Количество недоступных регистров  отоб-
                   ражения. При     инициализации системы  не-
                   которые  регистры отображения    могут быть
                   сделаны     недоступными так, что соответс-
                   твующие им адреса на     ошщей шины   могут
                   быть доступны     непосредственно через фи-
                   зические адреса внутренней шины процессора.
 
 
        1.3. Блок управления каналом (CCB)
 
 
 
        Когда процесс назначает устройству канал  ввода/вывода
 
   с  помощью  $ASSIGN,  системная  обслуживающая   программа,
 
   EXE$ASSIGN размещает свободный  блок  среди  распределенных
 
   ранее блоков управления каналами  данного  процесса.  Затем
 
   EXE$ASSIGN заносит в CCB описание устройства,  присоединен-
 
   ного к ССВ каналу.
 
 
        Поля блока управления каналом иллюстрируются на рис. 3
 
   и описаны в табл. 3.
 
 
                Блок  управления каналом
 
   -----------------------------------------------------------
   :                    CCB$L_UCB*                           :
   -----------------------------------------------------------
   :                    CCB$L_WIND*                          :
   -----------------------------------------------------------
   :    CCB$W_IOC*             :  CCB$B_AMOD* :  CCB$B_STS*  :
   -----------------------------------------------------------
   :                    CCB$L_DIRP*                          :
   -----------------------------------------------------------
 
 
                             Рис. 3
 
 
 
 
 
                            - 75 -
 
                        00152-01 97 07-2
 
 
                                                       Таблица 3
               Содержимое блока управления каналом
 
   -------------------------------------------------------------
                I
      Поле      I                 Содержание
                I
   -------------------------------------------------------------
   CCB$L_UCB*
                        Адрес блока управления устройством  для
                    назначенного устройства. EXE$ASSIGN записы-
                    вает значение в это  поле.  EXE$QIO  читает
                    это  поле,  чтобы  определить,  что  запрос
                    ввода/   вывода    указывает    на    канал
                    ввода/вывода  процесса,  назначенный   уст-
                    ройству и получить  адрес  UCB  устройства.
   CCB$L_WIND*         Адрес       блока             управления
                    окном (WCB)  для  назначения  устройства  с
                    файловой структурой. Это поле  записывается
                    ACP и читается  EXE$QIO  ACP  устройства  с
                    файловой структурой создает блок управления
                    окном, когда процесс имеет доступ  к  файлу
                    на устройстве, назчначенном каналу  процес-
                    са. Блок управления окном отображает  коли-
                    чество виртуальных блоков файла на последо-
                    вательность физических адресов устройства.
   CCB$B_STS*
                        Состояние канала.
   CCB$B_AMOD*
                        Увеличенный на  единицу  режим  доступа
                    процесса  в   момент   назначения   канала.
                    EXE$ASSIGN записывает в это  поле  значение
                    режима доступа процесса.
   CCB$W_IOC*
                        Количество  неудовлетворенных  запросов
                    ввода/вывода  в канале. EXE$QIO увеличивает
                    значение этого поля в начале обработки зап-
                    роса ввода/вывода, определяющего канал.  Во
                    время      постобработки       ввода/вывода
                    AST-подпрограмма уменьшает  значение  этого
                    поля.это поле читают некоторые подпрограммы
                    FDT и EXE$DEASSIGN.
   CCB$L_DIRP*
                        Адрес пакета запроса ввода/вывода, зап-
                    рашивающего отказа от доступа  ряд  неудов-
                    летворенных  запросов  ввода/вывода   могут
                    одновременно находиться в состоянии  ожида-
                    ния на одном и том же  канале  ввода/вывода
                    процесса.  Если  процесс,  который  владеет
                    каналом, выдает запрос на отказ от  доступа
                    к  устройству,  EXE$QIO  держит  запрос  на
                    отказ до тех пор, пока не обработаются  все
                    другие      неудовлетворенные       запросы
                    ввода/вывода.
 
 
 
 
 
 
 
                            - 76 -
 
                        00152-01 97 07-2
 
 
        1.4. Блок запросов канала (CRB)
 
 
 
        Активность каждого контроллера в  конфигурации  описы-
 
   вается в  блоке  запросов  канала.  Этот  управляющий  блок
 
   содержит указатели на очереди ожидания  драйверов,  готовых
 
   получить доступ к устройству через контроллер. В нем  также
 
   хранится точки входов в драйверные подпрограммы  обслужива-
 
   ния     прерываний     и     прдпрограммы     инициализации
 
   устройства/контроллера.
 
 
        Поля блока запросов канала иллюстрируются на рис. 4  и
 
   описаны в табл. 4.
 
 
                  Блок запросов канала
 
   -----------------------------------------------------------
   :                    CRB$L_WQFL*                          :
   -----------------------------------------------------------
   :                    CRB$L_WQBL*                          :
   -----------------------------------------------------------
   :CRB$B_TT_TYPE* : CRB$B_TYPE* :     CRB$W_SIZE*           :
   -----------------------------------------------------------
   :не используется: CRB$B_MASK* :     CRB$W_REFC*           :
   -----------------------------------------------------------
   :                   CRB$L_AUXSTRUC*                       :
   -----------------------------------------------------------
   :                   CRB$L_TIMELINK*                       :
   -----------------------------------------------------------
   :                   CRB$L_DUETIME*                        :
   -----------------------------------------------------------
   :                   CRB$L_TOUTROUT*                       :
   -----------------------------------------------------------
   :                   CRB$L_LINK*                           :
   -----------------------------------------------------------
   /                                                         /
   /           CRB$L_INTD* (36 байтов )                      /
   -----------------------------------------------------------
   /                                                         /
   /           CRB$L_INTD2* ( 36 байтов )                    /
   -----------------------------------------------------------
 
 
                             Рис. 4
 
 
 
 
 
 
 
                            - 77 -
 
                        00152-01 97 07-2
 
 
                                                       Таблица 4
                Содержимое блока запросов канала
 
   -------------------------------------------------------------
                 I
       Поле      I                 Содержимое
                 I
   -------------------------------------------------------------
   CRB$L_WQFL*
                        Следующий  элемент  очереди   ожидания
                   канала данных контроллера. IOC$REQXCHANX  и
                   IOC$RELXCHAN вставляют в это поле и удаляют
                   из него адреса форк-блоков  драйвера.  Оче-
                   редь  ожидания   канала   содержит   адреса
                   форк-блоков драйвера, в которые записывает-
                   ся  контекст  приостановленных   драйверов,
                   ожидающих получения управления каналом дан-
                   ных  контроллера.  Если  во  время  запроса
                   драйвера на доступ к каналу этот канал нят,
                   IOC$REQXCHANX приостанавливает драйвер сох-
                   раненяя контекста драйвера в форк-блоке UCB
                   устройства и помещая  адреса  форк-блока  в
                   очередь  ожидания  канала.  Когда   драйвер
                   освобождает канал, так как этот канал боль-
                   ше не требуется для операции  ввода/вывода,
                   IOC$RELXCHAN удаляет из  очереди  форк-блок
                   драйвера, закрепляет канал для  драйвера  и
                   активизует  приостановленный   форк-процесс
                   драйвера.  Если  нет  драйверов,  ожидающих
                   данный канал, IOC$RELXCHAN сбрасывает  раз-
                   ряд занятости канала.
   CRB$L_WQBL*
                        Предыдущий  элемент  очереди  ожидания
                   канала   контроллера.    IOC$REQXCHANX    и
                   IOC$RELXCHAN читают и записывают это поле.
   CRB$W_SIZE*
                       Размер CRB. Процедура загрузки драйвера
                   заполняет это поле при создании CRB.
   CRB$B_TYPE*
                       Тип управляющего блока. Процедура  заг-
                   рузки драйвера записывает в это поле симво-
                   лическую константу DYN$C_CRB во время  соз-
                   дания CRB.
   CRB$B_TT_TYPE*
                       Тип контроллера (МПDA  или  МПD32)  для
                   терминалов.
   CRB$W_REFC*
                       Количество блоков управления  устройст-
                   вом. Процедура загрузки  драйвера  увеличи-
                   вает значение этого поля всякий раз,  когда
                   эта процедура создает UCB  для  устройства,
                   присоединенного к контроллеру.
   CRB$B_MASK*
                       Маска, описывающая состояние контролле-
                   ра. В настоящее время в этом поле определен
                   только  один   разряд   CRB$V-BSY(занятость
                   канала). IOC$REQXCHANX читает этот  разряд,
                   чтобы определить, свободен ли контроллер, и
                   устанавливает  этот  разряд  при  выделении
 
 
                            - 78 -
 
                        00152-01 97 07-2
 
 
                                             Продолжение табл. 4
   -------------------------------------------------------------
                 I
       Поле      I                 Содержимое
                 I
   -------------------------------------------------------------
                   драйверу   канала    данных    контроллера.
                   IOC$RELXCHAN  сбрасывает  разряд  занятости
                   при отсутствии драйверов, ожидяающих  полу-
                   чения канала.
   CRB$L_AUXSTRUC*
                       Адрес дополнительной структуры  данных,
                   которую драйвер устройства  использует  для
                   хранения специальной информации  контролле-
                   ра.  Драйвер  устройства,  который   желает
                   использовать это поле, может иметь подпрог-
                   рамму  инициализации  контроллера,  которая
                   выделяет  блок  нестраничной   динамической
                   памяти и устанавливает это поле для  указа-
                   ния на него. Использование этого поля заре-
                   зервировано системе.
   CRB$L_TIMELINK*
                       Следующий элемент очереди блоков запро-
                   са канала, ожидащих  периодического  возоб-
                   новления.  Это  поле  указывает   на   поле
                   CRB$L_TIMELINK  следующего  CRB  в  списке.
                   поле CRB$L_TIMELINK последнего CRB в списке
                   содержит   ноль.заголовком   этой   очереди
                   является IOC$GL_CRBTMOUT.
   CRB$L_DUETIME*
                         Время   в    секундах    относительно
                   EXE$GL_ABSTIM  в  течение  которого  должно
                   произойти следующее периодическое возобнов-
                   ление, связанные с данным  блоком  запросов
                   канала. Это значение вычисляется путем уве-
                   личения IPL  до  IPL$-POWER  ,  прибавления
                   требуемого количества секунд к  содержимому
                   EXE$GL_ABSTIM  и  сохранения  результата  в
                   этом поле.
   CRB$L_TOUTROUT*
                       Адрес подпрограммы, которая должна быть
                   вызвана при появлении периодического  взоб-
                   новления связанного с этим CRB. Подпрограм-
                   ма должна  вычислить  и  заново  установить
                   значение в CRB$L_DUETIME ,  если  требуется
                   запрос другого периодического возобновления
                   использование  этого  поля  зарезервировано
                   для системы.
   CRB$L_LINK*
                       Адрес вторичного CRB (резервировано для
                   устройств массбас).  Это  поле  заполняется
                   процедурой  загрузки  драйвера  и  читается
                   программами IOC$REQSCHANX и IOC$RELSCHAN .
   CRB$L_INTD*
                       Вектор передачи прерывания. В  пролого-
                   вая таблице каждого драйвера для устройств,
                   выдающих прерывания указывается адрес подп-
                   рограммы обслуживания прерывания. Процедура
                   загрузки драйвера записывает в это поле две
 
 
                            - 79 -
 
                        00152-01 97 07-2
 
 
                                             Продолжение табл. 4
   -------------------------------------------------------------
                 I
       Поле      I                 Содержимое
                 I
   -------------------------------------------------------------
                   инструкции:
 
                    PUSHR    #^M<R0,R1,R2,R3,R4,R5>
                    JSB      @#^адрес_прогр.обслуживание-прер.
 
                   Адаптеры общей шины прямым  вектором  пере-
                   дают управление CRB$L_INTD ,которая застав-
                   ляет процессор выполнить  инструкцию  PUSHR
                   для сохранения  в  стеке  регистров  R0-R5.
                   далее процессор  выполняет  инструкцию  JSB
                   для передачи управления драйверной подпрог-
                   рамме   обслуживания    прерываний.    Поле
                   CRB$L_INTD имеет длину девять длинных слов.
                   содержимое оставшейся  части  блока  описы-
                   вается на рис. 5 и в табл. 5.
   CRB$L_INTD2*
                       Второй вектор передачи  прерывания  для
                   устройств с несколькими векторами  прерыва-
                   ний. Если прологовая таблица драйвера  уст-
                   ройства указывает адрес второй подпрограммы
                   обслуживания прерываний, процедура загрузки
                   драйвера создает  достаточно  длинный  CRB,
                   чтобы уместить два поля INTDX длиной девять
                   длинных слов  каждое.  Первые  два  длинных
                   слова поля CRB$L_INTD2 содержат  инструкции
                   PUSHR и JSB на вторую  драйверную  подпрог-
                   рамму  обслуживания  прерываний   драйвера.
                   существует столько блоков векторов передачи
                   прерывания, сколько имеется  векторов  уст-
                   ройства.  Количество  векторов   устройства
                   определяется значением, указанным в  квали-
                   фикаторе /NUMVEC= для команды CONNECT прог-
                   раммы SYSGEN.
 
        Блоки векторов  передачи  прерывания,  содержащиеся  в
 
   CRB, хранят выполняемый код, точки входа драйверов и инфор-
 
   мацию адаптера общей шины. Поля блока CRB$L_INTD  иллюстри-
 
   руются на рис.5 и описываются в табл. 5.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
                            - 80 -
 
                        00152-01 97 07-2
 
 
               Содержимое CRB$L_INTD
 
   -----------------------------------------------------------
   :                                                         :
   ------------------ VEC$Q_DISPATCH*    ---------------------
   :                                                         :
   -----------------------------------------------------------
   :                  VEC$L_IDB*                             :
   -----------------------------------------------------------
   :                  VEC$L_INITIAL*                         :
   -----------------------------------------------------------
   :VEC$B_DADAPATH:VEC$B_NUMREG :   VEC$W_MAPREG             :
   -----------------------------------------------------------
   :                     VEC$L_ADP*                          :
   -----------------------------------------------------------
   :                     VEC$L_UNITINIT*                     :
   -----------------------------------------------------------
   :                     VEC$L_START                         :
   -----------------------------------------------------------
   :                     VEC$L_UNITDISC                      :
   -----------------------------------------------------------
 
 
                             Рис. 5
 
 
                                                       Таблица 5
                      Поля блока CRB$L_INTD
 
   -------------------------------------------------------------
                  I
      Поле        I                 Содержимое
                  I
   -------------------------------------------------------------
   VEC$Q_DISPATCH*
                       Содержит две инструкции диспетчеризации
                   прерываний, описанные в поле  CRB$L_INTD  .
                   это поле  заполняется  процедурой  загрузки
                   драйвера.
   VEC$L_IDB*
                       Адрес блока диспетчиризации  прерываний
                   для контролера. Процедура загрузки драйвера
                   создает IDB для каждого CRB и  загружает  в
                   это  поле  адрес  IDB.  Драйверы  устройств
                   используют адрес  IDB  для  получения  вир-
                   туальных адресов регистров устройства. Ког-
                   да  подпрограмма  обслуживания   прерываний
                   драйвера получает управление, вершина стека
                   содержит указатель на это поле.
   VEC$L_INITIAL*
                       Адрес подпрограммы инициализации  конт-
                   роллера. Если контроллер устройства требует
                   инициализации во время загрузки драйвера  и
                   при  восстановлении  после  сбоя   питания,
                   драйвер указывает значение для этого поля в
                   прологовой таблице драйвера. Процедура заг-
                   рузки драйвера  вызывает  эту  подпрограмму
                   каждый раз, когда загружает драйвер. Проце-
                   дура МОС ВП для восстанавления  после  сбоя
 
 
                            - 81 -
 
                        00152-01 97 07-2
 
 
                                             Продолжение табл. 5
   -------------------------------------------------------------
                  I
      Поле        I                 Содержимое
                  I
   -------------------------------------------------------------
                   питания также вызывает эту подпрограмму для
                   инициализации контроллера после сбоя  пита-
                   ния.
   VEC$W_MAPREG
                       Данное поле содержит два поля:
                   VEC$V_MAPREG - номер первого  регистра ото-
                   бражения  адаптера общей шины, назначенного
                   драйверу, который   владеет каналом даннных
                   контроллера. IOC$REQMAPREG    заполняет это
                   поле, когда  программа  выделяет   регистры
                   отображения  форк-процессу драйвера для пе-
                   редачи по  прямому  доступу.  IOC$RELMAPREG
                   читает это поля для  освобождение регистров
                   отображения. Драйверы устройств читают  это
                   поле при вычислении стартового адреса пере-
                   дачи по общей шины;
                   VEC$V_MADLOCK - если этот бит установлен,то
                   набор   регистров     отображения  постояно
                   выделен.
   VEC$B_NUMREG
                       Количество регистров отображения  адап-
                   тера    общей     шины    выделенных драй-
                   веру.    Программа IOC$REQMAPREG  заполняет
                   это поле, когда выделяет регистры отображе-
                   ния.  IOC$RELMAPREG  читает  это  поле  для
                   освобождения регистров отображения.
   VEC$B_DATAPATH
                       Спецификатор пути данных. Базы  состав-
                   ляющие  это  поле,  используются  следующим
                   образом:
                   0 ---> 4
                       Количество путей данных, используемых
                       в предаче по прямому доступу.
                       IOC$REQDATAP  устанавливает это  поле,
                       когда буферизованный путь данных расп-
                       ределяется, и очищает это поле,  когда
                       путь данных освобождается.
                       Подпрограмма IOC$LOADUBAMAP   копирует
                       содержимое этого поля в регистры отоб-
                       ражения адаптера (UNIBUS). Эти разряды
                       служат также подразумеваемыми входными
                       данными для подпрограммы IOC$PURGDATAP.
                   VEC$V_LWAE
                       Бит    разрешения доступа  к  длинному
                       слову (LWAE). Драйверы   установливают
                       этот разряд, когда они желают  ограни-
                       чить путь данных к режиму произвольного
                       доступа с выравниванием   по  длинному
                       слову. Подпрограмма IOC$LOADUBAMAP
                       копирует значение этого поля в регист-
                       ры отображения адаптера общей шины.
                    6
                       Резерв системы.
 
 
                            - 82 -
 
                        00152-01 97 07-2
 
 
                                             Продолжение табл. 5
   -------------------------------------------------------------
                  I
      Поле        I                 Содержимое
                  I
   -------------------------------------------------------------
                   VEC$V_PATHLOCK
                       Индикатор распределения буферизованного
                       пути данных. Драйверы    устанавливают
                       этот бит для    указания, что буферизов
                       путь данных является постоянно
                       распределенным.
   VEC$L_ADP*
                       Адрес блока управления адаптером  общей
                   шины (ADP). Команда CONNECT из SYSGEN долж-
                   на указать  номер  позиции  адаптера  общей
                   шины, используемый контроллером.  Процедура
                   загрузки драйвера записывает адрес ADP  для
                   указанного   UBA    в    поле    VEC$L_ADP.
                   IOC$REQMAPREG  и  IOC$RELMAPREG  читают   и
                   записывают поля в ADP для  распределения  и
                   освобождения регистров отображения адаптера
                   общей шины.
   VEC$L_UNITINIT*
                       Адрес подпрограммы  инициализации  уст-
                   ройства если устройству требуется инициали-
                   зация во время  зяагрузки  драйвера  и  при
                   восстановлении после сбоя питания,  драйвер
                   указывает значение для этого поля в  проло-
                   говой таблице драйвера. Процедура  загрузки
                   драйвера вызывает эту подпрограмму для каж-
                   дого устройства каждый раз, когда загружает
                   драйвер. Процедура МОС ВП для  восстановле-
                   ния после сбоя питания также  вызывает  эту
                   подпрограмму  для  инициализации  устройств
                   после сбоя питания.
 
 
        1.5. Блок данных устройства (DDB)
 
 
 
        Блок данных устройства является блоком переменной дли-
 
   ны, который определяет общее имя  устройства/контроллера  и
 
   имя драйвера для набора устройств, присоединенных к  одному
 
   контроллеру. Процедура загрузки драйвера создает блок  дан-
 
   ных устройства для каждого контроллера во время  автоконфи-
 
   гурации при старте системы и динамически  создает  дополни-
 
   тельные блоки данных устройств для  новых  контроллеров  по
 
   мере того, как они добавляются в систему с помощью SYSGEN (
 
   команда CONNECT). Процедура загрузки  драйвера  инициализи-
 
 
                            - 83 -
 
                        00152-01 97 07-2
 
 
   рует все поля в блоке данных устройства. Все  блоки  данных
 
   устройств в  базе  данных  ввода/вывода  связаны  вместе  в
 
   односвязный список. Содержимое IOC$GL_DEVLIST указывает  на
 
   первый вход в этом списке.
 
 
        Блок данных устройства используют программы операцион-
 
   ной системы и драйверы устройств.
 
 
        Поля блока данных устройства иллюстрируются на рис.  6
 
   и описываются в табл. 6.
 
 
                Блок данных устройства
 
   ---------------------------------------------------------
   :                  DDB$L_LINK*                          :
   ---------------------------------------------------------
   :                  DDB$L_UCB*                           :
   ---------------------------------------------------------
   : не используется:DDB$B-TYPE*:  DDB$W-SIZE*             :
   ---------------------------------------------------------
   :                  DDB$L_DDT                            :
   ---------------------------------------------------------
   :                  DDB$L_ACPD                           :
   ---------------------------------------------------------
   :                                                       :
   /           DDB$T_NAME ( 16 байтов)                     /
   /                                                       /
   ---------------------------------------------------------
   :                                                       :
   /           DDB$T_DRVNAME ( 16 байтов)                  /
   /                                                       /
   ---------------------------------------------------------
   :                  DDB$L_SB$                            :
   ---------------------------------------------------------
   :                  DDB$L_CONLINK$                       :
   ---------------------------------------------------------
   :                  DDB$L_ALLOCLS$                       :
   ---------------------------------------------------------
   :                  DDB$L_2P_UCB$                        :
   ---------------------------------------------------------
 
 
                             Рис. 6
 
 
 
 
 
 
 
 
 
 
                            - 84 -
 
                        00152-01 97 07-2
 
 
                                                       Таблица 6
               Содержимое блока данных устройства
 
   -------------------------------------------------------------
                 I
        Поле     I               Содержимое
                 I
   -------------------------------------------------------------
   DDB$L_LINK*
                        Адрес следующего DDB. Ноль  показывает,
                    что это последний DDB в списке DDB.
   DDB$L_UCB*
                        Адрес блока управления устройством  для
                    первого вого устройства,  присоединеного  к
                    контролеру
   DDB$W_SIZE*
                    Размер DDB.
   DDB$B_TYPE*
                        Тип управляющего блока. Процедура  заг-
                    рузки драйвера записывает в это поле  конс-
                    танту DYN$C_DDB, при создании DDB.
   DDB$L_DDT
                        Адрес таблицы диспетчеризации драйвера.
                    МОС ВП может передавать управление драйверу
                    устройства только через адреса, перечислен-
                    ные в DDB, CRB и форк-блоке UCB. Этого поля
                    должно быть определено в прологовой таблице
                    каждого драйвера устройства.
   DDB$L_ACPD
                        Имя ACP по умолчанию для данного  конт-
                    ролера. ACP, которые управляют  доступом  к
                    устройствам с файловой структурой,  исполь-
                    зуют    старший    байт     этого     поля,
                    DDB$B_ACPCLASS, для  указания  класса  уст-
                    ройства с файловой структурой.  Если  пара-
                    метр ACP_MULT в SYSGEN установлен в  едини-
                    цу, процедура  инициализации  создает  уни-
                    кальный ACP для каждого класса устройств  с
                    файловой структурой.  Драйверы  инициализи-
                    руют DDB$B_ACPCLASS с помощью  макрокоманды
                    DPT_STORE. Значениями DB$B_ACPCLASS явля-
                    ются:
                    DDB$K_CART - пакет кассетных дисков;
                    DDB$K_PACK - пакет стандартных дисков;
                    DDB$K-SLOW - гибкий диск;
                    DDB$K_TAPE - магнитная лента, которая
                                 моделирует устройство с файло-
                                 вой структурой.
   DDB$T_NAME*
                        Общее имя устройств,  присоединенных  к
                    контроллеру первый байт этого поля содержит
                    количество символов в общем  имени.  Остав-
                    шаяся часть поля состоит из  строки  длиной
                    до 15 символов и дополненная справа номером
                    устройства идентифицирующей  устройства  на
                    данном контроллере.
   DDB$T_DRVNAME*
                        Имя  драйвера  устройства  для  данного
                    контроллера. Первый байт этого поля  содер-
                                   
 
                            - 85 -
 
                        00152-01 97 07-2
 
 
                                             Продолжение табл. 6
   -------------------------------------------------------------
                 I
        Поле     I               Содержимое
                 I
   -------------------------------------------------------------
                    жит количество символов в  имени  драйвера.
                    оставшаяся часть поля содержит строку  дли-
                    ной до 15 символов,  взятую  из  прологовой
                    таблицы драйвера.
   DDB$L_SB*
                         Адрес системного блока.
   DDB$L_CONLINK$
                         Следующий DDB в связной подцепочке.
   DDB$L_ALLOCLS$
                         Класс распределение устройства.
   DDB$L_2P_UCB$
                         Адреспервого UCB  на  вторичном  пути.
                    другое имя этого поля есть DDB$L_DP_UCB.
 
 
        1.6. Диспетчерская таблица драйвера (DDT)
 
 
 
        Каждый драйвер устройства содержит диспетчерскую  таб-
 
   лицу драйвера. Таблица перечисляет точки входа в  драйвере,
 
   по которым вызываются различные подпрограммы МОС ВП. Приме-
 
   ром является точка входа для подпрограммы драйвера, которая
 
   запускает операции ввода/вывода на устройстве.
 
 
        Драйвер  устройства  создает  таблицу  диспетчеризации
 
   драйвера с помощью макрокоманды МОС ВП DDTAB. Поля  диспет-
 
   черская таблицы драйвера иллюстрируются на рис. 7 и  описы-
 
   ваются в табл. 7.
 
 
 
 
                            - 86 -
 
                        00152-01 97 07-2
 
 
                Диспетчерская таблица драйвера
 
   -----------------------------------------------------------
   :                DDT$L_START                              :
   -----------------------------------------------------------
   :                DDT$L_UNSOLINT                           :
   -----------------------------------------------------------
   :                DDT$L_FDT                                :
   -----------------------------------------------------------
   :                DDT$L_CANCEL                             :
   -----------------------------------------------------------
   :                DDT$L_REGDUMP                            :
   -----------------------------------------------------------
   :     DDT$W_ERRORBUF       :       DDT$W_DIAGBUF          :
   -----------------------------------------------------------
   :                DDT$L_UNITINIT                           :
   -----------------------------------------------------------
   :                DDT$L_ALTSTART                           :
   -----------------------------------------------------------
   :                DDT$L_MNTVER                             :
   -----------------------------------------------------------
   :                DDT$L-CLONEDUCB                          :
   -----------------------------------------------------------
   : не используется          :        DDT$W_FDTSIZE*        :
   -----------------------------------------------------------
   :                DDT$L_MNTV_SSSC                          :
   -----------------------------------------------------------
   :                DDT$L_MNTV_FOR                           :
   -----------------------------------------------------------
   :                DDT$L_MNTV_SOD                           :
   -----------------------------------------------------------
 
 
                             Рис. 7
 
 
                                                       Таблица 7
            Содержимое диспетчерской таблицы драйвера
 
   -------------------------------------------------------------
                  I
        Поле      I                Содержимое
                  I
   -------------------------------------------------------------
   DDT$L_START
                        Точка входа  в  подпрограмму  драйвера,
                    стартующую ввод/вывод. Каждый драйвер  дол-
                    жен указывать это поле со  значением  аргу-
                    мента START  в  макрокоманды  DDTAB.  Когда
                    устройство свободно, и запрос вывода/вывода
                    ожидает это устройство, IOC$INITIAFE  пере-
                    дает управление по адресу, содержащемуся  в
                    этом поле.
   DDT$L_UNSOLINT
                        Резервируется для последующий  разрабо-
                    ток.
   DDT$L_FDT
                          Адрес    таблицы    выбора    функций
                    драйвера.каждый драйвер  должен  определить
 
 
                            - 87 -
 
                        00152-01 97 07-2
 
 
                                             Продолжение табл. 7
   -------------------------------------------------------------
                  I
        Поле      I                Содержимое
                  I
   -------------------------------------------------------------
                    это  поле  с  помощью  значения   аргумента
                    FUNCTB  в   макрокоманде   DDTAB.   EXE$QIO
                    сылается на FDT для проверки кодов  функций
                    ввода/вывода,  определяет,  какие   функций
                    являются буферизованными и  вызовает  подп-
                    рограммы FDT, связанные с кодами функций.
   DDT$L_CANCEL
                        Точка входа в подпрограмму драйвера для
                    отметка  ввода/вывода.  Драйвер  определяет
                    это поле с помощью аргумента CANCEL в  мак-
                    рокоманде DDTAB. Некоторые устройства  тре-
                    буют  специальной  завершающей   обработки,
                    когда процесс или подпрограмма МОС ВП  сни-
                    мает запрос  ввода/  вывода  до  того,  KAK
                    завершается операция ввода/вывода или когда
                    снимается  назначение  последнего   канала.
                    программы системного обслуживания $DASSGN ,
                    $DALLOC   и   $CANCEL    снимают    запросы
                    ввода/вывода.
   DDT$L_REGDUMP
                        Точка входа в  драйверную  подпрограмму
                    дампа  регистров.  Драйвер  определяет  это
                    поле с помощью  значения  аргумента  REGDMP
                    макрокоманды        DDTAB.        Программы
                    IOC$DIAGBUFILL, ERL$DEVICERR и ERL$DEVICTMO
                    обращаются к адресу, содержащемуся  в  этом
                    поле, чтобы переписать содержимое регистров
                    устройствы в диагностический  буфер  или  в
                    буфер регистрации ошибок.
   DDT$W_DIAGBUF
                        Размер диагностического буфера. Драйвер
                    определяет  это  поле  с  помощью  значения
                    аргумента DIAGBF в макрокоманде DDTAB.  Это
                    значение содержит размер в байтах  диагнос-
                    тического буфера  для  данного  устройства.
                    когда  EXE$QIO  выполняет   предварительную
                    обработку запроса  ввода/вывода,  программа
                    выделяет системный буфер  размером,  взятым
                    из этого поля, если  пользовательский  про-
                    цесс имеет привилегии для диагностики, ука-
                    зывает  диагностический  буфер  в   запросе
                    ввода/вывода, и это  поле  в  DDT  содержит
                    ненулевое значение.  IOC$DIAGBUFILL  запол-
                    няет  буфер   после   завершения   операции
                    ввода-вывода.
   DDT$W_ERRORBUF
                        Размер буфера регистрации ошибок. Драй-
                    вер определяет это поле с помощью  значения
                    аргумента ERLGBF в  макрокоманде  DDTAB.это
                    значение является размер  в  байтах  буфера
                    регистрации ошибок для данного  устройства.
                    если регистрация ошибок разрешена и во вре-
                    мя операции ввода/вывода возникает  ошибка,
 
 
                            - 88 -
 
                        00152-01 97 07-2
 
 
                                             Продолжение табл. 7
   -------------------------------------------------------------
                  I
        Поле      I                Содержимое
                  I
   -------------------------------------------------------------
                    драйвер    вызывает    ERL$DEVICERR     или
                    ERL$DEVICTMO для выделения и записи  данных
                    об ошибке  в  буфер  собщений  об  ошибках.
                    IOC$INITIATE и IOC$REQCOM записывают значе-
                    ния в  буфер  сообщений  об  ошибках,  если
                    произошла ошибка.
   DDT$L_UNITINIT
                        Адрес подпрограммы  инициализации  уст-
                    ройства, если таковая существует.
   DDT$L_ALTSTART
                          Адрес   альтернативной   подпрограммы
                    запуска     ввода/вывода.      Подпрограмма
                    EXE$ALTQUEPKT  по  этому  адресу  иницирует
                    альтернативную      программу       запуска
                    ввода/вывода.
   DDT$L_MNTVER
                        Адрес подпрограммы IOC$MNTVER, вызывае-
                    мой в начале и в  конце  операции  проверки
                    монтирования. Аргумент MNTVER  макрокоманды
                    DPTAB определяет эту программу  по  умолча-
                    нию.  Использование  аргумента  MNTVER  для
                    вызова  любой  подпрограммы,  отличной   от
                    IOC$MNTVER зарезервировано системе.
   DDT$L_CLONEDUCB
                        Адрес программы вызываемой при клониро-
                    ваных UCB.
   DDT$W_FDTSIZE*
                         Количество  байтов  в  таблице  выбора
                    функций.  Подпрограмма  загрузки   драйвера
                    использует это поле для перемещения адресов
                    FDT в системные виртуальные адреса.
   DDT$L_MNTV_SSSC
                        Адрес  программы  вызываемой  во  время
                    проверки монтирования для  изменения  уста-
                    новленого состояния экранирования.
   DDT$L_MNTV_FOR
                        Адрес программой вызываемой при  выпол-
                    нении  проверки  монтирования  чужого  уст-
                    ройства.
   DDT$L_MNTV_SOD
                        Адрес программы вызываемой при выполне-
                    нии проверки монтирования для  устройств  с
                    последовательным доступам.
 
 
 
                            - 89 -
 
                        00152-01 97 07-2
 
 
        1.7. Прологовая таблица драйвера (DPT)
 
 
 
        При загрузке драйвера устройства и его базы  данных  в
 
   виртуальную  память  процедура  загрузки  драйвера  находит
 
   базовое описание драйвера и  его  устройства  в  прологовой
 
   таблице драйвера. В этой таблице записаны длина,  имя,  тип
 
   адаптера, спецификации загрузки  и  разгрузки  для  данного
 
   драйвера.
 
 
        Драйвер устройства создает прологовую таблицу драйвера
 
   с помощью макрокоманд МОС ВП DPTAB и DPT-STORE .  Поля  DPT
 
   иллюстрируются на рис. 8 и описываются в табл. 8.
 
 
             Прологовая таблица драйвера
 
   ---------------------------------------------------------
   :                DPT$L_FLINK*                           :
   ---------------------------------------------------------
   :                DPT$L_BLINK*                           :
   ---------------------------------------------------------
   :DPT$B_REFC*  :DPT$B_TYPE* :     DPT$W_SIZE             :
   ---------------------------------------------------------
   :DPT$W_UCBSIZE             : DPT$B_FLAGS :DPT$B_ADPTYPE :
   ---------------------------------------------------------
   :   DPT$W_REINITTAB        :     DPT$W_INITTAB          :
   ---------------------------------------------------------
   :   DPT$W_MAXUNITS         :     DPT$W_UNLOAD           :
   ---------------------------------------------------------
   :   DPT$W_DEFUNITS         :     DPT$W_VERSION*         :
   ---------------------------------------------------------
   :   DPT$W_VECTOR           :     DPT$W_DELIVER          :
   ---------------------------------------------------------
   :                                                       :
   /                 DPT$T_NAME (12 байтов)                /
   /                                                       /
   ---------------------------------------------------------
   :                 DPT$Q_LINKTIME*                       :
   ---------------------------------------------------------
   :                 DPT$L_ECOLEVEL*                       :
   ---------------------------------------------------------
 
 
                             Рис. 8
 
 
 
 
 
 
 
                            - 90 -
 
                        00152-01 97 07-2
 
 
                                                       Таблица 8
             Содержимое прологовой таблицы драйвера
 
   -------------------------------------------------------------
                 I
       Поле      I             Содержимое
                 I
   -------------------------------------------------------------
   DPT$L_FLINK*
                        Связь со следующе DPT. Это поле  запол-
                    няется процедурой загрузки драйвера. Проце-
                    дура связывает все прологовые таблицы драй-
                    веров в системе в двухсвязный список.
   DPT$L_BLINK*
                        Обратная связь на предыдущую  DPT.  Это
                    поле заполняется процедурой загрузки  драй-
                    вера.
   DPT$W_SIZE
                        Размер в  байтах  драйвера  устройства.
                    макрокоманде DPTAB заполняет это поле путем
                    вычитания  адреса  начала  DPT  из  адреса,
                    определяемого аргументом END в макрокоманде
                    DPTAB. Процедура загрузки драйвера  исполь-
                    зует это значение  для  определения  прост-
                    ранства, требуемого в нестраничной  систем-
                    ной памяти для загрузки драйвера.
   DPT$B_TYPE*
                        Тип  управляющего  блока.  Макрокоманде
                    DPTAB всегда записывает в это поле констан-
                    ту DYN$C_DPT .
   DPT$B_REFC*
                             Количество      блоков      данных
                    устройства,которые ссылаются на этот  драй-
                    вер. Процедура загрузки  драйвера  увеличи-
                    вает значение этого поля каждый раз,  когда
                    процедура создает другой DDB, который  ука-
                    зывает на DDТ драйвера.
   DPT$B_ADPTYPE
                        Тип адаптера, используемого устройства-
                    ми,  управляемыми  этим  драйвером.  Каждый
                    драйвер должен  указать  строку  "UBA"  как
                    значение аргумента ADAPTER  в  макрокоманде
                    DPTAB. Макрокомана записывает  в  это  поле
                    значение AT$_UBA.
   DPT$B_FLAGS
                         Флаги  загрузчика  драйвера.   Драйвер
                    может указать любое подмножество  флагов  в
                    качестве значения аргумента FLAGS в  макро-
                    команде DPTAB. Процедура загрузки  драйвера
                    модифицирует алгоритм загрузки и перегрузки
                    в зависимости  от  установки  этих  флагов.
                    флаги, определяемые в  поле  флагов,  имеют
                    следующий вид:
                    DPT$M_SUBCHTRL   устройство является   под-
                                     контроллером;
                    DPT$M_SVP        устройство требует постоя-
                                     нной системной страницы
                                     выделяется при загрузке
                                     драйвера;
 
 
                            - 91 -
 
                        00152-01 97 07-2
 
 
                                             Продолжение табл. 8
   -------------------------------------------------------------
                 I
       Поле      I             Содержимое
                 I
   -------------------------------------------------------------
                    DPT$M_NOUNLOAD   драйвер не может быть  пе-
                                     резагружен;
                    DPT$V_SCS        SCS код должен быть загру-
                                     жен с этим драйвером.
   DPT$W_UCBSIZE
                        Размер в байтах блока  управления  уст-
                    ройством, создаваемых для устройств, управ-
                    ляемых этим драйвером. Каждый драйвер  дол-
                    жен указывать значение  для  этого  поля  в
                    виде значения аргумента UCBSIZE в  макроко-
                    манде DPTAB.  Процедура  загрузки  драйвера
                    выделяет блоки нестраничной системной памя-
                    ти указанного размера при создании UCB  для
                    устройств, связанных с этим драйвером.
   DPT$W_INITTAB
                         Смещение  для  таблицы   инициализации
                    драйвера.  Каждый  драйвер  должен  указать
                    список полей управляющего блока и значения,
                    которые должны быть записаны в эти  поля  в
                    тот момент, когда процедура загрузки  драй-
                    вера создает управляющие блоки. Для опреде-
                    ления этих  полей  и  их  значений  драйвер
                    использует макрокоманду  DPT_STORE.  Каждый
                    драйвер должен определить следующие поля:
                    UCB$B_FIPL     уровень приоритета форк-пре-
                                   рывания ;
                    UCB$B_DIPL     уровень приоритета  прерыва-
                                   ний устройства.
                    К другим обычно инициализируемым полям  от-
                    носятся:
                    UCB$L_DEVCHAR   характеристики устройства ;
                    UCB$B_DEVCLASS  класс устройства;
                    UCB$B_DEVTYPE   тип устройства;
                    UCB$W_DEVBUFSIZ размер буфера по умолчанию;
                    UCB$L_DEVDEPEND параметры, зависимые  от
                                    устройства;
   DPT$W_REINITTAB
                        Смещение  для  таблицы  реинициализации
                    драйвера. Каждый драйвер должен  определить
                    список полей управляющего блока и значения,
                    которые должны быть записаны в эти  поля  в
                    тот момент, когда процедура загрузки  драй-
                    вера создает управляющие блоки  или  загру-
                    жает драйвер. Драйвер вызывает макрокоманду
                    DPT_STORE для определения этих полей  и  их
                    значений. Каждый драйвер должен  определить
                    следующее поле:
                    DDB$L_DDT        диспетчерская      таблица
                                     драйвера
                    К другим обычно инициализируемым полям  от-
                    носятся:
                    CRB$L_INTD+4     подпрограмма обслуживания
                                     прерываний
 
 
                            - 92 -
 
                        00152-01 97 07-2
 
 
                                             Продолжение табл. 8
   -------------------------------------------------------------
                 I
       Поле      I             Содержимое
                 I
   -------------------------------------------------------------
                    CRB$L_INTD2+4    вторая подпрограмма обслу-
                                     живания прерываний
                    VEC$L_INITIAL    подпрограмма инициализации
                                     контроллера
                    VEC$L_UNITINIT   подпрограмма инициализации
                                     устройства
   DPT$W_UNLOAD
                        Относительный адрес подпрограммы  драй-
                    вера, которая должна вызываться  при  пере-
                    загрузке драйвера. Драйвер  определяет  это
                    поле с помощью значения аргумента UNLOAD  в
                    макрокоманде DPTAB.  Если  драйвер  требует
                    специальных действий по завершению обработ-
                    ки  ввода/вывода  таких,  как  освобождение
                    буфера или регистра отображения, перед тем,
                    как драйвер  может  быть  перезагружен,  то
                    драйвер должен определить это поле.  Проце-
                    дура загрузки драйвера вызывает подпрограм-
                    му разгрузки драйвера перед  инициализацией
                    всех устройств, связанных с этим драйвером.
   DPT$W_MAXUNITS
                        Максимальное  количество  устройств  на
                    контроллере,  который   поддерживает   этот
                    драйвер. Это значение определяется аргумен-
                    том MAXUNITS в макрокоманде DPTAB. Если это
                    значение не определено, по умолчанию подра-
                    зумевается 8 устройств.
   DPT$W_VERSION*
                        Номер версии, которая определяет формат
                    прологовой таблицы  драйвера.  Макрокоманда
                    DPTAB автоматически  вставляет  значение  в
                    это  поле.  SYSGEN  сравнивает  свою  копию
                    номера версии со значением, хранимым в этом
                    поле.  Если  значения   не   соответствуют,
                    выдается  ошибка.  Для  исправления  ошибки
                    драйвер необходимо заново оттранслировать и
                    скомпоновать.
   DPT$W_DEFUNITS
                        Количество блоков управления  устройст-
                    вом, которые будет автоматически  создавать
                    средство автоконфигурации. Драйверы опреде-
                    ляют это число в аргументе DEFUNITS  макро-
                    команды DPTAB. Если  драйвер  также  выдает
                    значение в DPT$W_DELIVER, то это поле опре-
                    деляет количество вызовов программы  выдачи
                    устройства средствами автоконфигурации.
   DPT$W_DELIVER
                        Относительный адрес драйверной подпрог-
                    раммы выдачи устройства,  которую  средство
                    автоконфигурации   вызывает   столько   раз
                    сколько блоков управления устройством опре-
                    делено  в  DPT$W_DEFUNITS.  Драйвер  задает
                    этот  относительный   адрес   в   аргументе
 
 
                            - 93 -
 
                        00152-01 97 07-2
 
 
                                             Продолжение табл. 8
   -------------------------------------------------------------
                 I
       Поле      I             Содержимое
                 I
   -------------------------------------------------------------
                    DELIVER макрокоманды DPTAB.
   DPT$W_VECTOR
                        Относительный адрес специального векто-
                    ра  драйвера.  Использование   этого   поля
                    резервируется системе.
   DPT$T_NAME
                        Имя  драйвера  устройства.  Поле  имеет
                    длину 12 байтов. Один байт  содержит  длину
                    строки имени; строка имени может иметь дли-
                    ну до 11 символов. Драйверы определяют  это
                    поле в виде значения аргумента NAME в  мак-
                    рокоманде DPTAB. Процедура загрузки драйве-
                    ра сравнивает имя драйвера, который  должен
                    быть загружен, со значением этого  поля  во
                    всех  DPT,  уже  загруженных  в   системную
                    память, чтобы убедиться, что она  загружает
                    только одну копию драйвера.
   DPT$Q_LINKTIME$
                        Время  и  дата  линкирования  драйвера;
                    берется из заголовка образа.
   DPT$L_ECOLEVEL$
                        Уровень есо драйвера устройства; берет-
                    ся из заголовка образа.
 
 
        1.8. Блок диспетчеризации прерываний (IDB)
 
 
 
        Блок диспетчеризации прерываний содержит характеристи-
 
   ки контроллера. Процедура загрузки драйвера создает и  ини-
 
   циализирует этот блок,  во  время  создание  блока  запроса
 
   канала. Блок диспетчеризации прерываний указывает на  физи-
 
   ческий контроллер с помощью запоминания виртуального адреса
 
   регистра команд и состояния. Этот регистр является  косвен-
 
   ным указателем на все регистры устройства.
 
 
        Поля блока диспетчеризации  прерываний  иллюстрируются
 
   на рис. 9 и детализируются в табл. 9.
 
 
 
 
 
 
 
 
                            - 94 -
 
                        00152-01 97 07-2
 
 
            Блок диспетчеризации прерываний
 
   ---------------------------------------------------------
   :                       IDB$L_CSR*                      :
   ---------------------------------------------------------
   :                       IDB$L_OWNER                     :
   ---------------------------------------------------------
   :IDB$B_VECTOR* :IDB$B_TYPE*       : IDB$W_SIZE*         :
   ---------------------------------------------------------
   :IDB$B_COMBO_CSR*:IDB$B_TT_ENABLE*: IDB$W_UNITS*        :
   ---------------------------------------------------------
   :    не используется       :не использ.:IDB$B_COMBO_VEC*:
   ---------------------------------------------------------
   :                     IDB$L_ADP*                        :
   ---------------------------------------------------------
   /                                                       /
   /                    IDB$L_UCBLST*(32 байта)            /
   ---------------------------------------------------------
 
 
                             Рис. 9
 
 
                                                       Таблица 9
           Содержимое блока диспетчеризации прерываний
 
   -------------------------------------------------------------
                 I
       Поле      I              Содержимое
                 I
   -------------------------------------------------------------
   IDB$L_CSR*
                         Адрес  регистра  команд  и   состояния
                    (CSR). SYSGEN команда CONNECT  должна  ука-
                    зать адрес регистра команд и состояния уст-
                    ройства. Процедура загрузки драйвера  запи-
                    сывает в поле IDB$L_CSR виртуальный эквива-
                    лент этого адреса. Драйверы устройств уста-
                    навливают и сбрасывают разряды в  регистрах
                    устройств, обращаясь ко всем регистрам уст-
                    ройства по фиксированным  ванным  смещениям
                    от адреса CSR.
   IDB$L_OWNER
                        Адрес блока управления устройством  для
                    устройства, которое владеет каналом  данных
                    контроллера. IOC$REQXCHANX записывает адрес
                    UCB в это поле, когда подпрограмма выделяет
                    драйверу    канал    данных    контроллера.
                    IOC$RELXCHAN подтверждает, что форк-процесс
                    драйвера данного освобождает канал, сравни-
                    вая UCB драйвера с  UCB,  хранимым  в  поле
                    IDB$L_OWNER.  Если  адреса  UCB  совпадают,
                    IOC$RELXCHAN  выделяет   канал   ожидающему
                    драйверу записывая в это поле адреса нового
                    UCB. Если нет форк-процессов драйвера, ожи-
                    дающих этого канала,  IOC$RELXCHAN  очищает
                    поле. Если контроллер является контроллером
                    с  единственным  устройством,  подпрограмма
                    инициализации  контроллера  или  устройства
 
 
                            - 95 -
 
                        00152-01 97 07-2
 
 
                                             Продолжение табл. 9
   -------------------------------------------------------------
                 I
       Поле      I              Содержимое
                 I
   -------------------------------------------------------------
                    должна  записать  в  это  поле  адрес   UCB
                    единственного устройства.
   IDB$W_SIZE*
                        Размер IDB. Процедура загрузки драйвера
                    записывает    в    это    поле    константу
                    IDB$K_LENGTH когда создает IDB.
   IDB$B_TYPE*
                        Тип управляющего блока. Процедура  заг-
                    рузки драйвера записывает в это поле симво-
                    лическую константу DYN$C_IDB , когда проце-
                    дура создает IDB.
   IDB$B_VECTOR*
                        Номер  вектора  прерывания  устройства,
                    сдвинутый вправо  на  два  разряда.  SYSGEN
                    заполняет это поле, используя  базу  данных
                    автоконфигурации, либо значение,  указанное
                    в квалификаторе /VECTOR команды  CONNECT  .
                    драйверы для устройств, которые  определяют
                    адрес вектора прерывания через регистр уст-
                    ройства, должны использовать это  поле  для
                    загрузки этого регистра во время  инициали-
                    зации устройства или реинициализации  после
                    сбоя питания.
   IDB$W_UNITS*
                        Максимальное количество устройств, при-
                    соединенных  к  контроллеру.   Максимальное
                    количество устройств указывается в пролого-
                    вой таблице драйвера и может быть  изменено
                    во внимание во время загрузки драйвера.
   IDB$B_TT_ENABLE*
                        Резервирован для использования драйвера
                    терминала.
   IDB$B_COMBO_CSR*
                             Имя      этого      поля      есть
                    IDB$B_COMBO_CSR_OFFSET. Оно  сокращено  для
                    того чтобы можно было изобразить это поле в
                    этом документе.  Это  поле  содержит  адрес
                    начала регистров CSR много контрольных уст-
                    ройств (таких как MPD32.)
   IDB$B_COMBO_VEC*
                          Полное   имя    этого    поля    есть
                    IDB$B_COMBO_VECTOR_OFFSET и сокращенное для
                    того чтобы можно было изобразить это поле в
                    этом  документе.это  поле  содержит   адрес
                    начала векторов прерывания  для  многоконт-
                    рольных устройств.
   IDB$L_ADP*
                        Адрес блока управления адаптером  общей
                    шины SYSGEN команда CONNECT должна  указать
                    номер позиции адаптера общей шины,  исполь-
                    зуемого  устройством.  Процедура   загрузки
                    драйвера записывает адрес ADP для указанно-
                    го адаптера общей шины в поле IDP$L_ADP .
 
 
                            - 96 -
 
                        00152-01 97 07-2
 
 
                                             Продолжение табл. 9
   -------------------------------------------------------------
                 I
       Поле      I              Содержимое
                 I
   -------------------------------------------------------------
   IDB$L_UCBLST*
                        Список адресов UCB. Размером этого поля
                    является максимальное количество устройств,
                    поддерживаемых контроллером, как определено
                    в прологовой  таблице  драйвера.  Максимум,
                    указанный в DPT, может быть изменен во вре-
                    мя загрузки  драйвера.  Процедура  загрузки
                    драйвера записывает адрес UCB  в  это  поле
                    каждый  раз,  когда  подпрограмма   создает
                    новый UCB, связанный с данным контроллером.
 
 
        1.9. Пакет запросов ввода/вывода (IRP)
 
 
 
        Когда пользовательский процесс ставит в очередь запрос
 
   ввода/вывода, используя  системные  программы  обслуживания
 
   очереди запросов ввода/вывода и обслуживания очереди запро-
 
   сов ввода/вывода с ожиданием, EXE$QIO создет пакет  запроса
 
   ввода/вывода. Этот пакет содержит описание запроса и  полу-
 
   чает состояние в процессе обработки ввода/вывода.
 
 
        Поле пакета  запроса  ввода/вывода  иллюстрируются  на
 
   рис.10 и детализируются в табл. 10.
 
 
 
                            - 97 -
 
                        00152-01 97 07-2
 
 
             Пакет запроса ввода/вывода
 
   ------------------------------------------------------
   :               IRP$L_IOQFL                          :
   ------------------------------------------------------
   :               IRP$L_IOQBL                          :
   ------------------------------------------------------
   : IRP$B_RMOD* : IRP$B_TYPE* :     IRP$W_SIZE*        :
   ------------------------------------------------------
   :               IRP$L_PID*                           :
   ------------------------------------------------------
   :               IRP$L_AST*                           :
   ------------------------------------------------------
   :               IRP$L_ASTPRM                         :
   ------------------------------------------------------
   :               IRP$L_WIND                           :
   ------------------------------------------------------
   :               IRP$L_UCB*                           :
   ------------------------------------------------------
   : IRP$B_PRI* : IRP$B_EFN* :       IRP$W_FUNC         :
   ------------------------------------------------------
   :               IRP$L_IOSB                           :
   ------------------------------------------------------
   :       IRP$W_STS         :       IRP$W_CHAN*        :
   ------------------------------------------------------
   :               IRP$L_SVAPTE                         :
   ------------------------------------------------------
   :       IRP$L_BCNT        :       IRP$W_BOFF         :
   ------------------------------------------------------
   :  не используется        :       IRP$L_BCNT         :
   ------------------------------------------------------
   :               IRP$L_IOST1                          :
   ------------------------------------------------------
   :               IRP$L_IOST2                          :
   ------------------------------------------------------
   :               IRP$L_ABCNT                          :
   ------------------------------------------------------
   :               IRP$L_OBCNT                          :
   ------------------------------------------------------
   :              IRP$L_SEGVBN                          :
   ------------------------------------------------------
   :              IRP$L_DIAGBUF*                        :
   ------------------------------------------------------
   :              IRP$L_SEQNUM*                         :
   ------------------------------------------------------
   :              IRP$L_EXTEND                          :
   ------------------------------------------------------
   :              IRP$L_ARB*                            :
   ------------------------------------------------------
   :              IRP$L_KEYDESC                         :
   ------------------------------------------------------
 
                            Рис. 10
 
 
 
 
 
 
 
 
                            - 98 -
 
                        00152-01 97 07-2
 
 
                                                      Таблица 10
             Содержимое пакета запроса ввода/вывода
 
   -------------------------------------------------------------
                  I
        Поле      I                Содержимое
                  I
   -------------------------------------------------------------
   IRP$L_IOQFL
                        Следующий элемент очереди ввода/вывода.
                    EXE$INSERTIRP читает и записывает это  поле
                    при установке пакетов ввода/вывода  в  оче-
                    редь  ожидания   ввода/вывода.   IOC$REQCOM
                    читает и записывает это поле  при  удалении
                    пакетов из очереди  ожидания  ввода/вывода,
                    чтобы послать пакет драйверу устройства.
   IRP$L_IOQBL
                            Предыдущий     элемент      очереди
                    ввода/вывода.  EXE$INSERTIRP  и  IOC$REQCOM
                    читают и записывают эти поле.
   IRP$W_SIZE*
                         Размер  пакета  запроса  ввода/вывода.
                    EXE$QIO записывает в это поле символическую
                    константу IRP$C_LENGTH поле когда  подпрог-
                    рамма выделяет и  заполняет  пакет  запроса
                    ввода/вывода.
   IRP$B_TYPE*
                        Тип управляющего блока. EXE$QIO записы-
                    вает в  это  поле  символическую  константу
                    DYN$C_IRP  когда  подпрограмма  выделяет  и
                    заполняет пакет запроса ввода/вывода.
   IRP$B_RWOD*
                        Режим доступа процесса во время запроса
                    ввода/вывода. EXE$QIO получает режим досту-
                    па процессора из PSL и записывает  значение
                    в это поле.
   IRP$L_PID*
                        Идентификатор  процесса,  для  процесса
                    выдавшего  запрос   ввода/вывода.   EXE$QIO
                    получает идентификатор  процесса  из  блока
                    управления процессом и записывает  значение
                    в это поле.
   IRP$L_AST*
                        Адрес подпрограммы AST, указанной поль-
                    зователем в запросе ввода/вывода. Если про-
                    цесс указывает адрес подпрограммы  AST  при
                    вызове QIO, EXE$QIO записывает адрес в  это
                    поле.   При   постобработке    ввода/вывода
                    AST-подпрограмма режима ядра ставить в оче-
                    редь AST режима пользователя  для  запраши-
                    вающего процессы, если  это  поле  содержит
                    адрес подпрограммы AST.
   IRP$L_ASTPRM
                        Адрес параметра,  который  должен  быть
                    послан в  качестве  аргумента  подпрограмме
                    AST,  указанной  пользователем  в   запросе
                    ввода/вывода. Если процесс указывает  подп-
                    рограмму AST и параметр для  этой  подпрог-
                    раммы при вызове  QIO,  EXE$QIO  записывает
 
 
                            - 99 -
 
                        00152-01 97 07-2
 
 
                                            Продолжение табл. 10
   -------------------------------------------------------------
                  I
        Поле      I                Содержимое
                  I
   -------------------------------------------------------------
                    параметр  в  это  поле.  При  постобработке
                    ввода/вывода подпрограмма AST  режима  ядра
                    ставить в очередь AST режима  пользователя,
                    если поле IRP$L_AST содержит адрес, и пере-
                    дает значение IRP$L_ASTPRM  в  подпрограмму
                    AST в качестве аргумента.
   IRP$L_WIND
                        Адрес  блока  управления  окном  (WCB),
                    описывающего файл, к которому осуществляет-
                    ся доступ по запросу ввода/вывода.  EXE$QIO
                    заполняет  это  поле,  если   запрашивается
                    ввод/вывод устройстве с  файловой  структу-
                    рой. Это поле  читает  ACP.  Когда  процесс
                    получает доступ к  файлу  на  устройстве  с
                    файловой структурой или создает  логическую
                    связь между файлом и  каналом  ввода/вывода
                    процесса,  ACP  устройства   создает   блок
                    управления  окном,  в  котором  описывается
                    отображение (из виртуального в  логический)
                    файла данных на  диске.  EXE$QIO  сохраняет
                    адрес этого WCB в поле IRP$L_WIND.
   IRP$L_UCB*
                        Адрес блока управления устройством  для
                    устройства,       назначенного       каналу
                    ввода/вывода процесса. EXE$QIO копирует это
                    значение из блока управления каналом.
   IRP$W_FUNC
                        Код функции  ввода/вывода,  идентифици-
                    рующий функцию, которая должна быть  выпол-
                    нена по запросу ввода/вывода. Вызов запроса
                    ввода/вывода    указывает    код    функции
                    ввода/вывода; EXE$QIO  и  подпрограммы  FDT
                    драйвера отображают  значение  кода  в  его
                    наиболее          базисный          уровень
                    (виртуальный->логический->физический)     и
                    копируют сохращенное значение в  это  поле.
                    на основе этого кода функции, EXE$QIO вызы-
                    вает подпрограммы FDT  для  предварительной
                    обработки запроса ввода/вывода. Шесть  раз-
                    рядов кода функции описывают основную функ-
                    цию.  Остальные  10  разрядов  модифицируют
                    функцию.
   IRP$B_EFN*
                        Номер и группа флага события, указанно-
                    го в запросе ввода/вывода. Если при  выдаче
                    запроса ввода/вывода не  указывается  номер
                    флага события,  то  EXE$QIO  использует  по
                    умолчанию  флаг  0.  Это   поле   заполняет
                    EXE$QIO.     Подпрограмма     постобработки
                    ввода/вывода вызывает SCH$POSTEF для  уста-
                    новки этого флага  события  при  завершении
                    операции ввода/вывода.
   IRP$B_PRI*
 
 
                            - 100 -
 
                        00152-01 97 07-2
 
 
                                            Продолжение табл. 10
   -------------------------------------------------------------
                  I
        Поле      I                Содержимое
                  I
   -------------------------------------------------------------
                         Базовый  приоритет   процесса,   когда
                    выдается запрос ввода/вывода. EXE$QIO полу-
                    чает значение этого поля из блока  управле-
                    ния  процессом.  EXE$INSERTIRP  читает  это
                    поле   для   установки    пакета    запроса
                    ввода/вывода в упорядоченную по приоритетам
                    очередь ожидания ввода/вывода.
   IRP$L_IOSB
                         Виртуальный  адрес   блока   состояния
                    ввода/вывода  процесса,  который   получает
                    заключительное      состояние       запроса
                    ввода/вывода  по  завершении  ввода/вывода.
                    EXE$QIO записывает значение в это поле, при
                    выдачи запроса  ввода/вывода  указан  адрес
                    IOSB. Программа AST режима  ядра  постобра-
                    ботки ввода/вывода записывает  два  длинных
                    слов состояния  ввода/вывода  в  блок  IOSB
                    после  завершения  операция   ввода/вывода.
                    когда программа FDT аварийно завершает зап-
                    рос  ввода/вывода  вызывая  EXE$ABORTIO   ,
                    EXE$ABORTIO обнуляет поле IRP$L_IOSB ,  так
                    что постобработка ввода/вывода  не  записы-
                    вает состояние в этот блок.
   IRP$W_CHAN*
                         Индексный  номер  канала  ввода/вывода
                    процесса для этого запроса. Это поле запол-
                    няет EXE$QIO.
   IRP$W_STS
                        Состояние запроса ввода/вывода. EXE$QIO
                    инициализирует  это  поле  вноль.  EXE$QIO,
                    программы  FDT  и  форк-процессы   драйвера
                    модифицируют  это  поле  в  соответствии  с
                    текущим  состоянием  запроса  ввода/вывода.
                    обработка ввода/вывода читает это поле  для
                    определения того, какой  вид  постобработки
                    требуется (например,  освободить  системные
                    буфера и скоректировать использование квот.
                    биты в поле IRP$W_STS описывают тип функции
                    ввода/вывода следующим образом:
            IRP$V_BUFIO     функция буферизованного ввода/вывод
            IRP$V_FUNC      функция чтения;
            IRP$V_PAGIO     функция страничного ввода/вывода;
            IRP$V_COMPLX    сложный буферизованный ввод/вывод ;
            IRP$V_VIRTUAL   функция виртуального ввода/вывода ;
            IRP$V_CHAINED   функция цепного буферизованного
                            ввода/вывода;
            IRP$V_SWAPIO    функция ввода/вывода по обмену ра-
                            бочих наборов ;
            IRP$V_DIAGBUF   присутствует диагностический буфер;
            IRP$V_PHYSIO    функция физического ввода/вывода;
            IRP$V_TERMIO    терминальный ввод/вывод (для вычис-
                            ления приращения приоритета);
            IRP$V_MBXIO     функция ввода/вывода почтового ящи-
 
 
                            - 101 -
 
                        00152-01 97 07-2
 
 
                                            Продолжение табл. 10
   -------------------------------------------------------------
                  I
        Поле      I                Содержимое
                  I
   -------------------------------------------------------------
                            ка;
            IRP$V_EXTEND    с данным IRP связан расширенный IRP
            IRP$V_FILACP    ввод/вывод файла аср;
            IRP$V_MVIRP     функция ввода/вывода проверки
                            монтирования;
            IRP$V_KEY       IRP$L_KEYDESC содержит адрес ключа
                            используемого для кодирования .
   IRP$L_SVAPTE
                        Для операции прямого ввода/вывода  ука-
                    зывает виртуальный адрес  первого  входа  в
                    таблицу  страниц  (PTE)   буфера   передачи
                    ввода/вывода. Программы FDT, которые блоки-
                    руют страницы в памяти для прямой  передачи
                    ввода/вывода, записывают в это  поле  адрес
                    PTE.    Для    операции     буферизованного
                    ввода/вывода  указывает  адрес   буфера   в
                    адресном  пространстве  системы.  Программы
                    FDT,  которые  выделяют  деляют   системные
                    буфера   для    передачи    буферизованного
                    ввода/вывода,    заполняют    это     поле.
                    IOC$INITIATE  копирует  это  поле  в   поле
                    UCB$L_SVAPTE блока  управления  устройством
                    перед передачей управления программе запус-
                    ка ввода/вывода. Постобработка ввода/вывода
                    использует это поле для  освобождения  сис-
                    темного буфера для операции буферизованного
                    ввода/вывода    или    для    разблокировки
                    страниц,заблокированных в операциях прямого
                    ввода/вывода.
   IRP$W_BOFF
                         Байтное  смещение  в  первую  страницу
                    передачи  прямого  ввода/вывода.  Программы
                    FDT вычисляют это смещение и  записывают  в
                    это  поле.  Для  операций   буферизованного
                    ввода/вывода программы FDT  должны  записы-
                    вать в это поле количество байтов, предназ-
                    наченных для процесса, так  как  эти  байты
                    использованы   для    системного    буфера.
                    IOC$INITIATE  копирует  это  поле  в   поле
                    UCB$W_BOFF  блока  управления   устройством
                    перед вызовом драйверной программы  запуска
                    ввода/вывода.  Постобработка   ввода/вывода
                    использует IRP$W_BOFF вместе с IRP$W_BCNT и
                    IRP$L_SVAPTE для  разблокирования  страниц,
                    заблокированных для  прямого  ввода/вывода.
                    для буферизованного ввода/вывода  постобра-
                    ботка  ввода/вывода   прибавляет   значение
                    IRP$W_BOFF к квоте счетчика байтов  процес-
                    са.
   IRP$L_BCNT
                        Счетчик байтов  передачи  ввода/вывода.
                    программы FDT вычисляют значение счетчика и
                    записывают это поле. IOC$INITIATE  копирует
 
 
                            - 102 -
 
                        00152-01 97 07-2
 
 
                                            Продолжение табл. 10
   -------------------------------------------------------------
                  I
        Поле      I                Содержимое
                  I
   -------------------------------------------------------------
                    младшее слово этого поля в поле  UCB$W_BCNT
                    блока управления устройством перед  вызовом
                    драйверной программы запусков ввода/вывода.
                    для    функции    чтения    буферизованного
                    ввода/вывода   постобработка   ввода/вывода
                    использует IRP$L_BCNT для определения коли-
                    чества байтов данных, записываемых в  поль-
                    зовательский буфер. Поле UCB$W_BCNT  указы-
                    вает на младшее слово этого поля.
   IRP$L_IOST1
                          Первое   длинное   слово    состояния
                    ввода/вывода. IOC$REQCOM и  EXE$FINISHIO(C)
                    записывают в это поле содержимое R0.  Подп-
                    рограмма постобработки  ввода/вывода  копи-
                    рует содержимое этого поля в пользовательс-
                    кий    блок     состояния     ввода/вывода.
                    EXE$ZEROPARM  копирует  0,  а   EXE$ONEPARM
                    копирует R1 в это поле. Это  поле  является
                    удобным местом, куда можно  записать  аргу-
                    мент запроса очереди ввода/вывода (от R1 до
                    R6) или вычисленное значение. Это поле так-
                    же называется IRP$L_MEDIA .
   IRP$L_IOST2
                          Второе   длинное   слово    состояния
                    ввода/вывода. IOC$REQCOM и  EXE$FINISHIO(C)
                    записывают   в    это    поле    содержимое
                    R1.подпрограмма постобработки  ввода/вывода
                    копирует содержимое этого поля в  пользова-
                    тельский блок состояния  ввода/вывода.  Это
                    поле  также  известно   как   IRP$B_CARCON.
                    IRP$B_CARCON содержит управляющие  инструк-
                    ции  для  драйвера.  EXE$READ  и  EXE$WRITE
                    копируют  содержимое  R4  пользовательского
                    запроса ввода/вывода в это поле.
   IRP$L_ABCNT
                        Накопленные байты, переданные при пере-
                    даче виртуального ввода/вывода. Читается  и
                    заполняется IOC$IOPOST после частичной вир-
                    туальной передачи. Метка UCB$W_ABCNT указы-
                    вается на младшее слово этого поля.
   IRP$L_OBCNT
                        Счетчик байтов первоначальной  передачи
                    в   виртуальной   передаче    ввода/вывода.
                    читается  IOC$IOPOST,   чтобы   определить,
                    завершена  ли  виртуальная  передача,  или,
                    является  ли  необходимым   другой   запрос
                    ввода/вывода для передачи  оставшихся  бай-
                    тов. Метка UCB$W_OBCNT указывает на младшее
                    слово этого поля.
   IRP$L_SEGVBN
                        Номер виртуального блока текущего  сег-
                    мента в передаче виртуального ввода/вывода.
                    записывается  IOC$IOPOST  после   частичной
 
 
                            - 103 -
 
                        00152-01 97 07-2
 
 
                                            Продолжение табл. 10
   -------------------------------------------------------------
                  I
        Поле      I                Содержимое
                  I
   -------------------------------------------------------------
                    виртуальной передачи.
   IRP$L_DIAGBUF*
                        Адрес диагностического буфера в систем-
                    ном адресном пространстве. Если  в  запросе
                    ввода/вывода указан этот адрес, и если дли-
                    на диагностического буфера указана в табли-
                    це диспетчеризации драйвера, и если процесс
                    имеет  привилегию   для   диагностики,   то
                    EXE$QIO копирует адрес буфера в  это  поле.
                    EXE$QIO выделяет  диагностический  буфер  в
                    системном  адресном   пространстве,   чтобы
                    IOC$DIAGBUFILL заполнила его во время обра-
                    ботки ввода/вывода. Во время  постобработки
                    ввода/вывода  программа  AST  режима   ядра
                    копирует диагностические данные из  систем-
                    ного буфера в диагностический буфер процес-
                    са.
   IRP$L_SEQNUM*
                         Номер   последовательности   сообщений
                    ввода/ вывода.  Если  для  данного  запроса
                    регистрируется ошибка,  это  поле  содержит
                    номер   универсальной    последовательности
                    регистрации ошибок.
   IRP$L_EXTEND
                          Адрес   расширения   пакета   запроса
                    ввода/вывода, связанного  с  этим  пакетом.
                    подпрограммы  FDT  записывают  в  это  поле
                    адрес расширения когда  устройство  требует
                    большего контекста, чем  может  представить
                    пакет  запроса   ввода/вывода.   Это   поле
                    читается IOC$POST . Если этот адрес  расши-
                    рения     используется,     устанавливается
                    IRP$V_EXTEND в IRP$W_STS.
   IRP$L_ARB*
                        Адрес блока  прав  доступа.  Этот  блок
                    расположен в блоке управления  процессом  и
                    содержит маску привилегий процесса  и  UIC,
                    которые устанавливаются следующим образом:
                    ARB$Q_PRIV   квадрослово, содержащее маску
                                 привилегий процесса;
                    SPARE$L      неиспользуемое длинное слово;
                    ARB$I_UIC    длиное слово, содержащее UIC
                                 процесса.
   IRP$L_KEYDESC
                        Адрес ключа кодирования.
 
 
 
                            - 104 -
 
                        00152-01 97 07-2
 
 
        1.10. Расширение пакета запроса  ввода/вывода
 
              (IRPE)
 
 
 
        Расширения  пакетов  запросов  ввода/вывода   содержат
 
   дополнительную информацию о запросе ввода/вывода  для  уст-
 
   ройств,  которые  требуют  большего  контекста,  чем  может
 
   представить стандартный пакет запроса ввода/вывода.  Расши-
 
   рения IRP используются также,  когда  более  одного  буфера
 
   области должно быть заблокировано (захвачено) в памяти  для
 
   операции прямого ввода/вывода, или когда для передачи  тре-
 
   буется буфер длиной более  64К  байтов.  IRPE  обеспечивает
 
   пространство для двух буферных областей  с  32-Х  разрядным
 
   счетчиком байтов каждая.
 
 
        Программа  FDT   выделяют   IRP   с   помощью   вызова
 
   EXE$ALLOCIRP. Программы драйвера связывают расширение IRP с
 
   пакетом запроса ввода/вывода, запоминают адрес расширения в
 
   IRP$L_EXTEND и устанавливают битовое  поля  IRP$V_EXTEND  B
 
   IRP$W_STS,  указывающие  на  то,  что  для  данного  пакета
 
   существует расширение. Содержимое IRPE инициализирует подп-
 
   рограмма FDT. Любые поля внутри расширения, не описанные  в
 
   табл. 11, могут хранить информацию, зависящую от драйвера.
 
 
        Если расширение IRP указывает дополнительные  буферные
 
   области, программа FDT должна использовать такие  программы
 
   захвата буфера, которые выполняют обратный вызов сопрограмм
 
   драйвера,  если  процедура  захвата  выполняется  неуспешно
 
   (EXE$READLOCKR, EXE$WRITELOCKR и EXE$MODIFYLOCKR). Если при
 
   выполнении процедуры  захвата  возникает  ошибка,  драйвера
 
   должен разблокировать все ранее захваченные области и осво-
 
   бодить расширение пакета запроса ввода/вывода перед возвра-
 
 
                            - 105 -
 
                        00152-01 97 07-2
 
 
   том в программу захвата буфера.
 
 
        IOC$IOPOST  автоматически  разблокирует   страницы   в
 
   области 1 (если она определена) и в  области  2  (если  она
 
   определена) для всех расширений IRP, связанных  с  пакетом,
 
   обработка которого завершается. IOC$IOPOST  также  освобож-
 
   дает все IRPE.
 
 
        Поле расширения пакета запроса ввода/вывода  иллюстри-
 
   руются на рис. 11 и описываются в табл. 11.
 
 
 
 
 
                            - 106 -
 
                        00152-01 97 07-2
 
 
           Расширение пакета запроса
 
   ------------------------------------------------------
   :                    не используется                 :
   ------------------------------------------------------
   :                    не используется                 :
   ------------------------------------------------------
   :не используется:IRP$B_TYPE  :    IRP$W_SIZE         :
   ------------------------------------------------------
   :                    не используется                 :
   ------------------------------------------------------
   :                    не используется                 :
   ------------------------------------------------------
   :                    не используется                 :
   ------------------------------------------------------
   :                    не используется                 :
   ------------------------------------------------------
   :                    не используется                 :
   ------------------------------------------------------
   :                    не используется                 :
   ------------------------------------------------------
   :                    не используется                 :
   ------------------------------------------------------
   :    IRP$W_STS               :   не используется     :
   ------------------------------------------------------
   :              IRP$L-SVAPTE1                         :
   ------------------------------------------------------
   :   не используется          :     IRP$W_BOFF1       :
   ------------------------------------------------------
   :              IRP$L-BCNT1                           :
   ------------------------------------------------------
   :              IRP$L-SVAPTE2                         :
   ------------------------------------------------------
   :  не исHпользуется          :    IRP$W-BOFF2         :
   ------------------------------------------------------
   :              IRP$L-BCNT2                           :
   ------------------------------------------------------
   /                                                    /
   /              не используется (16 байтов)           /
   ------------------------------------------------------
   :              IRP$L-EXTEND                          :
   ------------------------------------------------------
 
 
                            Рис. 11
 
 
 
                            - 107 -
 
                        00152-01 97 07-2
 
 
                                                      Таблица 11
        Содержимое расширения пакета запроса ввода/вывода
 
   -------------------------------------------------------------
               I
     Поле      I           Содержимое
               I
   -------------------------------------------------------------
   IRPE$W_SIZE
                         Размер   расширения   пакета   запроса
                    ввода/вывода  EXE$ALLOCIRP  заносит  в  это
                    поле константу IRP$C_LENGTH .
   IRPE$B_TYPE
                        Тип  управляющего  блока.  EXE$ALLOCIRP
                    записывает в это поле константу DYN$C_IRP .
   IRPE$W_STS
                        Поле состояния расширения IRP.  Биты  в
                    поле состояния описывают следующие условия:
                    IRPE$V_EXTEND с данным IRPE связано  другие
                    IRPE.
   IRPE$L_SVAPTE1
                        Системный виртуальный адрес строки таб-
                    лицы страниц, отображающий  начало  области
                    1. Это поле заполняется подпрограммами FDT.
                    если область  не  определена,  данное  поле
                    содержит нуль.
   IRPE$W_BOFF1
                        Байтное смещение области  1.  Это  поле
                    заполняется подпрограммами FDT.
   IRPE$L_BCNT1
                        Размер в байтах  области  1.  Это  поле
                    заполняется подпрограммами FDT.
   IRPE$L_SVAPTE2
                        Системный виртуальный адрес строки таб-
                    лицы страниц, отображающий  начало  области
                    2. Устанавливается подпрограммами FDT.  ЭТО
                    поле содержит значение нуль,  если  область
                    не определена.
   IRPE$W_BOFF2
                        Байтное смещение области  2.  Это  поле
                    устанавливается подпрограммами FDT.
   IRPE$L_BCNT2
                        Размер в байтах  области  2.  Это  поле
                    заполняется подпрограммами FDT.
   IRPE$L_EXTEND
                        Адрес следующего IRPE  для  этого  IRP,
                    если оно существует.
 
 
        1.11. Блок прав об'екта (ORB)
 
 
 
        Блок прав об'екта - это структура данных,  описывающая
 
   права,которые должен иметь процесса для доступа к  об'екту,
 
   с которым связан данный ORB.
 
 
 
                            - 108 -
 
                        00152-01 97 07-2
 
 
        Обычно ORB формируется, когда присоединяется устройст-
 
   во по команде SYSGEN'а CONNECT. Одновременно  SYSGEN  также
 
   устанавливает адрес ORB в UCB$I_ORB.
 
 
        Когда ORB иницилизируется, драйверы устройства  должны
 
   прежде всего очистить ORB, а затем, используя  макрокоманду
 
   DPT_STORE, инициализировать поля в ORB. Поля ORB  иллюстри-
 
   рованы на рис. 12 и описаны в табл. 12.
 
 
               Блок прав об'екта
 
   -------------------------------------------------------
   :                    ORB$L_OWNER                      :
   -------------------------------------------------------
   :                  ORB$L_ACL_MUTEX                    :
   -------------------------------------------------------
   :  ORB$B_FLAGS  :  ORB$B_TYPE    :   ORB$W_SIZE       :
   -------------------------------------------------------
   :          резервируются 16 байтов                    :
   :                                                     :
   -------------------------------------------------------
   :                         :     ORB$W_PROT            :
                             -----------------------------
   :          резервируются 14 байтов                    :
   :                                                     :
   -------------------------------------------------------
   :               ORB$L_ACLFL                           :
   -------------------------------------------------------
   :               ORB$L_ACLBL                           :
   -------------------------------------------------------
   :          резервируются 20 байтов                    :
   :                                                     :
   -------------------------------------------------------
   :          резервируются 20 байтов                    :
   :                                                     :
   -------------------------------------------------------
 
 
                            Рис. 12
 
 
 
                            - 109 -
 
                        00152-01 97 07-2
 
 
                                                      Таблица 12
                  Содержимое блока прав об'екта
 
   -------------------------------------------------------------
                  I
        Поле      I      Использование
                  I
   -------------------------------------------------------------
   ORB$I_OWNER
                        UIC владелца об'екта.
   ORB$I_ACI_MUTEX
                        Семафор монопольного  доступа  для  АСL
                    об'екта, использумое для контроля за досту-
                    пом к ACL для чтения и записи.
   ORB$W_SIZE
                        Размер ORB в байтах (ORB$K_LENGTH).
   ORB$B_TYPE
                        Код, обозначающий,  что  эта  структура
                    является ORB ( DYN$C_ORB ).
   ORB$B_FLAGS
                        Флаги,  необходимые  для  интерпретации
                    тех частей ORB, которые могут иметь альтер-
                    нативные значения.  В  ORB$B_FLAGS  опреде-
                    ляются следующие поля:
                    ORB$V_PROT_16   этот флаг должен быть
                                    установлен;
                    ORB$V_ACI_QUEUE этот флаг должен быть
                                    установлен; если он
                                    очищен, то ORB$I_ACLFL
                                    и    ORB$I_ACLBL
                                    должны содержать 0;
                    ORB$V_NOACL     этот об'ект не может
                                    иметь ACL.
   ORB$W_PROT
                        Стандартная защита SOGW.
   ORB$I_ACLFL
                        Следующий элемент очереди ACL.
   ORB$I_ACLBL
                        Предыдущий элемент очереди ACL.
 
 
        1.12. Блок управления устройством (UCB)
 
 
 
        Блок управления устройством является блоком переменной
 
   длины, который описывает отдельно взятое устройство. Каждое
 
   устройство в системе имеет свой собственный блок управления
 
   устройством. Блок описывает или обеспечивает  указатели  на
 
   тип устройства, контроллер, драйвер, состояние устройства и
 
   текущую активность ввода/вывода.
 
 
 
 
 
                            - 110 -
 
                        00152-01 97 07-2
 
 
        Во время автоконфигурации процедура загрузки  драйвера
 
   создает один блок управления устройством для  каждого  уст-
 
   ройства в системе. Привилегированный системный пользователь
 
   может запросить процедуру загрузки  драйвера  для  создания
 
   блоков управления устройством для дополнительных  устройств
 
   с помощью команды SYSGEN'а CONNECT, как это описано в  раз-
 
   деле 1. Процедура  создает  блоки  управления  устройствами
 
   такой длины, какая указана в  прологовой  таблице  драйвера
 
   данного устройства. Драйвер использует память UCB, располо-
 
   женную за стандартными полями  UCB,  для  хранения  данных,
 
   характерных для устройства, и в качестве  временной  памяти
 
   драйвера.
 
 
        Процедура загрузки драйвера  инициализирует  некоторые
 
   статические поля блока управления устройством при  создании
 
   этого блока. Операционная система и драйверы могут читать и
 
   модифицировать все нестатические поля блока управления уст-
 
   ройством.
 
 
        Поля блока управления устройством,  которые  присутст-
 
   вуют для всех устройств, представлены на рис. 13 и  описаны
 
   в табл. 13.
 
 
 
                            - 111 -
 
                        00152-01 97 07-2
 
 
             Блок управления устройством
 
   -------------------------------------------------------
   :                UCB$L_FQFL*                          :
   -------------------------------------------------------
   :                UCB$L_FQBL*                          :
   -------------------------------------------------------
   : UCB$B_FIPL* : UCB$B_TYPE* :      UCB$W_SIZE*        :
   -------------------------------------------------------
   :                UCB$L_FPC                            :
   -------------------------------------------------------
   :                UCB$L_FR3                            :
   -------------------------------------------------------
   :                UCB$L_FR4                            :
   -------------------------------------------------------
   :  UCB$W_SRCADDR*          :     UCB$W_BUFQUO         :
   -------------------------------------------------------
   :                UCB$L_ORB*                           :
   -------------------------------------------------------
   :                UCB$L_LOCKID*                        :
   -------------------------------------------------------
   :                UCB$L-CRB*                           :
   -------------------------------------------------------
   :                UCB$L-DDB*                           :
   -------------------------------------------------------
   :                UCB$L-PID*                           :
   -------------------------------------------------------
   :                UCB$L-LINK*                          :
   -------------------------------------------------------
   :                UCB$L_VCB*                           :
   -------------------------------------------------------
   :                UCB$L_DEVCHAR                        :
   -------------------------------------------------------
   :                UCB$L_DEVCHAR2                       :
   -------------------------------------------------------
   : UCB$W_DEVBUFSIZ        :UCB$B_DEVTYPE:UCB$B_DEVCLASS:
   -------------------------------------------------------
   :                UCB$L_DEVDEPEND                      :
   -------------------------------------------------------
   :                UCB$L_DEVDEPEND2                     :
   -------------------------------------------------------
   :                UCB$L_IOQFL*                         :
   -------------------------------------------------------
   :                UCB$L_IOQBL*                         :
   -------------------------------------------------------
   :   UCB$W_CHARGE*           :   UCB$W_UNIT*           :
   -------------------------------------------------------
   :                UCB$L_IRP                            :
   -------------------------------------------------------
   : UCB$B_AMOD* : UCB$B_DIPL*  :     UCB$W_REFC*        :
   -------------------------------------------------------
   :                UCB$L_AMB*                           :
   -------------------------------------------------------
   :                UCB$L_STS                            :
   -------------------------------------------------------
   :    UCB$W_QLEN              :      UCB$W_DEVSTS      :
   -------------------------------------------------------
   :                UCB$L_DUETIM*                        :
   -------------------------------------------------------
 
 
                            - 112 -
 
                        00152-01 97 07-2
 
 
   -------------------------------------------------------
   :                UCB$L_OPCNT*                         :
   -------------------------------------------------------
   :                UCB$L_SVPN*                          :
   -------------------------------------------------------
   :                UCB$L_SVAPTE                         :
   -------------------------------------------------------
   :    UCB$W_BCNT              :      UCB$W_BOFF        :
   -------------------------------------------------------
   :  UCB$W_ERRCNT             :UCB$B_ERTMAX:UCB$B_ERTCNT:
   -------------------------------------------------------
   :                UCB$L_PDT*                           :
   -------------------------------------------------------
   :                UCB$L_DDT*                           :
   -------------------------------------------------------
   :             не используется                         :
   -------------------------------------------------------
 
                            Рис. 13
 
 
 
                                                      Таблица 13
             Содержимое блока управления устройством
 
   -------------------------------------------------------------
                  I
        Поле      I              Содержимое
                  I
   -------------------------------------------------------------
   UCB$L_FQFL*
                          Указывает   на   следующий    элемент
                    форк-очереди. Это поле заполняет EXE$IOFORK
                    и подпрограммы МОС ВП управляющие  ресурса-
                    ми. Очередь содержит  адреса  UCB,  которые
                    содержат  контекст  форк-процесса  драйвера
                    для драйверов, ожидающих продолжения  обра-
                    ботки ввода/вывода.
   UCB$L_FQBL*
                         Указывает  на  предыдущий  элемент   в
                    форк-очереди.  EXE$IOFORK  и   подпрограммы
                    управления ресурсами МОС ВП записывают  это
                    поле.
   UCB$W_SIZE*
                        Размер UCB. Прологовая таблица  каждого
                    драйвера должна указывать значение для это-
                    го  поля.   Процедура   загрузки   драйвера
                    использует  это  значение,  чтобы  выделить
                    пространство для UCB и сохраняет это значе-
                    ние в каждом созданном UCB.  Дополнительное
                    пространство за стандартными байтами UCB
                    (UCB$K_LENGTH ) предназначено  для хранения
                    данных, характерных для устройства,  и  для
                    временной памяти.
   UCB$B_TYPE*
                        Тип управляющего блока. Процедура  заг-
                    рузки драйвера в это поле записывает  конс-
                    танту DYN$C_UCB, когда создает UCB.
 
 
                            - 113 -
 
                        00152-01 97 07-2
 
                                            Продолжение табл. 13
   -------------------------------------------------------------
                  I
        Поле      I              Содержимое
                  I
   -------------------------------------------------------------
   UCB$B_FIPL*
                         Форк-уровень   приоритета   прерывания
                    (IPL), на котором обычно выполняется  драй-
                    вер устройства. Прологовая таблица  каждого
                    драйвера должна указывать значение для это-
                    го поля. Процедура загрузки драйвера  запи-
                    сывает данное значение в UCB, когда  проце-
                    дура создает UCB. МОС ВП  создает  на  этом
                    IFL форк-процесс драйвера,который  получает
                    управление в подпрограмме драйвера  запуски
                    ввода/вывода.   Когда    драйвер    создает
                    форк-процесс  после  прерывания,   МОС   ВП
                    вставляет форк-блок в  форк-очередь,  осно-
                    ванную на этом IPL. Форк-диспетчер МОС  ВП,
                    выполняющийся на UCB$B_FIPL удаляет из оче-
                    реди  форк-блок  и  возвращает   управление
                    приостановленному  форк-процессу  драйвера.
                    все  устройства,  которые  присоединены   к
                    одному адаптеру общей шины, и активно  кон-
                    курируют за  разделяемые  ресурсы  адаптера
                    общей шины и/или канал данных  контроллера,
                    должны указывать одинаковое значение в поле
                    форк IPL.
   UCB$L_FPC
                        Адрес рс форк-процесса драйвера.  Когда
                    программа МОС  ВП  сохраняет  форк-контекст
                    драйвера,  чтобы  приостановить  выполнение
                    драйвера, она в это  поле  сохраняет  адрес
                    следующей  инструкции  драйвера.  Программа
                    МОС ВП, которая реактивирует приостановлен-
                    ный драйвер, передает управление по  запом-
                    ненному адресу РС.  К  программам  МОС  ВП,
                    которые приостанавливают  работу  драйвера,
                    относятся     EXE$IOFORK     IOC$REQXCHANX,
                    IOC$REQMAPREG, IOC$REQDATAP и  IOC$WFIKPCH.
                    к программам, которые реактивируют приоста-
                    новленный драйвер,  относятся  IOC$RELCHAN,
                    IOC$RELMAPREG, IOC$RELDATAP,  IOC$FОRKDSPTH
                    и программы обслуживания прерываний драйве-
                    ра. Когда подпрограмма обслуживания  преры-
                    ваний драйвера определяет,  что  устройство
                    ожидает прерывания, подпрограмма возвращает
                    управление по адресу РС, запомненному в UCB
                    устройства.
   UCB$L_FR3
                        Значение R3 в момент,  когда  программа
                    МОС ВП приостанавливает форк-процесс  драй-
                    вера. Значение R3 восстанавливается  непос-
                    редствено перед тем,  как  приостановленный
                    драйвер вновь получает управление.
   UCB$L_FR4
                        Значение R4 в момент,  когда  программа
                    операционной    системы    приостанавливает
                    форкпроцесс драйвера. Значение  R4  восста-
 
 
                            - 114 -
 
                        00152-01 97 07-2
 
 
                                            Продолжение табл. 13
   -------------------------------------------------------------
                  I
        Поле      I              Содержимое
                  I
   -------------------------------------------------------------
                    навливается непосредственно перед тем,  как
                    приостановленный  драйвер  вновь   получает
                    управление.
   UCB$W_BUFQUO*
                         Квота  буферизованного   ввода/вывода,
                    если данный UCB представляет почтовый ящик.
   UCB$W_SRCADDR*
                        Номер локальной связи для сети SM.
   UCB$L_ORB*
                        Адрес ORB связаного с UCB. SYSGEN поме-
                    щает адрес в это поле,  когда  используется
                    команда CONNECT.
   UCB$L_LOCKID*
                        Идентификатор блокировки на  этом  уст-
                    ройстве.
   UCB$L_CRB*
                        Адрес первичного блока запроса  канала,
                    связанного с  этим  устройством.  Процедура
                    загрузки драйвера заполняет это поле  после
                    того, как она  создаст  CRB.  Форк-процессы
                    драйвера читает это поле для получения дос-
                    тупа к регистрам устройства. Программы  МОС
                    ВП  используют  UCB$L_CRB  для  определения
                    кода диспетчеризации прерывания  и  адресов
                    программ инициализации.
   UCB$L_DDB*
                        Адрес блока данных устройства, связан с
                    устройством.  Процедура  загрузки  драйвера
                    заполняет это поле при создании UCB.  Прог-
                    раммы МОС ВП обычно читают это поле,  чтобы
                    определить  точки  входа  драйвера,   адрес
                    драйверной таблицы выбора функций или  АСР,
                    связанного с данным устройством.
   UCB$L_PID*
                        Код идентификации процесса для  процес-
                    са, которым закрепленно устройство. Записы-
                    вается $ALLOC.
   UCB$L_LINK*
                        Адрес следующего  UCB  в  цепочке  UCB,
                    присоединенных к одному контроллеру и  свя-
                    занных с блоком данных устройства. Процеду-
                    ра загрузки драйвера  записывает  это  поле
                    при добавлении следующего UCB. Любые  прог-
                    раммы МОС ВП, которые  проверяют  состояние
                    всех устройств в системе, читают это  поле.
                    к таким программам  относятся  и  программы
                    восстановления после сбоя питания.
   UCB$L_VCB*
                        Адрес  блока  управления  томом  (VCB),
                    который описывает  том,  смонтированный  на
                    устройстве. Это поле записывается АСР  уст-
                    ройства     и     читается      программами
                    EXE$QIOACPPKT и АСР.
 
 
                            - 115 -
 
                        00152-01 97 07-2
 
 
                                            Продолжение табл. 13
   -------------------------------------------------------------
                  I
        Поле      I              Содержимое
                  I
   -------------------------------------------------------------
   UCB$L_DEVCHAR
                        Первое длиное слово характеристик  уст-
                    ройства. Прологовая таблица каждого драйве-
                    ра должна указывать значения  символических
                    констант,определяемых         макрокомандой
                    DPT_STORE для этого поля. Процедура загруз-
                    ки драйвера  заполняет  поле  при  создании
                    UCB. Системное программа обслуживания  оче-
                    реди  запросов  ввода/вывода  читает  поле,
                    чтобы определить,  является  ли  устройство
                    спуловым,  файло-структурированным,  разде-
                    ляемым, имеет ли файловую структуру,  смон-
                    тирован том и т.д. Система определяет  сле-
                    дующие характеристики устройства:
            DEV$V_REC   устройство орентированное на записи;
            DEV$V_CCL   устройство с управляемой кареткой;
            DEV$V_TRM   терминальное устройство;
            DEV$V_DIR   устройство со справочной структурой;
            DEV$V_SDI   отдельное устройство со справочной
                        структурой;
            DEV$V_SQD   последовательное блоко-орентированное
                        устройство (например, магнитная лента);
            DEV$V_SPL   устройство находится в режиме спула;
            DEV$V_OPR   устройство является устройством операто
                        ра;
            DEV$V_NET   сетевое устройство;
            DEV$V_RCT   устройство содержит RCT;
            DEV$V_FOD   файло-орентированное устройство (напр.
                        диск и магнитная лента);
            DEV$V_DUA   двухпортовое устройство;
            DEV$V_SHR   разделяемое устройство, используемое
                        одновременно несколькими программами;
            DEV$V_GEN   общее устройство;
            DEV$V_AVL   устройство доступно для использования;
            DEV$V_MNT   устройство с монтировано;
            DEV$V_MBX   устройство почтового ящика;
            DEV$V_DMT   устройство отмечено для демонтирования;
            DEV$V_ELG   на устройстве разрешено регистрация
                        ошибок;
            DEV$V_ALL   устройство распределено;
            DEV$V_FOR   устройство с монтировано как чужое  (не
                        имеет файловой структуры);
            DEV$V_SWL   блокировка записи на устройство програм
                        мными средствами;
            DEV$V_IDV   устройство способно обеспечить ввод;
            DEV$V_ODV   устройство способно обеспечить вывод;
            DEV$V_RND   устройство допускает произвольный
                        доступ;
            DEV$V_RTM   устройство реального времени;
            DEV$V_RCK   на устройстве разрешена проверка чтения
            DEV$V_WCK   на устройстве разрешена проверка записи
   UCB$B_DEVCHAR2
                        Второе длиное слово характеристик  уст-
 
 
                            - 116 -
 
                        00152-01 97 07-2
 
 
                                            Продолжение табл. 13
   -------------------------------------------------------------
                  I
        Поле      I              Содержимое
                  I
   -------------------------------------------------------------
                    ройства. Прологавая таблица каждого драйве-
                    ра должна  указать  значения  символических
                    констант    (определяется     макрокомандой
                    $DPT_STORE) для этого поля. Процедура  заг-
                    рузки драйвера заполняет поле при  создании
                    UCB. Системное программа обслуживания  оче-
                    реди  запросов  ввода/вывода  читает  поле,
                    чтобы определить, характеристики устройств.
                    система определяет следующие  характеристи-
                    ки:
           DEV$V_CL     устройство доступно для кластера;
           DEV$V_DET    устройство является отсоединенным тер-
                        миналом;
           DEV$V_RTT    устройство имеет расширение UCB удаленно-
                        го терминала;
           DEV$V_CDP    устройство с двумя путями данных и с дву-
                        мя UCB;
           DEV$V_2P     два пути данных известны для этого  уст-
                        ройства;
           DEV$V_MSCP   диск или лента доступны для использо-
                        вания MSCP;
           DEV$V_SSM    резервировано для системы;
           DEV$V_SRV    устройство обслуживается с использова-
                        нием MSCP;
           DEV$V_RED    устройство является перераспределяемый
                        терминалом;
           DEV$V_NNM    имя этого устройства префиксируется
                        узловом именем и $;
                        если этот бит установлен, строка содер-
                        жащее наименование устройства, наимено-
                        вания контроллера и максимально возмож-
                        ный номер устройства, должна содержать
                        меньше чем восем символов, так как имя
                        устройства, включая префикс, не превыша-
                        ло 16 символов.
   UCB$B_DEVCLASS
                        Класс  устройства.  Прологовая  таблица
                    каждого драйвера должна указывать  символи-
                    ческую константу (определяемую  макрокоман-
                    дой $DPT_STORE) для этого  поля.  Процедура
                    загрузки драйвера заполняет  это  поле  при
                    создании UCB. Драйверы с функциями установ-
                    ки характеристик и режима устройства  моди-
                    фицируют значение в  этом  поле,  используя
                    данные,     поставляемыми     в     запросе
                    ввода/вывода.  Система  МОС  ВП  определяет
                    следующие классы устройств:
            DC$_DISK     дисковое устройство;
            DC$_TAPE     устройство магнитной ленты;
            DC$_SCOM     устройство синхронной связи;
            DC$_CARD     устройство чтения перфокарт;
            DC$_TERM     терминальное устройство;
            DC$_LP       устройство построчной печати;
 
 
                            - 117 -
 
                        00152-01 97 07-2
 
 
                                            Продолжение табл. 13
   -------------------------------------------------------------
                  I
        Поле      I              Содержимое
                  I
   -------------------------------------------------------------
            DC$_REALTIME устройство реального времени;
            DC$_MAILBOX  устройство почтового ящика.
                        Заметим, что определение устройства как
                    устройства реального  времени,  является  в
                    некотором смысле субьективным; это не пред-
                    полагает никакой специальной  интерпретации
                    со стороны МОС ВП.
   UCB$B_DEVTYPE
                        Тип устройства. Прологовая таблица каж-
                    дого драйвера для этого поля должна указать
                    символическую константу (определяемую  мак-
                    рокомандой DPT_STORE).  Процедура  загрузки
                    драйвера заполняет это  поле  при  создании
                    UCB. Драйверы с функциями установки  режима
                    и  характеристик  устройства   модифицируют
                    значение в этом поле данными, поставляемыми
                    в запросе ввода/вывода.
   UCB$W_DEVBUFSIZ
                        Размер буфера по умолчанию.  Прологовая
                    таблица драйвера может указать значение для
                    этого поля,  если  это  уместно.  Процедура
                    загрузки драйвера заполняет поле при созда-
                    нии UCB.  Драйверы  с  функциями  установки
                    режима характеристик  устройства  модифици-
                    руют значение в этом поле данными,  постав-
                    ляемыми в запросе  ввода/вывода.  Это  поле
                    используется СУД для  ввода/вывода  записей
                    на нефайлоориентированных устройствах.
   UCB$L_DEVDEPEND
                        Данные, зависимые от устройства. Содер-
                    жит данные, описывающие устройство, которые
                    может интерпретировать только драйвер  дан-
                    ного устройства. В прологовой таблице драй-
                    вера можно указать значение для этого поля.
                    процедура загрузки драйвера  заполняет  это
                    поле при создании UCB. Драйверы с функциями
                    установки режима и характеристик устройства
                    модифицируют значение в этом поле  данными,
                    поставляемыми в запросе ввода/вывода.
   UCB$L_DEVDEPND2
                        Второе длинное слово состояния, завися-
                    щего от устройства. Это поле является  рас-
                    ширением UCB$L_DEVDEPEND.
   UCB$L_IOQFL*
                        Следующий элемент заголовка списка оче-
                    реди ввода/вывода. Очередь содержит  адреса
                    пакетов  запросов  ввода/вывода,  ожидающих
                    обработки  на   устройстве.   EXE$INSERTIRP
                    заносит пакеты запросов ввода/вывода в оче-
                    редь ожидания пакета запроса  ввода/вывода,
                    когда устройство занято. IOC$REQCOM удаляет
                    пакеты  запроса  ввода/вывода  из  очереди,
                    когда устройство свободно. Очередь является
 
 
                            - 118 -
 
                        00152-01 97 07-2
 
 
                                            Продолжение табл. 13
   -------------------------------------------------------------
                  I
        Поле      I              Содержимое
                  I
   -------------------------------------------------------------
                    приоритетной очередью, которая имеет пакеты
                    с наивысшим приоритетом в  начале  очереди.
                    приоритет определяется базовым  приоритетом
                    запрашивающего процесса. Пакеты с  одинако-
                    вым приоритетом обрабатывапо принципу  пер-
                    вым вошел-первым вышел.
   UCB$L_IOQBL*
                         Предыдущий  элемент  заголовка  списка
                    очереди   ввода/вывода.   EXE$INSERTIRP   и
                    EXE$REQCOM модифицируют эту очередь.
   UCB$W_UNIT*
                        Номер физического устройства.  Хранится
                    в виде двоичного значения.  Процедура  заг-
                    рузки драйвера записывает  значение  в  это
                    поле при создании UCB. Драйверы  для  конт-
                    роллеров с несколькими устройствами  читают
                    это поле  при  инициализации  устройства  с
                    целью идентификации устройства для контрол-
                    лера.
   UCB$W_CHARGE*
                        Требуемая квота количество байтов  поч-
                    тового ящика, если устройство является поч-
                    товым ящиком.
   UCB$L_IRP
                         Адрес  пакета  запроса   ввода/вывода,
                    обрабатываемого в  данный  момент  на  уст-
                    ройстве      форк-процессом       драйвера.
                    IOC$INITIATE в это  поле  записывает  адрес
                    пакета запроса ввода/вывода перед  создание
                    форк-процесса драйвера для обработки запро-
                    са ввода/вывода. Форк-процесс  драйвера  из
                    этого поля получает  адрес  пакета  запроса
                    ввода/вывода, который должен  быть  обрабо-
                    тан. Значение, содержащееся  в  этом  поле,
                    является  действительным,  если  установлен
                    разряд UCB$V_BSY в поле UCB$L_STS .
   UCB$W_REFC*
                        Счетчик  ссылок  процессов,  которые  в
                    данный момент  имеют  каналы  ввода/вывода,
                    назначение данному устройству. Увеличивает-
                    ся на единицу системными сервисам $ASSING и
                    $ALLOC. Уменшается $DASSING и $DALLOC.
   UCB$B_DIPL
                        Уровен приоритета прерывания  устройст-
                    ва, на котором устройство запрашивает аппа-
                    ратные  прерывания.  В  прологовой  таблице
                    каждого драйвера должно указыватся значение
                    для этого поля. Процедура загрузки драйвера
                    заполняет это поле при создании UCB.  Неко-
                    торые драйверы устройств  повышают  IPL  до
                    этого значения перед  чтением  или  записью
                    регистров устройства.
   UCB$B_AMOD*
 
 
                            - 119 -
 
                        00152-01 97 07-2
 
 
                                            Продолжение табл. 13
   -------------------------------------------------------------
                  I
        Поле      I              Содержимое
                  I
   -------------------------------------------------------------
                        Если  устройство  распределена,  указы-
                    вается режим доступа, на котором  произошло
                    это  распределение.  Заполняется  системным
                    сервисом $ALLOC и $DALLOC .
   UCB$L_AMB*
                        Указатель UCB связанного почтового ящи-
                    ка. Это поле используется для спуловых уст-
                    ройств и почтовых ящиков.
   UCB$L_STS
                        Состояние устройства. Заполняется драй-
                    верами    и    IOC$REQCOM,    IOC$CANCELIO,
                    IOC$INITIATE,   IOC$WFIKPCH,   IOC$WFIRLCH,
                    EXE$INSIOQ и EXE$TIMEOUT . Это поле читает-
                    ся  драйверами,  системными  обслуживающими
                    подпрограммами       запросов       очереди
                    ввода/вывода,  IOC$REQCOM,  IOC$INITIATE  и
                    EXE$TIMEOUT . Это слово включяет  следующие
                    разряды:
            UCB$V_TIM      таймаут разрешен;
            UCB$V_INT      ожидаются прерывания;
            UCB$V_ERLOGIP  обрабатывается регистрация ошибки;
            UCB$V_CANCEL   отменение ввод/вывод на устройстве;
            UCB$V_ONLINE   устройство подключено к системе;
            UCB$V_POWER    произошел сбой питания, когда
                           устройство было занято;
            UCB$V_TIMOUT   устройство в таймауте;
            UCB$V_INTTYPE  прерывание приемника;
            UCB$V_BSY      устройство занято;
            UCB$V_MOUNTING устройство смонтировано;
            UCB$V_MNTVERIP выполняется проверка монтирования;
            UCB$V_WRONGVOL имя тома не совпадает с именем тома
                           блоке управления томом;
            UCB$V_DEADMO   освободить устройство при демонтиро-
                           вании;
            UCB$V_VALID    программное обеспечение читает, что
                           том является деиствительным;
            UCB$V_UNLOAD   разгрузить том при демонтировании;
            UCB$V_TEMPLATE шаблон блока управления устройством,
                           из которого создаются другие UCB для
                           этого устройства;
                           системный сервис $ASSIGN проверяет
                           этот  бит в запрошенном  UCB и, если
                           этот бит установлен, создает UCB по
                           по шаблону. Вместо запрошеного назна
                           чается новый UCB;
           UCB$V_DELETEUCB удалить этот UCB, когда значение
                           UCB$W_REFC становится нульем;
           UCB$V_LCLVALID  том на этом устройстве является дей-
                           ствительным на локальном узле;
           UCB$V_SUPMVMSG  сообщение проверки монтирования запр
                           щается, если они указывают на успех.
           UCB$V_MNTVERPND проверка монтирования ожидает  на
                           устройстве и устройство занято.
 
 
                            - 120 -
 
                        00152-01 97 07-2
 
 
                                            Продолжение табл. 13
   -------------------------------------------------------------
                  I
        Поле      I              Содержимое
                  I
   -------------------------------------------------------------
   UCB$W_DEVSTS
                         Состояние,  зависящее  от  устройства.
                    читается  и  записывается  драйверами  уст-
                    ройств. Система определяет  следующие  биты
                    состояния:
           UCB$V_JOB      диспетчер зараний удален;
           UCB$V_TEMPLBSY шаблон UCB занят;
           UCB$V_PRMMBX   устройство постоянный почтовой ящик;
           UCB$V_DELMBX   почтовый ящик отмечен для удаления;
           UCB$V_SMMBX    почтовый ящик с разделяемой памяти;
   UCB$W_OLEN
                        Длина очереди запросов ввода/вывода  на
                    которую указывает UCB$L_IOQFL.
   UCB$L_DUETIM*
                          Время   требуемое   для    завершения
                    ввода/вывода хранится  в  виде  абсолютного
                    времени в  младшим  32  разрядах  (время  в
                    секундах с  момента  загрузки  операционной
                    системы), при котором устройство  войдет  в
                    таймаут. IOC$WFIKPCH и IOC$WFIRLCH  заносят
                    это поле, когда они приостанавливают  драй-
                    вер для ожидания прерывания  или  таймаута.
                    EXE$TIMEOUT проверяет это поле в каждом UCB
                    базы данных ввода/вывода один раз в  секун-
                    ду. Если произошел таймаут, и таймауты  для
                    данного    устройства     разрешены,     то
                    EXE$TIMEOUT вызывает  обработчик  таймаутов
                    драйвера устройства.
   UCB$L_OPCNT*
                        Счетчик операций, завершенных  на  уст-
                    ройстве  с   момента   загрузки   МОС   ВП.
                    IOC$REQCOM заполняет это поле  каждый  раз,
                    когда  программа  вставляет  пакет  запроса
                    ввода/вывода   в   очередь    постобработки
                    ввода/вывода.
   UCB$L_SVPN*
                        Индекс на виртуальный  адрес  записи  в
                    системной таблице страниц, постоянно  выде-
                    ленной устройству процедурой загрузки драй-
                    вера. Системный виртуальный адрес страницы,
                    описываемой  этим  индексом,   может   быть
                    вычислен по формуле:
                   (INDEX * 200) + 80000000 (шестнадцатиричнOе)
                   если прологовая таблица драйвера  указывает
                   DPT$M_SVP в аргументе флагов макрокоманды
                   DPTAB, процедура загрузки драйвера выделяет
                   для устройства страницы   из   нестраничной
                   системной памяти. Процедура записывает  инде
                   записи системной таблицы страниц в
                   UCB$L_SVPN , при созданий UCB.
                   Это поле используется драйверами дисков для
                   коррекции ошибок ЕСС.
   UCB$L_SVAPTE
 
 
                            - 121 -
 
                        00152-01 97 07-2
 
 
                                            Продолжение табл. 13
   -------------------------------------------------------------
                  I
        Поле      I              Содержимое
                  I
   -------------------------------------------------------------
                        Для операции прямого ввода/вывода, вир-
                    туальный  адрес  записи  системной  таблицы
                    страниц (PTE) для первой страницы,  которая
                    должна использоваться в передаче  ввода/вы-
                    вода.   Для буферизованного    ввода/вывода
                    адрес      системного               буфера,
                    используемого в передаче. Это поле  исполь-
                    зуется   только   в   операциях   передачи.
                    IOC$INITIATE   заполняет   это   поле    из
                    IRP$L_SVAPTE перед вызовом драйверной прог-
                    раммы запуска ввод/вывод.  Драйверы  читают
                    это  значение  для  вычисления   начального
                    адреса передачи.
   UCB$W_BOFF
                        Для операций прямого ввода/вывода, сме-
                    щение в байтах  в  первой  странице  буфера
                    передачи.  Для   операций   буферизованного
                    ввода/вывода, количество байтов, требуемого
                    процессу для передачи.  IOC$INITIATE  копи-
                    рует   это   поле   из    пакета    запроса
                    ввода/вывода. Драйверы читают это поле  при
                    вычислении наначального адреса передачи  по
                    прямому доступу к памяти. Если часть  пере-
                    дачи выполнилась успешно, драйвер  устанав-
                    ливает в этом поле значение в виде смещения
                    в байтах в первой странице данных,  которые
                    не были переданы.
   UCB$W_BCNT
                        счетчик байтов в передаче ввода/вывода.
                    IOC$INITIATE копирует это  поле  из  пакета
                    запроса ввода/вывода. Драйверы  читают  это
                    поле, чтобы определить, сколько байтов сле-
                    дует передать в операции ввода/вывода.
   UCB$B_ERTCNT
                        Счетчик повторений по ошибке в  текущей
                    передаче ввода/вывода.  Драйвер  устанавли-
                    вает в  этом  поле  максимальное  количесво
                    повторений каждый раз, при начале обработки
                    ввода/вывода.  Перед   каждым   повторением
                    драйвер уменьшает  значение  в  этом  поле.
                    если  зарегистрирована  ошибка,  IOC$REQCOM
                    копирует данное значеныие в буфер сообщений
                    об ошибках.
   UCB$B_ERTMAX
                        Максимальное количество  повторений  по
                    ошибке,   допустимое   в   одной   передаче
                    ввода/вывода. Прологовая таблица в  некото-
                    рых драйверах указывает значение для  этого
                    поля. Процедура загрузки драйвера заполняет
                    это поле при создании UCB. Если зарегистри-
                    рована ошибка, IOC$REOCOM  копирует  данное
                    значение в буфер сообщений об ошибках.
   UCB$W_ERRCNT
 
 
                            - 122 -
 
                        00152-01 97 07-2
 
 
                                            Продолжение табл. 13
   -------------------------------------------------------------
                  I
        Поле      I              Содержимое
                  I
   -------------------------------------------------------------
                        Количество ошибок, которые возникали на
                    устройстве с момента загрузки системы. Про-
                    цедура загрузки драйвера инициализирует это
                    поле в 0 при создании UCB.  ERL$DEVICERR  и
                    ERL$DEVICTMO увеличивают  значение  в  этом
                    поле и копируют это значение в буфер  сооб-
                    щений об ошибках. Команда DCL  SHOW  DEVICE
                    распечатывает  в  колонке  счетчика  ошибок
                    значение,содержащееся в этом поле.
   UCB$L_PDT*
                        Адрес таблицы  дескриптора  порта.  Это
                    поле резервируется для  портовых  драйверов
                    МОС ВП.
   UCB$L_DDT*
                        Адрес  диспетчерской  таблицы  драйвера
                    для этого  устройства.  Процедура  загрузки
                    драйвера в это поле  записывает  содержимое
                    DDB$L_DDT при создании UCB.
 
        Блоки управления устройствами имеют переменную  длину,
 
   зависящую от типа устройства и от того, выполняет ли  драй-
 
   вер регистрации ошибок для устройсва.  Расширение  UCB  для
 
   регистрации  ошибок,  если  оно  присутствует,   появляется
 
   непосредственно после окончания стандартного UCB.
 
 
        Поля расширения UCB для регистрации ошибок  проиллюст-
 
   рированы на рис.14 и описаны в табл. 14.
 
 
             Расширение UCB для регистрации ошибок
 
   -----------------------------------------------------------
   : UCB$B_CEX : UCB$B_FEX      :  UCB$B_SPR  : UCB$B_SLAVE  :
   -----------------------------------------------------------
   :                     UCB$L_EMB*                          :
   -----------------------------------------------------------
   :      UCB$W_FUNC            :   не используется          :
   -----------------------------------------------------------
   :                     UCB$L_DPC                           :
   -----------------------------------------------------------
 
 
                            Рис. 14
 
 
 
 
 
 
                            - 123 -
 
                        00152-01 97 07-2
 
 
                                                      Таблица 14
              Расширение UCB для регистрации ошибок
 
   -------------------------------------------------------------
                I
      Поле      I           Содержимое
                I
   -------------------------------------------------------------
   UCB$B_SLAVE*
                        Номер устройства подчиненного  контрол-
                    лера.
   UCB$B_SPR
                        Пустой байт. Это поле резервируется для
                    использования драйвером.
   UCB$B_FEX
                        Поле, характерное для  устройства.  Это
                    поле резервируется для использования  драй-
                    вером.
   UCB$B_CEX
                        Поле, характерное для  устройства.  Это
                    поле резервируется для использования  драй-
                    вером.
   UCB$L_EMB*
                        Адрес буфера сообщений об ошибках. Если
                    разрешено регистрация  ошибок  и  возникает
                    ошибка устройства/контроллера или  таймаут,
                    драйвер    вызывает    ERL$DEVICERR     или
                    ERL$DEVICTMO для выделения буфера сообщений
                    об ошибках и  записи  адрес  буфера  в  это
                    поле. IOC$REQCOM записывает  заключительное
                    состояние  устройства,  счетчики  ошибок  и
                    состояние  запроса  ввода/вывода  в  буфер,
                    указанный в данном поле.
   UCB$W_FUNC
                        Модификаторы функций ввода/вывода. Дан-
                    ное поле читается и записывается  драйвера-
                    ми, которые регистрируют ошибки.
   UCB$L_DPC
                        Поле, характерное для  устройства.  Это
                    поле резервируется для использования  драй-
                    вером.
 
        Другим  расширением   блока   управления   устройством
 
   является блок дискового расширения. Данное  расширение  UCB
 
   присутствует для всех дисковых устройств.  Оно  расположено
 
   вслед за  расширением  для  регистрации  ошибок.  Драйверы,
 
   которые поддерживают диск, должны обеспечить пространство в
 
   UCB как для регистрации ошибок, так и для дисковых расшире-
 
   ний.
 
 
        Драйверы дисков используют  три  бита  в  UCB$W_DEVSTS
 
 
 
                            - 124 -
 
                        00152-01 97 07-2
 
 
   следующим образом:
 
 
   UCB$V_ECC     произведена коррекция есс.
 
   UCB$V_DIAGBUF указан диагностический буфер.
 
   UCB$V_NOCNVRT не производится преобразования номера логичес
 
                 кого блока в адрес на носителе.
 
 
        Поля иллюстрируются на рис. 15 и описываются  в  табл.
 
   15.
 
 
                 Расширение UCB для дисков
 
   ---------------------------------------------------------
   :резервировано :UCB$B_ONLCNT :      UCB$W_DIRSEQ        :
   ---------------------------------------------------------
   :                   UCB$L_MAXBLOCK                      :
   ---------------------------------------------------------
   :                   UCB$L_MAXBCNT                       :
   ---------------------------------------------------------
   :                   UCB$L_DCCB                          :
   ---------------------------------------------------------
 
 
                            Рис. 15
 
 
                                                      Таблица 15
                    Расширение UCB для дисков
 
   -------------------------------------------------------------
                I
      Поле      I                 Содержимое
                I
   -------------------------------------------------------------
   UCB$W_DIRSEQ
                         Число  последовательности   каталогов.
                    если в этом слове  установлен  старший  бит
                    UCB$V_AST_ARMED, то это указывает что  зап-
                    рошиваемый процесс блокирует AST.
   UCB$W_ONLCNT
                        Счетчик неавтономного  положения  этого
                    устройства после загрузки системы.
   UCB$L_MAXBLOCK
                        Максимальное количество логических бло-
                    ков на устройстве прямого доступом.  Данное
                    поле заполняется драйвером диска  во  время
                    инициализации устройства и при восстановле-
                    нии после сбоя питания.
   UCB$L_DCCB
                          Указатель    на    блок    управления
                    КЭШ-памятью.
 
 
 
                            - 125 -
 
                        00152-01 97 07-2
 
 
        Другим расширением для UCB  является  расширение,  для
 
   локального диска  используемое  дисками,  которые  являются
 
   локальными для процессора  в  отличие  от  дисков,  которые
 
   находятся в кластере с процессором.
 
 
        Это расширение UCB, если  присутствует,  располагается
 
   непосредственно за расширением UCB для дисков.
 
 
        Поля расширения UCB для локальных дисков иллюстрирова-
 
   ны на рис. 16 и описаны в табл. 16.
 
 
              Расширение  UCB для локальных дисков
 
   ---------------------------------------------------------
   :                    UCB$L_MEDIA                        :
   ---------------------------------------------------------
   :                    UCB$L_BCR                          :
   ---------------------------------------------------------
   :   UCB$W_EC2                :    UCB$W_EC1             :
   ---------------------------------------------------------
   : UCB$B_OFFRTC : UCB$B_OFFNDX:    UCB$W_OFFSET          :
   ---------------------------------------------------------
   :                    UCB$L_DX_BUF                       :
   ---------------------------------------------------------
   :                    UCB$L_DX_BFPNT                     :
   ---------------------------------------------------------
   :                    UCB$L_DX_RXDB                      :
   ---------------------------------------------------------
   :не используется:UCB$B_DX_SCTCNT:  UCB$W_DX_BCR         :
   ---------------------------------------------------------
 
 
                            Рис. 16
 
 
                                                      Таблица 16
               Расширение UCB для локальных дисков
 
   -------------------------------------------------------------
               I
     Поле      I                 Содержание
               I
   -------------------------------------------------------------
   UCB$L_MEDIA          Адрес на носителе.
   UCB$W_BCR
                        Регистр счетчика байтов. Некоторые дис-
                    ковые  драйверы  используют  это   поле   в
                    качестве  внутреннего  счетчика  количества
                    байтов, осоставшися для передачи по запросу
                    ввода/вывода.
   UCB$W_EC1
 
 
                            - 126 -
 
                        00152-01 97 07-2
 
 
                                            Продолжение табл. 16
   -------------------------------------------------------------
               I
     Поле      I                 Содержание
               I
   -------------------------------------------------------------
                        Регистр позиции есс. В этом поле  запи-
                    сан номер начального бита ошибки драйверной
                    подпрограммы дампа регистров, копируют  со-
                    держимое этого поля в  буфер   регистрации
                    ошибок или в диагностический буфер. Програ-
                    мма МОС ВП IOC$APPLYECC,    осуществляющая
                    рекцию, читает содержимое данного    поля,
                    чтобы локализовать начало появления  ошибки
                    дисковом блоке.
   UCB$W_EC2
                        Регистр позиции есс. Записывает  шаблон
                    коррекции по исключающему  "или".  Подпрог-
                    раммы  драйвера  диска,  производящие  дамп
                    регистров, копируют содержимое данного поля
                    в буфер регистрации ошибок или в диагности-
                    ческий   буфер.   Подпрограмма    МОС    ВП
                    IOC$APPLYECC        ,        осуществляющая
                    ЕСС-коррекцию, читает содержимое этого поля
                    для коррекции данных на диске.
   UCB$W_OFFSET
                        Текущее содержимое регистра смещения.
   UCB$B_OFFNDX
                        Текущий индекс таблицы смещений.  Когда
                    передача, осуществляемая  драйвером  диска,
                    заканчивается  с  ошибкой,  драйвер   может
                    попытаться повторить передачу несколько раз
                    с различными смещениями дисковой головки от
                    центральной линии. В  данном  поле  записы-
                    вается индекс таблицы драйвера,  содержащей
                    позиции смещения.
   UCB$B_OFFRTC
                        Текущий счетчик повторений смещения.  В
                    этом поле записывается  количество  попыток
                    установки данного смещения  при  повторении
                    передачи данных.
   UCB$L_DX_BUF
                         Адрес  буфера  сектора;   используется
                    драйвером гибких магнитных дисков.
   UCB$L_DX_BFPNT
                        указатель текущего сектора; использует-
                    ся драйвером гибких магнитных дисков.
   UCB$L_DX_DXDB
                        Адрес буфера для сохранения принимаемых
                    данных; используется драйверами гибких маг-
                    нитных дисков.
   UCB$W_DX_BCR
                        Текущий  счетчик  байтов.  Используется
                    драйверами гибких магнитных дисков.
   UCB$B_DX_SCTCNT
                         Текущий  счетчик  байтов  в   секторе;
                    используется  драйверами  гибких  магнитных
                    дисков.
 
 
 
                            - 127 -
 
                        00152-01 97 07-2
 
 
                                                  Приложение 2
 
 
              Макросы МОС ВП, вызываемые драйверами
 
 
 
        Приложение описывает макрокоманды МОС ВП, используемые
 
   драйверами. Необязательные параметры заключены в квадратные
 
   скобки. Значение, которое параметр принимает по  умолчанию,
 
   отделено от параметра знаком равенства (=).
 
 
         CASE
         ----
 
        Макрокоманда генерирует инструкцию CASE и связанную  с
 
   ней таблицу.
 
 
        Формат команды:
 
 
        CASE SRC,DISPLIST,[TYPE=W],[LIMIT=0],[NMODE=S^#]
 
 
   SRC         - источник  индексного  значения,  используемый
 
                 инструкцией CASE.
 
 
   DISPLIST    - список приемников, которым передается  управ-
 
                 ление в зависимости от индексного значения .
 
 
   TYPE        - тип данных источника SRC (B, W или L).
 
 
   LIMIT       - нижняя граница значения источника SRC.
 
 
   NMODE       - режим адресации, используемый для обращения к
 
                 записям CASE-таблицы;  по  умолчанию  исполь-
 
                 зуется режим короткого литерала,  что  позво-
 
                 ляет адресовать до ей.
 
 
 
                            - 128 -
 
                        00152-01 97 07-2
 
 
         DDTAB
         -----
 
        Макрокоманда генерирует диспедчерскую таблицу драйвера
 
   с именем DEVNAM$DDT.
 
 
        Формат команды:
 
 
        DDTAB     DEVNAM,[START=IOC$RETURN],-
 
                  [UNSOLICIT=IOC$RETURN],-
 
                  FUNCTAB,[CANCEL=IOC$RETURN], -
 
                  [REGDUMP=IOC$RETURN],-
 
                  [DIAGBUF=0],[ERLGBF=0], -
 
                  [UNITINIT=IOC$RETURN],-
 
                  [ALTSTART=IOC$RETURN],-
 
                  [MNTVER=IOC$MNTVER],-
 
                  [CLONEDUCB=IOC$RETURN]
 
 
   DEVNAM      - общее имя устройства.
 
 
   [START=IOC$RETURN]
 
               - адрес подпрограммы запуска ввода/вывода.
 
 
   [UNSOLIC=IOC$RETURN]
 
               - адрес программы обслуживания  незапланирован-
 
                 ных прерываний.
 
 
   FUNCTB      - адрес таблицы выбора функций.
 
 
   [CANCEL=IOC$RETURN]
 
               - адрес программы аннулирования ввода/вывода.
 
 
   [REGDMP=IOC$RETURN]
 
               - адрес программы дампа регистров.
 
 
   [DIAGBF=0]  - длина диагностического буфера (в байтах).
 
 
                            - 129 -
 
                        00152-01 97 07-2
 
 
   [ERLGBF=0]  - длина буфера регистрации ошибок (в байтах).
 
 
   [UNITINIT=IOC$RETURN]
 
               - адрес программы инициализациии устройства.
 
 
   [ALTSTART=IOC$RETURN]
 
               - адрес   альтернативной   программы    запуска
 
                 ввода/вывода.
 
 
   [MNTVER=IOC$MNTVER]
 
               - адрес  программы  проверки  монтирования.  По
 
                 умолчанию применима для дисковым устройств  с
 
                 одним потоком.
 
 
   [CLONEDUCB=IOC$RETURN]
 
               - адрес программы, вызываемой при  клонировании
 
                 UCB системным сервисом $ASSIGN.
 
 
         DPTAB
         -----
 
        Макрокоманда генерирует прологовую таблицу драйвера  в
 
   программной секции, названной $$$105_PROLOGUE.
 
 
        Формат команды:
 
 
        DPTAB     END,ADAPTER,[FLAGS=0],UCBSIZE,-
 
                  [UNLOAD],[MAXUNITS=8],[DEFUNITS=1],-
 
                  [DELIVER],[VECTOR],NAME
 
 
   END         - адрес конца драйвера.
 
 
   ADAPTER     - тип адаптера (UBA,MBA,DR или NULL).
 
 
   [FLAGS=0]   - флаги, используемые  при  загрузке  драйвера.
 
                 Флаги могут принимать следующие значения:
 
 
 
                            - 130 -
 
                        00152-01 97 07-2
 
 
            DPT$M_SVP  обозначает, что устройство требует
 
                       постоянно распределенной системной
 
                       страницы. Этот флаг указывает про-
 
                       цедуре загрузки драйвера на  необ-
 
                       ходимость выделяеть для устройства
 
                       элемент таблицы. Страниц   системы
 
                       вера  в постоянное пользование.
 
                       Системная процедура загрузки драй-
 
                       вера записывает виртуальный  адрес
 
                       элемента таблицы  страниц  системы
 
                       в поле системной   страницы    UCB
 
                       (UCB$L_SVPN) в  процессе  создания
 
                       UCB. Дисковые  драйверы используют
 
                       этот элемент таблицы во время кор-
 
                       ректировки ошибок ECC.
 
            DPT$M_     обозначает, что драйвер не может быть
 
            NOULOAD    перезагружен. Драйвер с установленным
 
                       битом может быть загружен только  при
 
                       загрузки системы.
 
 
   UCBSIZE     - размер блока управления устройством  (в  бай-
 
                 тах), запрашиваемый каждым устройством, кото-
 
                 рые обслуживает драйвер; это  поле  разрешает
 
                 драйверам  использовать  расширения  UCB  для
 
                 хранения  зависящих  от  устройства   данных,
 
                 которые описывает операцию ввода/вывода. Сум-
 
                 марная величина блока управления  устройством
 
                 (UCB) с расширениями может быть различна  для
 
                 каждого типа  драйвера.  Назначения  полей  в
 
                 расширенной части UCB об'ясняются в  драйвер-
 
 
 
                            - 131 -
 
                        00152-01 97 07-2
 
 
                 ных подпрограммах и подпрограммах ECC МОС ВП.
 
 
   UNLOAD      - адрес подпрограммы драйвера, которую вызывает
 
                 SYSGEN  перед  перезагрузкой  или   загрузкой
 
                 новой версии драйвера.  SYSGEN  вызывает  эту
 
                 подпрограмму,  когда   используется   команда
 
                 RELOAD.
 
 
   [MAXUNITS=8]
 
               - максимальное число устройств,  которые  могут
 
                 быть присоединены  к  контроллеру.  Это  поле
 
                 определяет размер IDB, создаваемого  командой
 
                 SYSGEN'а CONNECT. Если поле пропущено, то  по
 
                 умолчанию  выпускается  8  устройств.   Можно
 
                 изменить  содержимое  этого  поля,  используя
 
                 квалификатор /MAXUNITS в команде CONNECT.
 
 
   [DEFUNITS=1]
 
               - максимальное число блоков UCB, которые должны
 
                 быть созданы командой SYSGEN'а  AUTOCONFIGURE
 
                 (один UCB для каждого устройства, входящего в
 
                 конфигурацию). Устройства нумеруются с  0  по
 
                 DEFUNITS-1. Если указан аргумент DELIVER,  он
 
                 указывает имя подпрограмму, которую  вызывает
 
                 команда AUTOCONFIGURE, чтобы определить, соз-
 
                 давать ли автоматически структуры данных  для
 
                 каждого устройства.
 
 
   [DELIVER]   - адрес подпрограммы драйвера, которая  опреде-
 
                 ляет,  должно  ли  устройство   автоматически
 
                 включаться в конфигурацию подпрограммой  дос-
 
                 тавки  устройства.  Если   аргумент   опущен,
 
 
                            - 132 -
 
                        00152-01 97 07-2
 
 
                 команда  AUTOCONFIGURE  создает  число   уст-
 
                 ройств, указанное в DEFUNITS.
 
 
   [VECTOR]    - резервируется  для  DIGITAL;  адрес   вектора
 
                 передачи драйвера.
 
 
   NAME        - имя драйвера устройства.
 
 
         $DEF
         ----
 
        Драйверы используют этот макро  для  определения  поля
 
   структуры данных. Макрокоманда может использоваться  только
 
   в пределах действия макрокоманды $DEFINI.
 
 
        Формат команды:
 
 
        $DEF     SYM,[ALLOC],[SIZ]
 
 
   SYM         - символьное  имя,  с  помощью  которого  можно
 
                 обращаться к полю.
 
 
   [ALLOC]     - одна  из  следующих  директив  резервирования
 
                 памяти: .BLKB, .BLKW, .BLKL, .BLKQ или .BLKO.
 
                 Можно определить и второе символьное имя  для
 
                 этого же поля, используя  макро  $DEF  второй
 
                 раз сразу же после первого определения, опус-
 
                 кая параметр ALLOC во втором вызове.
 
 
   [SIZ]       - число резервируемых блоков памяти.
 
 
         $DEFEND
         -------
 
        Макрокоманда заканчивает действие DEFINI макрокоманды,
 
   тем самым завершая определение  полей  указанной  структуры
 
   данных.
 
 
 
                            - 133 -
 
                        00152-01 97 07-2
 
 
        Формат команды:
 
 
        $DEFEND     STRUC
 
 
   STRUC       - имя определяемой структуры.
 
 
         $DEFINI
         -------
 
        Макрокоманда инициирует определение структуры  данных.
 
   Макрокоманда $DEF используется для определения полей внутри
 
   этой структуры, а макрокоманда $DEFEND заканчивает  опреде-
 
   ление структуры.
 
 
        Формат команды:
 
 
        $DEFINI      STRUC,[GBL=LOCAL],[DOT=0]
 
 
   STRUC       - имя структуры  данных,  которая  должна  быть
 
                 определена.
 
 
   [GBL=LOCAL] - указывает, являются ли символы,  определенные
 
                 для этой  структуры  данных,  локальными  или
 
                 глобальными.  По   умолчанию   они   является
 
                 лональными. Для того, чтобы определить симво-
 
                 лы как глобальные, надо использовать в  ключе
 
                 GBL аргумент GLOBAL.
 
 
   [DOT=0]     - смещение от начала структуры данных до перво-
 
                 го определяемого поля. По умолчанию  смещение
 
                 равно 0.
 
 
         DPT_STORE
         ---------
 
        Макрокоманда, используемая в драйвере, указывает  сис-
 
   темной процедуре загрузки драйвера на необходимость  сохра-
 
 
 
                            - 134 -
 
                        00152-01 97 07-2
 
 
   нить значения в таблице или структуре данных.
 
 
        Формат команды:
 
 
        DPT_STORE     TYPE,OFFSET,OPER,EXP,POS,SIZE
 
 
   TYPE        - тип блока управления, который  будет  хранить
 
                 данные (DDB, UCB, ORB, CRB или IDB), или мет-
 
                 ку таблицы (INIT,REINIT или END).  Если  этот
 
                 аргумент  является  меткой  таблицы,  то  все
 
                 остальные аргументы не  разрешены  и  таблица
 
                 именуется DPT.
 
 
   OFFSET      - смещение с начала структуры данных, в которой
 
                 хранятся данные. Оно не  может  быть  больше,
 
                 чем 255 байтов.
 
 
   OPER        - тип операции хранения.  Если  аргументу  OPER
 
                 предшествует знак @, то аргумент  EXP  описы-
 
                 вает  адрес  данных,  с  которого  начинается
 
                 поле. Тип данных  может  принимать  следующие
 
                 значения:
 
 
             ключевое слово   значение
 
               B              байт
 
               W              слово
 
               L              длинное слово
 
               D              относительный адрес от начала
 
                              драйвера
 
               V              битовое поле 
                                           
 
   EXP         - значение, которое инициализирует  поле;  если
 
                 аргументу OPER  предшествует  знак  @,  тогда
 
 
 
                            - 135 -
 
                        00152-01 97 07-2
 
 
                 аргумент EXP есть адрес, по которому находит-
 
                 ся значение для инициализации поля.
 
 
   [POS]       - позиция  бита;  используется   только,   если
 
                 OPER=V.
 
 
   [SIZE]      - размер битового  поля;  используется  только,
 
                 если OPER=V.
 
 
        DSBINT
        ------
 
        Макрокоманда запрещает прерывания, возникающия на ука-
 
   занном уровне (или ниже) IPL, и  сохраняет  текущий  IPL  в
 
   указанном длинном слове.
 
 
        Формат команды:
 
 
        DSBINT     [IPL=31],[DST=-(SP)]
 
 
   [IPL=31]    - IPL, на котором прерывания блокируются.  Если
 
                 IPL не указан, то по умолчанию  IPL  =31,  на
 
                 котором все прерывания блокируются.
 
 
   [DST=-(SP)] - адрес слова, в  котором  сохраняется  текущий
 
                 IPL. Если приемник не определен,  то  текущий
 
                 IPL засылается в стек.
 
 
        ENBINT
        ------
 
        Макрокоманда разрешает прерывания на указанном IPL или
 
   IPL, хранящемся в стеке.
 
 
        Формат команды:
 
 
        ENBINT     [SRC=(SP)+]
 
 
 
 
                            - 136 -
 
                        00152-01 97 07-2
 
 
   [SRC=(SP)+] - адрес IPL, на котором разрешаются прерывания.
 
                 Если SCR не указан, то IPL выбирается из вер-
 
                 шины стека.
 
 
        $EQULST
        -------
 
        Макрокоманда определяет список  символических  имен  и
 
   присваивает значения этим символическим именам.
 
 
        Формат команды:
 
 
        $EQULST PREFIX,[GBL=LOCAL],INIT,[INCR=1],LIST
 
 
   PREFIX      - префикс, используемый при формировании симво-
 
                 лических имен, а VALUE - это значение,  прис-
 
                 ваиваемое символическому имени.
 
 
   [GBL=LOCAL] - сфера определения символического имени: LOCAL
 
                 (по умолчанию), или GLOBAL.
 
 
   INIT        - значение, присваиваемое первому символическо-
 
                 му имени в списке.
 
 
   [INCR=1]    - инкремент, на который увеличивается  значение
 
                 каждого последующего  символа  в  списке.  По
 
                 умолчанию - 1.
 
 
   LIST        - список определяемых символов. Каждый  элемент
 
                 списка может иметь одну из форм:
 
 
                 - SYMBOL, где SYMBOL - это строка,  добавляе-
 
                   мая к префиксу, формирующему  символическое
 
                   имя; значение присваивается  символическому
 
                   имени на основании значений INIT и INCR.
 
 
 
 
                            - 137 -
 
                        00152-01 97 07-2
 
 
                 - <SYMBOL,VALUE>, где SYMBOL  -  это  строка,
 
                   которая добавляется к префиксу при формиро-
 
                   вании символического имени.
 
 
        FORK
        ----
 
        Драйверы   используют   этот   макрокоманду,   вызывая
 
   EXE$VFORK, для создания форк-процесса, в контексте которого
 
   выполняется команды, следующие за вызовом макрокоманды.
 
 
        Формат команды:
 
 
        FORK
 
        Перед  вызовом  макро  необходимо,   чтобы
 
   регистры содержали следующие  значения:
 
        R3      - содержимое R3 для форк-процесса
 
        R4      - содержимое R4 для форк-процесса
 
        R5      - адрес форк-блока
 
        (SP)    - адрес возврата в драйвер
 
 
        FUNCTAB
        -------
 
        Макрокоманда генерирует элемент таблицы  выбора  функ-
 
   ции.
 
 
        Формат команды:
 
 
        FUNCTAB     [ACTION],CODES
 
 
   [ACTION]    - программа, которая вызывается, если код функ-
 
                 ции, указанной в запросе ввода/вывода, совпа-
 
                 дает с аргументом CODE в  этой  макрокоманды.
 
                 Если создаваемый элемент является первым  или
 
                 вторым в таблице, то этот аргумент не  должен
 
 
 
                            - 138 -
 
                        00152-01 97 07-2
 
 
                 указываться.
 
 
   CODES       - команда или команды, для  которых  вызывается
 
                 программа, указанная в первом аргументе  мак-
 
                 рокоманды. Команды  указываются  как  и  коды
 
                 функций ввода/вывода в  формате  IO$_XXX,  но
 
                 без префикса IO$.
 
 
        IFNORD
        ------
 
        Макрокоманда использует инструкцию PROBER для проверки
 
   доступности указанного участка памяти,  проверяя  доступ  к
 
   первому и последнему байту участка памяти.
 
 
        Если оба байта читаются в указанном режиме доступа, то
 
   макрокоманда передает управление по  адресу,  указанному  в
 
   третьем аргументе  этой  макрокоманды.  Иначе  макрокоманда
 
   передает управление следубщей по порядке инструкции.
 
 
        Формат команды:
 
 
        IFNORD     SIZ,ADR,DEST,[MODE=#0]
 
 
   SIZ         - смещение до последнего проверяемого байта  от
 
                 первого; число меньше или равно 512.
 
 
   ADR         - адрес первого проверяемого байта.
 
 
   DEST        - адрес,  по  которому  макрокоманда   передает
 
                 управление, если оба байта прочитаны.
 
 
   [MODE=#0]   - режим, в котором проверяется  доступ;  0,  по
 
                 умолчанию, указывает на проверку, выполняемую
 
                 в режиме,  содержащемся  в  поле  предыдущего
 
                 режима текущего PSL.
 
 
                            - 139 -
 
                        00152-01 97 07-2
 
 
        IFNOWRT
        -------
 
        Макрокоманда использует инструкцию PROBEW для проверки
 
   доступности указанного участка памяти, обращаясь к  первому
 
   и последнему байту этого участка.
 
 
        Если в указанные байты можно писать в указанном режиме
 
   доступа, то макрокоманда  передает  управление  по  адресу,
 
   указанному в третьем аргументе. Иначе управление передается
 
   на следующую по порядку инструкцию.
 
 
        Формат команды:
 
 
         IFNOWRT     SIZ,ADR,DEST,[MODE=#0]
 
 
   SIZ         - смещение от последнего до первого проверяемо-
 
                 го байта; это число должно  быть  меньше  или
 
                 равно 512.
 
 
   ADR         - адрес первого проверяемого байта.
 
 
   DEST        - адрес, по которому эта макрокоманда  передает
 
                 управление, если оба байта могут быть записа-
 
                 ны в указанном режиме доступа.
 
 
   [MODE=#0]   - режим, в котором проверяется доступ к байтам;
 
                 ноль, по умолчанию,  указывает  на  проверку,
 
                 выполняемую в режиме содержащемся в поле пре-
 
                 дыдущего режима текущего PSL.
 
 
        IFRD
        ----
 
        Макрокоманда проверяет доступность  указанной  области
 
   памяти, Oбращаясь к первому и последнему байту области.
 
 
 
 
                            - 140 -
 
                        00152-01 97 07-2
 
 
        Макрокоманда передает управление по указанному адресу,
 
   если область не доступная для  чтения  в  указанном  режиме
 
   доступа. Иначе управление передается следующей  по  порядке
 
   инструкции.
 
 
        Формат команды:
 
 
        IFRD     SIZ,ADR,DEST,[MODE=#0]
 
 
   SIZ         - смещение от первого до последнего проверяемо-
 
                 го байта; проверяются толбко первый и послед-
 
                 ний байт области.
 
 
   ADR         - адрес первого проверяемого байта.
 
 
   DEST        - адрес, которому макрокоманда передает  управ-
 
                 ление, если какой-либо  байт  не  может  быть
 
                 прочитан в указанном режиме доступа.
 
 
   [MODE=#0]   - режим, в котором проверяется  доступ  чтения;
 
                 ноль, по умолчанию,  указывает  на  проверку,
 
                 выполняемую в  режиме,  содержащемся  в  поле
 
                 предыдущего режима текущего PSL.
 
 
        IFWRT
        -----
 
        Макрокоманда проверяет доступность  указанной  области
 
   памяти, обращаясь к первому и последнему байту этой  облас-
 
   ти. Если указанная  область  на  доступна  для  записи,  то
 
   управление передается по указанному адресу.
 
 
        Формат команды:
 
 
        IFWRT     SIZ,ADR,DEST,[MODE=#0]
 
 
 
 
                            - 141 -
 
                        00152-01 97 07-2
 
 
   SIZ         - смещение от последнего до первого проверяемо-
 
                 го байта; проверяются только первый и послед-
 
                 ний байты области.
 
 
   ADR         - адрес первого проверяемого байта.
 
 
   DEST        - адрес, которому макрокоманда передает  управ-
 
                 ление, если какой-либо  байт  не  может  быть
 
                 записан в указанном режиме доступа.
 
 
   [MODE=#0]   - режим, в котором проверяется  доступ  записи;
 
                 по умолчанию, пользовательский режим.
 
 
        IOFORK
        ------
 
        Макрокоманда   вызывает   EXE$IOFORK   для    создания
 
   форк-процесса для драйвера  устройства.  Этот  макрокоманда
 
   очищает бит UCB$V_TIM в поле UCB$W_STS, что не делает  мак-
 
   рокоманда FORK.
 
 
        Формат команды:
 
 
         IOFORK
 
         Перед вызовом макрокоманды  следующие  регистры должн
 
   содержать следующие значения:
 
        R3     -   содержимое R3 для форк-процесса.
 
        R4     -   содержимое R4 для форк-процесса.
 
        R5     -   адрес UCB, который будет использоваться.
 
                   В качестве форк-блока создаваемого форк-
 
                   процесса.
 
        (SP)   -   адрес возврата в драйвер.
 
 
 
 
 
 
 
                            - 142 -
 
                        00152-01 97 07-2
 
 
        LOADUBA
        -------
 
        Макрокоманда вызывает IOC$LOADUBAMAP, чтобы  загрузить
 
   регистры  общей  шины.  Перед  вызовом  этой   макрокоманды
 
   регистры уже должны быть выделены.
 
 
        Формат команды:
 
 
         LOADUBA
 
         при вызове  макрокоманд регистр R5 должен  содержать
 
   UCB. Эта макрокоманда разрушает содержимое регистров R0-R2.
 
 
        PURDPR
        ------
 
        Макрокоманда  вызывает  IOC$PURDATAP,  чтобы  очистить
 
   путь данных.
 
 
        Формат команды:
 
 
         PURDPR
 
         перед  вызовом  макрокоманд  регистр  R5  должен  сод
 
   адрес UCB. Когда макро возвращает управление вызывающей
 
   подпрограмме, регистры содержат следующие значения:
 
 
           R0    -   состояние выполнения операции (успешная
 
                     или нет).
 
           R1    -   содержимое регистра пути данных,  пред-
 
                     назначено для использования  драйверной
 
                     подпрограммой дампа регистров.
 
           R2    -   адрес первого   регистра    отображение
 
                     предназначен для использования драйвер-
 
                     ной подпрограммой дампа регистров.
 
 
        Эта макрокоманда разрушает содержимое регистра R3.
 
 
 
                            - 143 -
 
                        00152-01 97 07-2
 
 
        RELCHAN
        -------
 
        Макрокоманда вызывает  IOC$RELCHAN,  чтобы  освободить
 
   все каналы данных (контроллеры), назначенные устройству.
 
 
        Формат команды:
 
 
         RELCHAN
 
 
        Перед вызовом макрокоманды, регистр R5  должен  содер-
 
   жать адрес UCB. Макрокоманда разрушает содержимое регистров
 
   R0-R2.
 
 
        RELDPR
        ------
 
        Макрокоманда вызывает IOC$RELDATAP,  чтобы  освободить
 
   регистр пути данных, назначенный драйверу.
 
 
        Формат команды:
 
 
         RELDPR
 
 
        Перед вызовом макрокоманды, регистр R5  должен  содер-
 
   жать адрес UCB. Макрокоманда разрушает содержимое регистров
 
   R0-R2.
 
 
         RELMPR
         ------
 
        Макрокоманда вызывает IOC$RELMAPREG, чтобы  освободить
 
   набор регистров отображения общей шины, назначенных драйве-
 
   ру.
 
 
        Формат команды:
 
 
         RELMPR
 
 
 
 
 
                            - 144 -
 
                        00152-01 97 07-2
 
 
        Перед вызовом макрокоманды, регистр R5  должен  содер-
 
   жать адрес UCB. Макрокоманда разрушет содержимое  регистров
 
   от R0 до R2.
 
 
        REQCOM
        ------
 
        Макрокоманда  вызывает  IOC$REQCOM,  чтобы   завершить
 
   обработку запроса  ввода/вывода  после  того,  как  драйвер
 
   заверит свою часть обработки.
 
 
        Формат команды:
 
 
         REQCOM
 
 
        Перед вызовом этого макрокоманды,  регистр  R5  должен
 
   содержать  адрес  UCB.  Макрокоманда  разрушает  содержимое
 
   регистров R0-R2.
 
 
        REQDPR
 
        ------
 
 
        Макрокоманда вызывает  IOC$REQDATAP,  чтобы  запросить
 
   канал данных адаптера общей шины.
 
 
        Формат команды:
 
 
         REQDPR
 
 
        Перед вызовом макрокоманды, регистры должны  содержать
 
   следующие значения:
 
 
         R5      -   адрес UCB.
 
         (SP)    -   адрес подпрограммы, передающей
 
   управление подпрограмме, вызывающей макрокоманду.
 
 
 
 
 
                            - 145 -
 
                        00152-01 97 07-2
 
 
        Макрокоманда разрушает содержимое регистров R0-R2.
 
 
        REQMPR
        ------
 
        Макрокоманда вызывает  IOC$REQMAPREG,  чтобы  получить
 
   регистры отображения общей шины.
 
 
        Формат команды:
 
 
        REQMPR
 
 
        Перед вызовом макрокоманд  регистры  должны  содержать
 
   следующие значения:
 
 
         R5  -       адрес UCB.
 
         (SP) -       адрес подпрограммы, передающей
 
                      управление подпрограмме,
 
                      вызывающей макрокоманде.
 
 
        Макрокоманда разрушает содержимое регистров R0-R2.
 
 
        REQPCHAN
        --------
 
        Макрокоманда вызывает IOC$REQPCHANH или  IOC$REQPCHANL
 
   в зависимости  от  указанного  приоритета,  чтобы  получить
 
   канал данных общей шины.
 
 
        Формат команды:
 
 
         REQPCHAN    [PRI]
 
 
   PRI         - приоритет запроса. Если  приоритет  HIGH,  то
 
                 макрокоманда  вызывает  IOC$REQPCHANH;  иначе
 
                 макрокоманда вызывает IOC$REQPCHANL.
 
 
        Перед вызовом макрокоманд  регистры  должны  содержать
 
 
 
                            - 146 -
 
                        00152-01 97 07-2
 
 
   следующие значения:
 
 
         R5    -      адрес UCB.
 
         (SP)   -      адрес подпрограммы, передающей
 
                       управление подпрограмме,
 
                       вызывающей макро.
 
 
        Макрокоманда разрушает содержимое регистров R0-R2.
 
 
        SAVIPL
        ------
 
        Макрокоманда сохраняет текущий IPL, взятый из  процес-
 
   сорного регистра PR$_IPL, в указанном месте или стеке.
 
 
        Формат команды:
 
 
        SAVIPL     [DEST=-(SP)]
 
 
   [DEST-(SP)] - адрес длинного слова, в  котором  сохраняется
 
                 текущий IPL; по  умолчанию  он  засылается  в
 
                 стек.
 
 
        SETIPL
        ------
 
        Макрокоманда устанавливает текущий IPL,  засылая  ука-
 
   занное значение в процессорный регистр PR$_IPL.
 
 
        Формат команды:
 
 
         SETIPL     [IPL=31]
 
 
   [IPL=31]    - уровень, на который  устанавливается  текущий
 
                 IPL; по умолчанию, IPL 31.
 
 
 
 
 
 
 
 
                            - 147 -
 
                        00152-01 97 07-2
 
 
        SOFTINT
        -------
 
        Макрокоманда засылает  указанный  IPL  в  процессорный
 
   регистр PR$_SIRR, запрашивая программное прерывание на этом
 
   IPL.
 
 
        Формат команды:
 
 
         SOFTINT     IPL
 
 
   IPL         - IPL, на котором происходит прерывание.
 
 
        TIMEWAIT
        --------
 
        Макрокоманда проверяет определенное состояние, опраши-
 
   вая биты в течение указанного промежутка времени.  Рекомен-
 
   дуется использовать макрокоманд TIMEDWAIT  вместо  макроко-
 
   манд TIMEWAIT.
 
 
        Если состояние наступает в течение указанного интерва-
 
   ла, то макрокоманда помещает код  успеха  в  регистр  R0  и
 
   возвращает управление вызвавшей программе.
 
 
        Если состояние не возникает  в  течение  определенного
 
   периода,  то  этот  макрокоманда  помещает  код  неудачи  в
 
   регистр R0 и возвращает управление вызывающей программе.
 
 
        Формат команды:
 
 
         TIMEWAIT TIME,BITVAL,SOURCE,CONTEXT,[SENSE=.TRUE.]
 
 
   TIME        - число 10-микросекундных интервалов для ожида-
 
                 ния.
 
 
   BITVAL      - маска, определяющая, какие биты опрашивать.
 
 
 
 
                            - 148 -
 
                        00152-01 97 07-2
 
 
   SOURCE      - адрес битов для опроса.
 
 
   CONTEXT     - контекст, в котором  опрашиваются  биты  (B,W
 
                 или L).
 
 
   [SENSE=.TRUE.]
 
               - если этот аргумент имеет значение .TRUE.,  то
 
                 проверить установлен ли хотя бы один из  ука-
 
                 занных битов; иначе, праверить  все  ли  биты
 
                 очищены.
 
 
        TIMEDWAIT
        ---------
 
        Макрокоманда определенный период времени ожидает  воз-
 
   никновения некоторого события или условия. Можно указать до
 
   шести инструкций выполняющихся в цикле,  чтобы  определить,
 
   произошло событие или нет.
 
 
        Макрокоманда не опрашивает процессорные часы. Интервал
 
   ожидания приблизителен и зависит от процессора и от  набора
 
   инструкций, выбранных для определения выполнения условий.
 
 
        Формат команды:
 
 
        TIMEDWAIT       TIME,[INS1],[INS2],[INS3],-
 
                        [INS4],[INS5],[INS6],
 
                        [DONELBL],-
 
                        [IMBEDLBL],[UBLBL]
 
 
   TIME        - число 10-микросекундных интервалов,  умножен-
 
                 ное на  значение,  зависящее  от  процессора,
 
                 дает интервал ожидания.  Значение,  зависящее
 
                 от процессора, обратно  пропорциональна  ско-
 
                 рости процессора, но не меньше единицы.  Если
 
 
                            - 149 -
 
                        00152-01 97 07-2
 
 
                 инструкции не указаны, надо увеличить  значе-
 
                 ние TIME на  25%.  Если  указанны  инструкции
 
                 которые требуют для выполнения больше некото-
 
                 рого среднего времени, такие  как  инструкция
 
                 POLYD, то TIMEDWAIT  будет  ждать  пропорцио-
 
                 нально больше.
 
 
   [INS1]      - первая инструкция в цикле.
 
 
   [INS2]      - вторая инструкция в цикле.
 
 
   [INS3]      - третья инструкция в цикле.
 
 
   [INS4]      - четвертая инструкция в цикле.
 
 
   [INS5]      - пятая инструкция в цикле.
 
 
   [INS6]      - шестая инструкция в цикле.
 
 
   [DONELBL]   - метка, помещаемая по адресу инструкции в кон-
 
                 це цикла вставленные инструкции  могут  пере-
 
                 дать управление этой метке,  чтобы  выполнить
 
                 переход на инструкцию, следующую  за  вызовом
 
                 макрокоманды TIMEDWAIT.
 
 
   [IMBEDLBL]  - метка, помещаемая по адресу первой инструкции
 
                 после  выполнения  процессором   определяемой
 
                 задержки макрокоманда передает сюда  управле-
 
                 ние для повторного проверки условия.
 
 
   [UBLBL]     - метка,  помещаеммая  по  адресу   инструкции,
 
                 которая выполняет спецификацию для процессора
 
                 задержку после каждого выполнения цикла инст-
 
                 рукций. Вставленные инструкции  могуть  пере-
 
 
 
                            - 150 -
 
                        00152-01 97 07-2
 
 
                 дать сюда управление, чтобы пропустить выпол-
 
                 нение остатка вложенных инструкций при данном
 
                 выполнении цикла.
 
 
        Макрокоманда возвращает код состояния (успех или  неу-
 
   дача) в R0. Она разрушает содержимое R1 и сохраняет  содер-
 
   жимое всех остальных регистров.
 
 
        $VIELD
        ------
 
        Макрокоманда определяет битовые  поля,  имена  которых
 
   имеют формат MOD$X_SYM, где X может быть V,S или M.
 
 
   Формат команды:
 
 
         $VIELD      MOD,INIBIT,FIELDS
 
 
   MOD         - модуль,  в  котором  определены  эти  битовые
 
                 поля; определяет префикс для символьного име-
 
                 ни.
 
 
   INIBIT      - бит внутри поля, являющийся базой для опреде-
 
                 ления положения битов.
 
 
   FIELDS      - один    или    более     полей     в     виде
 
                 <SYM,[SIZE=1],[MASK]>, где аргументы  опреде-
 
                 лены следующим образом:
 
 
              Аргумент       Значение
 
              SYM           Строка, добавляемая к строке
 
                            "MOD$" для формирования имени
 
                            битового поля.
 
              [SIZE=1]      Размер (в битах) битового поля.
 
              [MASK]        Символ M, если значение символа
 
 
 
                            - 151 -
 
                        00152-01 97 07-2
 
 
                            есть битовая маска, в противном
 
                            случае - пробел.
 
 
        _VIELD
        ------
 
        Макрокоманда определяет битовые  поля,  имена  которых
 
   имеют формат MOD_X_SYM, где X может быть V,S или M.
 
 
        Формат команды:
 
 
         _VIELD      MOD,INIBIT,FIELDS
 
 
   MOD         - модуль, в котором  определяется  это  битовое
 
                 поле; определяет префикс для символьного име-
 
                 ни.
 
 
   INIBIT      - бит внутри поля, принятый за базу при опреде-
 
                 лении положения битов.
 
 
   FIELDS      - одно  или  несколько   полей,   имеющих   вид
 
                 <SYM,[SIZE=1],[MASK]>,  где   эти   аргументы
 
                 определены следующим образом:
 
 
              аргумент       значение
 
              SYM         строка, добавляемая к строке "MOD_"
 
                          при формировании имени битового поля
 
              [SIZE]      размер (в байтах) этого битового пол
 
              [MASK]      символ M, если значение символа есть
 
                          битовая маска, в противном случае,
 
                          пробел.
 
 
        WFIKPCH
        -------
 
        Вызывая IOC$WFIKPCH, макрокоманда  заставляет  процесс
 
   ожидать прерывания  от  устройства.  Процесс  сохраняет  за
 
 
                            - 152 -
 
                        00152-01 97 07-2
 
 
   собой право владеть этим каналом (контроллером), пока нахо-
 
   дится в ожидании.
 
 
        Ожидание может закончиться успешным завершением, сбоем
 
   устройства  или  таймаутом.  Когда  происходит  прерывание,
 
   управление передается инструкции, следующей за  макрокоман-
 
   дой.
 
 
        Формат команды:
 
 
         WFIKPCH      EXCPT,[TIME=65536]
 
 
   EXCPT       - имя подпрограммы  обработки  таймаута;  адрес
 
                 этой  подпрограммы  должен  быть  в  пределах
 
                 65536 байтов от адреса вызова макрокоманды.
 
 
   [TIME=65536]
 
               - время (в секундах) ожидания прерывания, после
 
                 которого происходит таймаут устройства.
 
 
        Перед вызовом макрокоманды регистры  должны  содержать
 
   следующие значения:
 
 
          R5  -    адрес UCB.
 
         (SP) -    IPL, на котором управление передается
 
                   первой вызывающей подпрограмме.
 
         4(SP)-    адрес первой вызывающей  подпрограммы,
 
                   который передается управление.
 
 
        Макрокоманда разрушает содержимое регистров R0-R2.
 
 
        WFIRLCH
        -------
 
        Вызывая IOC$WFIRLCH, макрокоманда  заставляет  процесс
 
   ожидать прерывания  от  устройства.  Процесс  оставляет  за
 
 
                            - 153 -
 
                        00152-01 97 07-2
 
 
   собой право владеть каналом (контроллером) на время  ожида-
 
   ния.
 
 
        Ожидание может закончиться успешным завершением опера-
 
   ции на устройстве, сбоем устройства  или  таймаутом.  Когда
 
   произойдет прерывание,  управление  передается  инструкции,
 
   следующей за макрокомандой.
 
 
        Формат команды:
 
 
         WFIRLCH      EXCPT,[TIME=65535]
 
 
   EXCPT       - имя программы обработки таймаута  устройства;
 
                 адрес программы должен быть в пределах  65536
 
                 байтов от адреса, вызOва макрокоманды.
 
 
   [TIME=65535]
 
               - время (в секундах) ожидания прерывания, после
 
                 которого происходит таймаут устройства.
 
 
        Перед вызовом макрокоманды регистры  должны  содержать
 
   следующие значения:
 
 
         R5      -     адрес UCB.
 
        (SP)     -     IPL, на котором управление передается
 
                       первой вызывающей программе.
 
        4(SP)    -     адрес первой вызывающей  программы,
 
                       которой передается управление.
 
 
        Макрокоманда разрушает содержимое регистров R0-R2.
 
 
 
 
 
 
 
 
 
 
                            - 154 -
 
                        00152-01 97 07-2
 
 
                                                  Приложение 3
 
 
 
 
 
              Программы операционной системы МОС ВП
 
 
 
 
 
        В приложении описываются программы операционной систе-
 
   мы МОС ВП, которые используются драйверами устройств.
 
 
        В приложении приняты следующие соглашения:
 
 
        - поля, используемые для входных и выходныхданных,  не
 
   указываются;
 
 
        - предполагается, что содержимое регистров сохраняется
 
   если не указано противное;
 
 
        - IPL при выполнении: IPL, на котором программа выпол-
 
   няется, а не вызывается.
 
 
 
 
        COM$DELATTNAST
        --------------
 
        Модуль: COMDRVSUB
 
 
        Форк-процессы драйвера  вызывают  программу  COMDRVSUB
 
   для передачи всех блоков управления AST, связанных  с  ука-
 
   занным списком AST.
 
 
        Входные данные:
 
   Регистры          Содержимое
 
   R4              Адрес заголовка списка
 
   R5              Адрес блока управления устройством
 
 
 
 
                            - 155 -
 
                        00152-01 97 07-2
 
 
   Поля              Содержимое:
 
   -----               -----
 
 
        IPL при выполнении: IPL вызывающей программы.
 
 
        Программа удаляет все блоки AST из указанного списка и
 
   выставляет IPL$_QUEUEAST форк-процесса для установки каждо-
 
   го AST в очередь к соответствующему процессу.
 
 
        Выходные данные:
 
   Регистры           Содержимое
 
   -----                -----
 
   Поля               Содержимое
 
   -----                -----
 
   Заголовок списка   0
 
       IPL при завершении:    IPL вызывающей программы.
 
 
 
 
 
 
        COM$DRVDEALMEM
        --------------
 
        Модуль: COMDRVSUB
 
 
        Драйверы используют программу, для  освобождение  сис-
 
   темной динамической памяти. Программа может быть вызвана на
 
   любом IPL.
 
 
        Входные данные:
 
   Регистры               Содержимое
 
   R0                     Адрес блока, который должен быть
 
                          освобожден.
 
 
 
 
 
 
 
                            - 156 -
 
                        00152-01 97 07-2
 
 
        Поля              Содержимое
 
   IRP$W_SIZE             Размер блока в байтах.
 
        IPL при выполнении: IPL вызывающей программы и
 
   IPL$_QUEUEAST.
 
 
        Если размер блока  меньше,  чем  24  байта,  или  блок
 
   неверно выровнен, то возникает системная ошибка.  Программа
 
   также вызывает SCH$RAVAIL для того, чтобы отметить  свобод-
 
   ные ресурсы.
 
 
         IPL при завершении: IPL вызываюшей программы.
 
 
 
 
 
 
        COM$FLUSHATTNS
        --------------
 
        Модуль: COMDRVSUB
 
 
        Программы FDT и форк-программы драйвера  вызывают  эту
 
   программу, чтобы заполнить список AST. Драйверы  используют
 
   эту программу при отмене операции ввода/вывода.
 
 
        Входные данные:
 
   Регистры                 Содержимое
 
   R4                       Адрес текущего РСВ.
 
   R5                       Адрес UCB.
 
   R6                       Номер назначенного канала.
 
   R7                       Адрес заголовка списка блока
 
                            управления AST.
 
   Поля                     Содержимое
 
   UCB$B_DTPL               IPL устройства
 
   PCB$L_PID                ID просесса.
 
   PCB$W_ASTCNT             AST, оставшиеся в квоте.
 
 
                            - 157 -
 
                        00152-01 97 07-2
 
 
        IPL  при выполнении: IPL устройства (UCB$B_DIPL).
 
 
        COM$FLUSHATTNS определяет все  блоки  управления,  для
 
   которых номер канала и идентификатор процесса совпадают  со
 
   значениями, указанными при вход в программу, удаляет их  из
 
   указанного списка и перераспределяет их.  Программа  завер-
 
   шается путем передачи управления в вызвавшую программу.
 
 
        Выходные данные:
 
   Регистры                Содержимое
 
   R0                      SS$NORMAL
 
   R1                      Разрушено.
 
   R2                      Разрушено.
 
   R7                      Разрушено.
 
   Поля                    Содержимое
 
   PCB$W_ASTCNT            Количество дополнительных ACB
 
                           ( добавленных к предыдущему
 
                           содержимому).
 
   Заголовок списка        Изменен.
 
        IPL при завершении: IPL вызывающей программы.
 
 
 
 
 
 
        COM$POST
        --------
 
        Модуль: COMDRVSUB
 
 
        Драйверы вызывают эту программу после  того,  KAK  они
 
   завершили всю машинно-зависимую постобработку  ввода/вывода
 
   для запроса ввода/вывода. Программа вставляет пакет запроса
 
   ввода/вывода в очередь на постобработку и возвращает управ-
 
   ление форк-процессу драйвера. COM$POST выполняется  незави-
 
 
 
                            - 158 -
 
                        00152-01 97 07-2
 
 
   симо от устройства. Она не пытается убрать из очереди  дру-
 
   гой пакет ни изменить состояние занятости устройства. Драй-
 
   веры могут  использовать  эту  программу,  чтобы  завершить
 
   обработку запросов ввода/вывода, инициированных  с  помощью
 
   программы EXE$ALTQUEPKT.
 
 
        Входные данные:
 
   Регистры              Содержимое
 
   R3                    Адрес пакета запроса ввода/вывода.
 
   R5                    Адрес блока управления устройством.
 
   Поле                  Содержимое
 
   IRP$L_MEDIA           Данные, копируемые в блок состояния
 
                         ввода/вывода.
 
   IRP$L_MEDIA+4         Данные,копируемые в блоки состояния
 
                         ввода/вывода.
 
        IPL при выполнении: IPL вызывающей программы(форк-IPL)
 
                            (IPL драйвера или выше).
 
 
        Программа помещает пакет запроса ввода/вывода  в  оче-
 
   редь которую указывает IOC$GL_PSBL.
 
 
        Выходные данные:
 
   Регистры                Содержимое
 
   R0 - R1                 Разрушено.
 
   Поля                    Содержимое
 
   UCB$L_OPCNT             Увеличено на 1.
 
        IPL при завершении: IPL вызывающей программы.
 
 
 
                            - 159 -
 
                        00152-01 97 07-2
 
 
 
 
        COM$SETATTNAST
        --------------
 
        Модуль: COMDRVSUB
 
 
        Программы FDT  драйвера  вызывают  эту  программу  для
 
   того, чтобы разрешить или запретить AST, в  зависимости  от
 
   содержимого параметра R1 очереди ввода/вывода.  AST  разре-
 
   шается, если R1 содержит  адрес  программы  AST.  Программа
 
   выделяет блок управления, который может  использоватся  как
 
   блок управления AST, когда AST выдается.  Этот  управляющий
 
   блок содержит следующую информацию:
 
 
        - адрес программы AST;
 
        - параметр AST;
 
        - режим доступа;
 
        - номер канала;
 
        - идентификатор вызванного процесса.
 
 
        COM$SETATTNAST присоединяет данный управляющий блок  к
 
   началу указанного связного списка  блоков  управления  AST,
 
   размещенного в области  расширения  блока  управления  уст-
 
   ройством.
 
 
        Если R1 очищен, программа запрещает AST. Она  просмат-
 
   ривает список, выделяя каждую запись и перераспределяет ее.
 
 
        Входные данные:
 
   Регистры                 Содержимое
 
   R3                       Адрес IRP.
 
   R4                       Адрес текущего РСВ.
 
   R5                       Адрес UCB.
 
   R6                       Адрес назначенного блока
 
 
                            - 160 -
 
                        00152-01 97 07-2
 
 
                            управления каналом.
 
   R7                       Адрес заголовка блока управления
 
                            AST.
 
   AP                       Адрес списка параметров QIO.
 
 
 
   Поля                     Содержимое
 
   IRP$W_CHAN               Номер канала запроса ввода/вывода.
 
   UCB$B_DIPL               IPL устройства.
 
   PCB$W ASTCNT             Число оставшихся AST в квоте
 
                            процесса.
 
   PCB$L_PID                Идентификатор процесса.
 
   0(AP)                    Адрес AST процесса.
 
   4(AP)                    Параметр AST процесса.
 
   8(AP)                    Режим доступа для AST.
 
        IPL при выполнении: IPL вызвавшей программы и IPL
 
                            устройства.
 
 
        Если   процесс   превышает   квоту   буферезированного
 
   ввод/вывод или AST, или если нет памяти доступной для выде-
 
   ления блока управления AST, программа  передает  управление
 
   EXE$ABORTIO со состоянием ошибки.
 
 
        Если  R1   очищен,   программа   передает   управление
 
   COM$FLUSHATTNS, чтобы  удалить  указанный  блок  управления
 
   AST. При  завершении  управление  передается  в  вызывающую
 
   программу.
 
 
        Выходные данные:
 
   Регистры                 Содержимое
 
   R0                 SS$_NORMAL (при успешном  завершении)
 
                      SS$_EXQUOTA
 
 
 
                            - 161 -
 
                        00152-01 97 07-2
 
 
                      SS$_INSFMEM.
 
   R1 - R2            Разрушено.
 
   R3                 Адрес IRP.
 
   R5                 Адрес UCB.
 
   R6 - R8            Разрушено.
 
 
 
   Поля                     Содержимое
 
   PCB$W_ASTCNT       Уменьшено на 1.
 
   Заголовок списка   изменен.
 
        IPL при завершении: IPL вызвавшей программы.
 
 
 
 
 
 
        ERL$DEVICERR
        ------------
 
        Модуль: ERRORLOG
 
 
        Программа регистрирует ошибки контроллера  и/или  уст-
 
   ройства. Эта программа выделяет буфер сообщений об  ошибках
 
   и записывает данные из пакета запроса ввода/вывода и  блока
 
   управления устройством. Программа также вызывает драйверную
 
   программу дампа регистров устройства.
 
 
        Входные данные:
 
   Регистры              Содержимое
 
   R5                    Адрес блока управления устройством.
 
 
        ERL$DEVICERR уставливает код типа  ошибки  для  ошибки
 
   устройства. Программа использует поля в  UCB,  DDB,  DDT  и
 
   пакет запроса ввода/вывода. ERL$DEVICERR предполагает,  что
 
   драйвер содержит программу  дампа  регистров.  ERL$DEVICERR
 
   использует DDT для  вычисления  адреса  программы  дампа  и
 
 
 
                            - 162 -
 
                        00152-01 97 07-2
 
 
   затем вызывает ее. Если в драйвере макрокомандой  DDTAB  не
 
   определена программа дампа  регистров,  то  DDTAB  содержит
 
   адрес  IOC$RETURN.  IOC$RETURN  -  программа  возврата,  не
 
   выполняет никаких действий.
 
 
        Выходные данные:
 
   Регистры                 Содержимое
 
    ---                        ---
 
   Поля                     Содержимое
 
   USB$L_EMB          Адрес буфера сообщений об ошибках.
 
   UCB$W_STS          Показывает состояние регистрации ошибки.
 
 
 
 
 
 
        ERL$DEVICTMO
        --------------
 
        Модуль: ERRORLOG
 
 
        Внесение тайм-аута устройств.
 
 
        Программа выполняет те же функции и использует  те  же
 
   входные и выходные данные, что и ERL$DEVICERR , за исключе-
 
   нием того, типом ошибки является тайм-аут устройства.
 
 
 
 
        EXE$ABORTIO
        -----------
 
        Модуль: SYSQIOREQ.
 
 
        FDT программы передают управление в  программу,  чтобы
 
   закончить операцию ввода/вывода без передачи конечного ста-
 
   туса ввода/вывода в  IOSB.  Программа  обнуляет  поле  IOSB
 
   пакета запроса ввода/вывода  и  включает  пакет  в  очередь
 
   пост-обработки ввода/вывода.
 
 
                            - 163 -
 
                        00152-01 97 07-2
 
 
        Входные данные:
 
   Регистры              Содержимое
 
   R0                Первое двойное слово состояния
 
                     для блока состояния ввода/вывода.
 
   R3                Адрес пакета запроса ввода/вывода.
 
   R4                Адрес текущего рсв.
 
   R5                Адрес UCB.
 
 
 
   Поля                  Содержимое
 
   ACB$V_QUOTA       Установлено в единицу (когда AST
 
   (B  IRP$B_RMOD)   определен)
 
        IPL при выполнении: IPL$_ASTDEL
 
 
 
        Выходные данные:
 
   Регистры              Содержимое
 
     ---                    ----
 
   Поля                  Содержимое
 
   IRP$L_IOSB            Нуль.
 
   ACB$V_QUOTA           Нуль (если поле было предварительно
 
   (в IRP$B_RMOD)        установлено).
 
   PCB$W_ASTCNT          Увеличено, если ACB$V_QUOTA
 
                         была установлена.
 
 
        EXE$ABORTIO помещает пакет запроса ввода/вывода в оче-
 
   редь постобработки на которую указывает IOC$GL_PSBL.
 
 
        IPL при завершении: нуль (IPL обычного процесса).
 
 
 
 
 
 
 
 
 
 
                            - 164 -
 
                        00152-01 97 07-2
 
 
        EXE$ALLOCBUF
        ------------
 
        Модуль: MEMORYALC
 
 
        Программы  FDT  вызывают  программу  EXE$ALLOCBUF  для
 
   того, чтобы выделить  буфер  для  операции  буферизованного
 
   ввода/вывода из нестраничного  системного  пула.  Программа
 
   может перевести процесс в состояние ожидания ресурсов, если
 
   достаточное пространство памяти не доступна и процессу раз-
 
   решен режим ожидания ресурсов. Вызывающая программа  должна
 
   регулировать квоты процесса.
 
 
        Входные данные:
 
   Регистры              Содержимое
 
   R1                    Размер запрашиваемого буфера
 
                         в байтах.
 
   R4                    Адрес текущего РСВ.
 
 
 
   Поля                  Содержимое
 
   PCB$V_SSRWAIT         1 или 0. Определяет, должен ли
 
                         процесс ждать, если нет доступной
 
                         памяти для запрошенного буфера.
 
                         Если это поле установлено, то режим
 
                         ожидания ресурсов запрещен.
 
 
        IPL при выполнении: IPL 11, IPL$_SYNCH и IPL, с  кото-
 
   рым программа вызвана.
 
 
        Выходные данные:
 
   Регистры               Содержимое
 
   R0                     SS$_NORMAL  (при удачном завершении)
 
                          SS$_INSFMEM
 
 
 
                            - 165 -
 
                        00152-01 97 07-2
 
 
   R1                     Размер выделенного буфера.
 
   R2                     Адрес выделенного буфера.
 
   R3                     Разрушено.
 
 
 
   Поля                   Содержимое
 
   IRP$W_SIZE             Размер буфера в байтах.
 
   (в выделенном буфере)
 
   IRP$B_TYPE             DYN$C_BUFIO
 
   (в выделенном буфере)
 
 
        IPL при завершении: IPL$_ASTDEL.
 
 
 
 
         EXE$ALLOCIRP
         -------------
 
        Модуль: MEMORYALC
 
 
        Программа выделяет пакет запроса ввода/вывода в  нест-
 
   раничной (динамической) памяти системы. Программа выполняет
 
   те же функции и имеет те же входные и выходные данные,  что
 
   EXE$ALLOCBUF , за следующими исключениями:
 
 
        - при вызове не определяется размер буфера;
 
        - выделенный буфер имеет длину IRP$C_LENGTH  байт;
 
        - размер буфера установлен в IRP$C_LENGTH;
 
        - тип буфера установлен в DYN$C_IRP.
 
 
 
 
 
 
        EXE$ALONONPAGED
        ---------------
 
        Модуль: MEMORYALC
 
 
 
 
 
                            - 166 -
 
                        00152-01 97 07-2
 
 
        Форк-процессы  драйвера  используют  программу,  чтобы
 
   выделить блок памяти из нестраничного системного пула.
 
 
        Заголовок блока не инициализируется.
 
 
        Входные данные:
 
   Регистры              Содержимое
 
   R1                    Размер запрашиваемого блока в байтах.
 
 
 
   Поле                  Содержимое
 
   -----                 -----
 
        IPL при выполнении: IPL вызывающей программы ( не
 
                            должен быть ниже IPL11) и IPL11.
 
        Выходные данные:
 
   Регистры              Содержимое
 
   R0               Код состояния (0 или 1)
 
   R1               Размер выделенного блока (запрашиваемый
 
                    размер, выровненный на следующие 16 байт)
 
   R2               Адрес выделенного блока.
 
   R3               Разрушено.
 
 
 
   Поля                  Содержимое
 
   -----                 -----
 
        IPL при завершении: IPL вызывающей программы.
 
 
 
         EXE$ALOPHYCNTG
         --------------
 
        Модуль MEMORYALC
 
 
        Драйверные форк-процессы используют эту программу  для
 
   выделения физически непрерывного блока в памяти. Надо отме-
 
   тить, что количество доступных SPT зависит от значения сис-
 
 
                            - 167 -
 
                        00152-01 97 07-2
 
 
   темного параметра SPTREQ.
 
 
        Память, выделяемая программой, не может быть перерасп-
 
   ределена.
 
 
      Входные данные:
 
      Регистры             Содержание
 
      R1                   Число физически непрерывных
 
                           страниц для размещения
 
 
 
      Поля                 Содержимое
 
      нет                    ----
 
 
        IPL в процессе выполнения: IPL при вызове (должны быть
 
   IPL$_SYNCH).
 
 
      Выходные данные:
 
      Регистры            Содержимое
 
      R0              Код состояния (SUCCESS, ISSFMEM
 
                      или INSFSPTS)
 
      R2              Системный виртуальный адрес выделенного
 
                      блока, если выделение прошло успешно.
 
 
        Содержимое всех других регистров сохраняется.
 
 
      Поля                      Содержимое
 
      --                           ----
 
 
        IPL при завершении: IPL вызывающей программы.
 
 
        EXE$ALTQUEPKT
        -------------
 
        Модуль: SYSQIOREQ
 
 
 
 
 
                            - 168 -
 
                        00152-01 97 07-2
 
 
        Драйверные  программы  FDT  и  форк-процессы  вызывают
 
   программу, чтобы послать пакет запроса ввода/вывода в  аль-
 
   тернативную программу запуска  ввода/вывода  с  тем,  чтобы
 
   обойти очередь запросов ввода/вывода.  EXE$ALTQUEPKT  посы-
 
   лает адрес пакета запроса ввода/вывода в драйвер независимо
 
   от состояния устройства.
 
 
        Входные данные:
 
   Регистры                Содержимое
 
   R3                    Адрес пакета запроса ввода/вывода.
 
   R5                    Адрес UCB.
 
 
 
   Поля                   Содержимое
 
   DDT$L_ALTSTART        Адрес альтернативной программы
 
                         ввода/вывода.
 
   UCB$B_FIPL            IPL драйвера.
 
   UCB$L_DDB             Адрес DDB устройства.
 
   DDB$L_DDT             Адрес диспетчерской таблицы  драйвера
 
        IPL при выполнении: UCB$L_FIPL
 
 
        Программа вызывает  альтернативную  программу  запуска
 
   ввода/вывода и возвращает управленеи вызывающей ее програм-
 
   ме.
 
 
        Выходные данные:
 
   Регистры               Содержимое
 
   R0 - R5                Разрушено.
 
 
 
   Поля                   Содержимое
 
   -----                  -----
 
        IPL при завершении: IPL вызывающей программы.
 
 
 
                            - 169 -
 
                        00152-01 97 07-2
 
 
        EXE$BUFFRQUOTA     
        --------------
 
        Модуль: EXSUBROUT
 
 
        Программы FDT  вызывают  программу,  чтобы  определить
 
   позволяет ли квота буферизованного счетчика байтов процесса
 
   воспользоваться ему буферизованным вводом/выводом.
 
 
        Программа может перевести процесс в состояние ожидания
 
   ресурсов, если использование квоты слишком велико и процес-
 
   су разрешен режим ожидания ресурсов.
 
 
        Входные данные:
 
   Регистры              Содержимое
 
   R1                  Число запрашиваемых байтов.
 
   R4                  Адрес PCB.
 
 
 
   Поля                   Содержимое
 
   PCB$V_SSRWAIT        Когда процесс превышает квоту,  опре-
 
                        деляет должен ли процесс находится в
 
                        состоянии ожидания. Если  это   поле
 
                        установлено, режим ожидания ресурсов
 
                        запрещен.
 
   IOC$GW_MAXBUF        Максимальное количество байтов буфери-
 
                        зованного ввода/вывода, которое систе-
 
                        ма предоставляет любому процессу.
 
   JIB$L_BYTLM          Предел счетчика байт процесса.
 
   JIB$L_BYTCNT         Используемая квота счетчика   байтов
 
                        процесса.
 
        IPL при выполнении: IPL вызывающей программы и
 
                            IPL$_SYNCH.
 
 
 
 
                            - 170 -
 
                        00152-01 97 07-2
 
 
        Выходные данные:
 
   Регистры               Содержимое
 
   R0                     SS$_NORMAL (при удачном завершении)
 
                          SS$_EXQUOTA
 
   R2 - R3                разрушено.
 
 
 
   Поля                   Содержимое
 
   -----                  -----
 
        IPL при завершении: IPL$_ASTDEL.
 
 
        EXE$BUFQUOPRC
        -------------
 
        Модуль: EXSUBROUT
 
 
        Программа выполняет те же функции и имеет тот же вход-
 
   ные и выходные данные, что и EXE$BUFFRQUOTA, за исключением
 
   того, что EXE$BUFQUOPRC не проверяет поле IOC$GW_MAXBUF.
 
 
        EXE$DEANONPAGED
        ---------------
 
        Модуль: MEMORYALC
 
 
        Программа освобождает блок памяти, включая его в нест-
 
   раничный системный пул. Программа выполняет те же функции и
 
   имеет те же входные и  выходные  данные,  что  и  программа
 
   COM$DRVDEALMEM, за следующими исключениями:
 
 
        - содержимое R3 разрушается;
 
        _ IPL вызываюшей программы должен быть IPL$_QUEUAST ил
 
        EXE$FINISHIO
        ------------
 
        Модуль: SYSQIOREQ
 
 
        Программы FDT  передают  управление  программе,  чтобы
 
 
 
                            - 171 -
 
                        00152-01 97 07-2
 
 
   закончить операцию ввода/вывода и передать конечное состоя-
 
   ние ввода/вывода (счетверенное слово)  в  процесс,  который
 
   запросил операцию ввода/вывода.
 
 
        Программа записывает конечное состояние ввода/вывода в
 
   пакет запроса ввода/вывода и устанавливает  его  в  очередь
 
   пост-обработки ввода/вывода.
 
 
        Входные данные:
 
   Регистры            Содержимое
 
   R0               Первое длинное слово состояния для блока
 
                    состояния ввода/вывода.
 
   R1               Второе длинное слово состояния для блока
 
                    состояния ввода/вывода.
 
   R3               Адрес пакета запроса ввода/вывода.
 
   R4               Адрес текущего блока управления процессом.
 
   R5               Адрес UCB.
 
        Выходные данные:
 
   Регистры            Содержимое
 
   R0               SS$_NORMAL
 
 
 
   Поля                Содержимое
 
   IRP$L_MEDIA      Первое длинное слово состояния ввода/вывод
 
                    (R0).
 
   IRP$L_MEDIA+4    Второе длинное слово состояния ввода/вывод
 
                    (R0).
 
   UCB$L_OPCNT      Увеличено на 1.
 
 
        Программа помещает пакет запроса ввода/вывода  в  оче-
 
   редь постобработки ввода/вывода, озаглавленную IOC$GL_PSBL.
 
 
 
 
 
                            - 172 -
 
                        00152-01 97 07-2
 
 
        EXE$FINISHIOC
        -------------
 
        Модуль: SYSQIOREQ
 
 
        Программа выполняет те же функции и имеет те же  вход-
 
   ные и выходные данные, что и EXE$FINISHIO,  за  исключением
 
   того, что EXE$FINISHIOC обнуляет содержимое R1 до того, как
 
   R0 и R1 запоминаются в пакете запроса ввода/вывода.
 
 
        EXE$FORK
        --------
 
        Модуль: FORKCNTRL
 
 
        Программа выполняет те же функции, что  и  EXE$IOFORK,
 
   за исключением того, что программа запрещает таймауты, очи-
 
   щая UCB$V_TIM в поле UCB$W_STS блока  управления  устройст-
 
   вом.
 
 
        EXE$INSERTIRP
        -------------
 
        Модуль: SYSQIOREQ
 
 
        Программа помещает пакет запроса ввода/вывода в  соот-
 
   ветствии с базовым приоритетом процесса, порождающего пакет
 
   запроса, в очередь ожидания ввода/вывода  блока  управления
 
   устройством.
 
 
        Входные данные:
 
   Регистры             Содержимое
 
   R2                   Адрес заголовка списка очереди ввода/
 
                        вывода для данного устройства.
 
   R3                   Адрес пакета запроса ввода/вывода.
 
   Поля                 Содержимое
 
   -----                -----
 
 
 
                            - 173 -
 
                        00152-01 97 07-2
 
 
        IPL при выполнении: IPL вызывающей программы
 
                            (форк-IPL или выше).
 
        Выходные данные:
 
   Регистры               Содержимое
 
   R1                     Разрушено.
 
 
        Программа помещает пакет запроса ввода/вывода  в  оче-
 
   редь и устанавливает код условия Z в PSL  ,  который  может
 
   иметь следующие значения:
 
 
        I указывает, что запись - первая в очереди;
 
 
        0 указывает, что по крайней мере одна запись уже  была
 
   в очереди.
 
 
        IPL при завершении: IPL вызывающей программы.
 
 
        EXE$INSIOQ
        ----------
 
        Модуль: SISQIOREQ
 
 
        Программа проверяет блок управления устройством.  Если
 
   устройство свободно, программа вызывает IOC$INITIATE,  если
 
   занято - EXE$INSERTIRP.
 
 
        Входные данные:
 
   Регистры             Содержимое
 
   R3                   Адрес пакета запроса ввода/вывода.
 
   R5                   Адрес  UCB.
 
   Поля                 Содержимое
 
   UCB$B_FIPL            Форк-IPL драйвера.
 
   UCB$V_BSY             Определяет, занято ли устройство.
 
   (B  UCB$W_STS)
 
   UCB$L_IOQFL          Адрес заголовка списка очереди
 
 
                            - 174 -
 
                        00152-01 97 07-2
 
 
                        устройства ввода/вывода.
 
       IPL при выполнении: форк-IPL.
 
       Выходные данные:
 
   Регистры             Содержимое
 
   R0 - R2              Разрушено.
 
 
        Если   вызывалась   драйверная    программа    запуска
 
   ввода/вывода,  то  регистры,  использовавшиеся  программой,
 
   также будут разрушены.
 
 
   Поля                 Содержимое
 
   UCB$V_BSY            Установлен в 1.
 
   ( B  UCB$W_STS)
 
        IPL при завершении: первоначальный IPL.
 
 
         EXE$INSTIMQ
         -----------
 
        Модуль: EXESUBROUT
 
 
        Программа вставляет элемент очереди таймера в  очередь
 
   таймера.  Элементы  упорядочиваются  по  времени  истечения
 
   интервала ожидания с учетом приоритетов.
 
 
        Входные данные:
 
   Регистры            Содержимое
 
   R0,R1          Счетверенное слово времени истечения
 
                  для нового элемента.
 
   R5             Адрес элемента таймера, помещаемого
 
                  в очередь.
 
       IPL при выполнении: IPL$_TIMER.
 
       Выходные данные:
 
   Регистры            Содержимое
 
   R2 - R3             Разрушено.
 
 
                            - 175 -
 
                        00152-01 97 07-2
 
 
       IPL при завершении: IPL$_TIMER.
 
 
       EXE$IOFORK
       ----------
 
        Модуль: FORKCNTRL
 
 
        Программа сохраняет содержимое R3 и R4  в  форк-блоке,
 
   определенном в R5. Программа считывает рс возврата из стека
 
   и помещает значение рс в  форк-блок.  EXE$IOFORK  вставляет
 
   адрес форк-блока в форк-очередь в соотвествии с IPL, запом-
 
   ненном в форк-блоке.
 
 
        Входные данные:
 
   Регистры            Содержимое
 
   R5                  Адрес форк-блока (обычно UCB).
 
   0(SP)               Адрес возврата в вызывающую программу.
 
   4(SP)               Адрес возврата в программу, вызвавшую
 
                       вызывающую программу.
 
   Поля                Содержимое
 
   FKB$B_FIPL          Форк IPL.
 
   (в форк блоке)
 
        IPL при выполнении: IPL вызывающей программы.
 
        Выходные данные:
 
   Регистры            Содержимое
 
   R3                  Разрушено.
 
   R4                  FKB$B_FIPL
 
   Поля                Содержимое
 
   VCB$V_TIM           Нуль.
 
   (B UCB$W_STS)
 
   FKB$L_FR3(в UCB)    R3
 
   FKB$L_FR4(B UCB)    R4
 
   FKB$L_FPC(B UCB)    0(SP)
 
 
                            - 176 -
 
                        00152-01 97 07-2
 
 
        Программа ставит в очередь,  озаглавленную  с  помощью
 
   SWI$GL_FQFL адрес UCB. Если  очередь  пуста,  запрашивается
 
   программное прерывание на форк IPL.
 
 
        IPL при завершении: IPL вызывающей программы.
 
 
        EXE$LCLDSKVALID
        ---------------
 
        Модуль: SYSQIOFDT
 
 
        Подпрограммы FDT дисковых драйверов вызывают  подпрог-
 
   рамму  для  обработки   запроса   на   выполнение   функций
 
   IO$_PACKACK, IO$_AVAILABLE или IO$_UNLOAD на локальном дис-
 
   ке и для помещения IRP в очередь UCB устройства  для  обра-
 
   ботки драйвером. Эта подпрограмма должна быть последней FDT
 
   программой, вызываемой в процессе обработки таких запросов.
 
 
        Если    запрашивается    функция     IO$_PACKACK     и
 
   UCB$V_LCL_VALID  не  установлен,  программа   устанавливает
 
   UCB$V_LCL_VALID, увеличивает UCB$B_ONLCNT и помещает IRP  в
 
   очередь для  обработки  драйвером,  осуществляя  переход  в
 
   EXE$QIODRVPKT. Если UCB$V_LCL_VALID установлен, подпрограм-
 
   ма вызывает EXE$FINISHIO.
 
 
        Если    запрашивается    функция    IO$_UNLOAD     или
 
   IO$_AVAILABLE и UCB$V_LCL_VALID установлен, программа  очи-
 
   щает UCB$V_LCL_VALID, уменьшает значение поля  UCB$B_ONLCNT
 
   и помещает IRP в  очередь  для  обработки  драйвером.  Если
 
   UCB$V_LCL_VALID   не   установлен,    программа    вызывает
 
   EXE$FINISHIO.
 
 
 
 
 
 
 
 
                            - 177 -
 
                        00152-01 97 07-2
 
 
      Входные данные:
 
    Регистры             Содержимое
 
    R3                 Адрес IRP
 
    R5                 Адрес UCB
 
    R7                 Номер бита, который представляет
 
                       код функции ввода/вывода
 
 
 
      Поля               Содержимое
 
    UCB$V_LCL_VALID   Если установлен,то том подтвержден. Если
 
    ( в UCB$L_STS )   нет - устройство разгружено или доступно
 
 
        IPL при выполнении: IPL вызывающей программы (  должен
 
   быть IPL$_ASTDEL).
 
 
        Выходные данные:
 
        Регистры                Содержимое
 
      R3                      Не сохраняется
 
      R4                      FKB$B_FIPL
 
 
 
        Поля                    Содержимое
 
   UCB$V_LCL_VALID       Если требуемая функция - IO$PACKACK,
 
                        этот бит установлен (в UCB$LSTS).
 
                         Если требуемая функция - IO$_UNLOAD
 
                        или IO$_AVAILABLE, этот бит сброшен.
 
   UCB$B_ONLCNT          Если запрашивалась функция
 
                        IO$PACKACK  и при входе в программу
 
                        бит UCB$V_LCK_VALID не был установлен,
 
                        значение этого поля увеличивается.
 
                         Если запрашивалось функция IO$_UNLOAD
 
                        или  IO$AVAILABLE, и при входе в прог-
 
                        рамму  UCB$V_LCL_VALID был установлен,
 
 
                            - 178 -
 
                        00152-01 97 07-2
 
 
                        значение этого поля уменьшается.
 
 
        Поскольку   эта    программа    передает    управление
 
   EXE$QIODRVPKT, если  требуется  драйверная  обработка,  или
 
   EXE$FINISHIO, если  дальнейшая  обработка  не  требуется  и
 
   выходхые данные не возвращаются в вызывающую подпрограмму.
 
 
        IPL: подпрограмма повышает IPL до IPL$_SYNCH.
 
 
        EXE$MODIFY
        ----------
 
        Модуль: SYSQIOFDT
 
 
        Программы FDT передают управление этой независящей  от
 
   устройства программе, чтобы проверить и подготовить пользо-
 
   вательский буфер для операции чтения/записи по прямому дос-
 
   тупу к памяти. Используя EXE$MODIFY вместо EXE$READ,  когда
 
   необходимо, чтобы драйвер читал и писал в буфер.
 
 
        EXE$MODIFY запрещает  использование  механизма  обмена
 
   страниц для операций записи.
 
 
        Программа выполняет следующие функции:
 
 
        - переводит функции логического чтения в функции физи-
 
   ческого чтения;
 
 
        - передает параметры очереди ввода/вывода в пакет зап-
 
   роса ввода/вывода;
 
 
        - проверяет, имеет ли  вызвавшая  программа  доступ  к
 
   указанному буферу;
 
 
        - блокирует страницы буфера в физической памяти.  Если
 
   в течение этой операции возникает ошибка,  программа  пере-
 
 
 
                            - 179 -
 
                        00152-01 97 07-2
 
 
   дает управление системной  программе  обслуживания  очереди
 
   запросов ввода/вывода, которая повторяет запрос.
 
 
        Входные данные:
 
   Регистры          Содержимое
 
   R3              Адрес пакета запроса ввода/вывода.
 
   R4              Адрес текущего РСВ.
 
   R5              Адрес UCB.
 
   R6              Адрес ССВ для канала, связанного с
 
                   устройством.
 
   R7              Номер бита кода функции ввода/вывода.
 
   R8              Адрес FDT записи.
 
   AP              Адрес первого функционально-зависимого
 
                   параметра QIO(PI).
 
   Поля              Содержимое
 
   0(AP)           Виртуальный адрес буфера (рI).
 
   4(AP)           Число байт в передаче (р2).
 
   12(ар)          Байт возврата управления (р4).
 
   IRP$W_FUNC      Код функции ввода/вывода.
 
 
        IPL   при   выполнении:   IPL   вызывающей   программы
 
   (IPL$_ASTDEL).
 
 
        Если программа завершается успешно,  управление  пере-
 
   дается EXE$QIODRVPKT, в противном случае - EXE$ABORTIO.
 
 
        EXE$MODIFY не проверяет передачу на  нулевую  длину  и
 
   будет ставить в очередь IRP, указанный буфер нулевой  длины
 
   в UCB. Программа драйвера запуска ввода/вывода должна  про-
 
   верять буфера на нулевую длину, чтобы избежать их отображе-
 
   ния в пространство общей шины, так как попытки такого отоб-
 
   ражения приведут к системной ошибке.
 
 
                            - 180 -
 
                        00152-01 97 07-2
 
 
        Выходные данные:
 
   Регистры              Содержимое
 
   R0 - R2             Разрушено.
 
 
 
   Поля                  Содержимое
 
   IPP$B_CARCON        R4
 
   IRP$V_FUNC          1 (указывает функцию чтения)
 
   ( B IRP$W_STS )
 
   IRP$L_SYAPTE        Адрес записи таблицы страницы, которая
 
                       отображает первую страницу буфера.
 
   IRP$W_BCNT          Размер передачи в байтах.
 
       IPL при завершении: IPL вызвавшей программы.
 
 
        EXE$MODIFYLOCK
        --------------
 
        Модуль: SYSQIOFDT
 
 
        Программы FDT вызывают EXE$MODIFYLOCK, чтобы выполнить
 
   обработку буфера при передаче по прямому доступу к памяти.
 
 
        Программа определяет,  имеет  ли  вызвавшая  программа
 
   право доступа для записи к указанному  буферу  и  блокирует
 
   страницы буфера в памяти. Если при этом возникает  странич-
 
   ный отказ, то  программа  возвращает  управление  системной
 
   программе обслуживания очереди запросов ввода/вывода, кото-
 
   рая повторяет запрос.
 
 
        EXE$MODIFYLOCK используется вместо EXE$READLOCK, когда
 
   ожидается, что драйвер  будет  читать  и  писать  в  буфер.
 
   EXE$MODIFYLOCK запрещает использование  страничного  обмена
 
   при операцях записи.
 
 
 
 
 
                            - 181 -
 
                        00152-01 97 07-2
 
 
        Входные данные:
 
   Регистры            Содержимое
 
   R0                Начальный адрес  буфера.
 
   R1                Размер передачи в байтах.
 
   R3                Адрес пакета запроса ввода/вывода.
 
   R4                Адрес текущего рсв.
 
   R6                Адрес  ссв.
 
   Поля                Содержимое
 
   -----               -----
 
 
        IPL   при   выполнении:   IPL   вызыающей    программы
 
   (IPL$_ASTDEL).
 
 
        Если EXE$MODIFYLOCK  завершилась  успешно,  управление
 
   передается в  вызывавшую  программу,  в  противном  случае-
 
   EXE$ABORTIO.
 
 
        Выходные данные:
 
   Регистры              Содержимое
 
   R0                  SS$_NORMAL
 
   R1                  Адрес PTE, который отображает первую
 
                       страницу буфера.
 
   R2                  Разрушено.
 
   R3                  Адрес IRP.
 
   Поля                  Содержимое
 
   IRP$L_SVAPTE        Адрес рте, который отображает первую
 
                       страницу буфера.
 
   IRP$W_BCNT          Размер передачи в байтах
 
   IRP$V_FUNC          1(указывает функцию чтения).
 
   ( в IRP$W_STS)
 
 
 
 
 
                            - 182 -
 
                        00152-01 97 07-2
 
 
        IPL при завершении: IPL вызываюшей программы.
 
 
        EXE$MODIFYLOCKR
        ---------------
 
        Модуль: SYSQIOFDT
 
 
        Программа определяет, имеет ли процесс  право  доступа
 
   записи в запрошенный буфер, затем,  если  доступ  разрешен,
 
   программа блокирует страницы буфера в памяти. Если во время
 
   проверки или блокирования страниц возникла ошибка, програм-
 
   ма вызывает драйвер для наведения порядка в  QIO.  Драйверы
 
   используют EXE$MODIFYLOCKR, когда  они  должны  многократно
 
   блокировать   области   в   памяти   для   одного   запроса
 
   ввода/вывода, и затем  нужно  разблокировать  первоначально
 
   заблокированные области после аварийного завершения запроса
 
   ввода/вывода.
 
 
        Входные данные:
 
   Регистры            Содержимое
 
   R0                Начальный адрес буфера.
 
   R1                Длина буфера в байтах.
 
   R3                Адрес IRP.
 
   R4                Адрес РСВ текущего  процесса.
 
   R6                Адрес блока управления каналом.
 
   Поля                Содержимое
 
   ----                  -----
 
 
        EXE$MODYFYLOCKR может прервать выполнение в  следующих
 
   случаях:
 
 
        - ошибка контроля доступа  к  буферу;  в  этом  случае
 
   программа возвращает драйверу состояние SS$ACCVIO в R0;
 
 
 
 
                            - 183 -
 
                        00152-01 97 07-2
 
 
        - вызываювший процесс не  имеет  достаточного  предела
 
   рабочего набора для блокировки всех страниц буфера в  памя-
 
   ти. Программа возвращает состояние SS$INSFWSL в R0;
 
 
        Во время блокировки страниц в памяти возник страничный
 
   отказ. В этом случае программа возвращает 0 B R0.
 
 
        Если возникла любая из перечисленных  ситуаций,  прог-
 
   рамма передает управление драйверу, как сопрограмма с  сос-
 
   тоянием ошибки в R0. Содержимое  всех  остальных  регистров
 
   сохраняется.
 
 
        Драйвер   выполняет   необходимую   очистку    очереди
 
   ввода/вывода. Он выполняет всю обработку, которую не выпол-
 
   нила система, как часть обычной обработки очереди  запросов
 
   ввода/вывода при аварийном завершении. Драйвер должен  сох-
 
   ранить содержимое всех регистров, включая R0 и R1.
 
 
        Когда  драйвер  возвращает  управление,  выполняя  RSB
 
   инструкцию,  EXE$MODIFYLOCKR  аварийно   завершает   запрос
 
   ввода/вывода, если R0 содержит состояние  ошибки,  и  затем
 
   выполняет обработку, которая завершается в драйвере.
 
 
        Например:
 
 
          JSB   G^EXE$MODIFYLOCKR
 
          BLBS  BUF_LOSK_OK
 
 
 
   BUF_LOCK_FAIL:
 
          <навести порядок в QIO>
 
           RSB
 
   BUF_LOCK_OK:
 
          <продолжить QIO>
 
 
                            - 184 -
 
                        00152-01 97 07-2
 
 
        Если программа  завершается  успешно,  она  возвращает
 
   управление в вызвавшую ее программу.
 
 
        Выходные данные:
 
   Регистры              Содержимое
 
   R0                    SS$_NORMAL (1)
 
   R1                    Адрес РТЕ, который отображает
 
                         первую страницу буфера.
 
   R2                    Индикатор функции (установлен в 1).
 
   R3                    Адрес IRP.
 
   Поля                  Содержимое
 
   IRP$L_SVAPTE          Адрес РТЕ, который отображает
 
                         первую страницу буфера.
 
   IRP$W_BCNT            Размер передачи в байтах.
 
   IRP$M_FUNC            Установлен в 1.
 
   ( в IRPSW_FUNC)
 
 
        IPL при завершении: IPL вызывающей программы.
 
 
        EXE$ONEPARM
        -----------
 
        Модуль: SYSQIOFDT
 
 
        Независящая от устройцтва программа FDT, которая копи-
 
   рует единственный параметр QIO в пакет запроса ввода/вывода
 
   и вызывает EXE$QIODRVPKT.
 
 
        Входные данные:
 
   Регистры           Содержимое
 
   R3             Адрес пакета запроса ввода/вывода для теку-
 
                  щего запроса ввода/вывода.
 
   R4             Адрес блока управления текущего процесса.
 
   R5             Адрес блока управления устройством устройс-
 
 
                            - 185 -
 
                        00152-01 97 07-2
 
 
                  тва назначенного канала ввода/вывода,  опи-
 
                  санного пользователем.
 
   R6             Адрес блока управления каналом, который
 
                  описывает канал ввода/вывода процесса, опи-
 
                  санный пользователем.
 
   R7             Код функции ввода/вывода, описанной пользо-
 
                  вателем.
 
   R8             Адрес FDT записи.
 
   AP             Адрес первого функционально-зависимого  па-
 
                  раметра, описанного в пользовательском  за-
 
                  просе.
 
   Поля           Содержимое
 
   -----          -----
 
        Выходные данные:
 
   Регистры       Содержимое
 
   -----           -----
 
   Поля              Содержимое
 
   IRP$L_MEDIA(IRP)      р1
 
        IPL при завершении: IPL вызывающей программы.
 
 
        Программа завершает EXE$QIODRVPKT. Более подробно  эта
 
   программа описана в разделе 8.
 
 
        EXE$QIODRVPKT
        -------------
 
        Модуль: SYSQIOREQ
 
 
        Программы FDT вызывают эту программу для  того,  чтобы
 
   послать IRP в драйверную  программу  запуска  ввода/вывода.
 
   Программа вызывает EXE$INSIOQ и затем  передает  управление
 
   EXE$QIORETURN.
 
 
 
 
                            - 186 -
 
                        00152-01 97 07-2
 
 
        Входные данные:
 
   Регистры            Содержимое
 
   R3             Адрес пакета запроса ввода/вывода.
 
   R4             Адрес блока управления процесса.
 
   R5             Адрес блока управления устройством.
 
 
 
   Поля              Содержимое
 
   UCB$B_FIPL     IPL драйвера.
 
   UCB$V_BSY      Флаг "устройство занято".
 
   (в UCB$W_STS )
 
   UCB$L_IOQFL    Адрес заголовка списка очереди ввода/вывода.
 
 
 
 
        EXE$QIORETURN
        -------------
 
        Модуль: SYSQIOREQ
 
 
        Программа устанавливает код удачного завершения в  R0,
 
   понижает IPL до нуля  и  возвращает  управление  диспетчеру
 
   системного обслуживания.
 
 
        Входные данные:
 
   Регистры          Содержимое
 
   R0                SS$_NORMAL
 
        IPL при завершении: 0.
 
 
        Программа возвращает управление с  помощью  инструкции
 
   RET.
 
 
        EXE$READ
        --------
 
        Модуль: SYSQIOFDT
 
 
 
 
 
                            - 187 -
 
                        00152-01 97 07-2
 
 
        Независящая от устройства программа FDT, которая подт-
 
   верждает и подготавливает пользовательский буфер для опера-
 
   ции чтения по прямому доступу к памяти. Программа выполняет
 
   те же действия и имеет тот же входные  и  выходные  данные,
 
   что и EXE$MODIFY, с единственным исключением,  указанном  в
 
   описании EXE$MODIFY.
 
 
        EXE$READCHK
        -----------
 
        Модуль: SYSQIOFDT
 
 
        Программа проверяет  доступность  страниц  для  записи
 
   процессом. Эта программа записывает счетчик байтов передачи
 
   в пакет запроса ввода/вывода.
 
 
        Если запись не разрешена, программа передает  управле-
 
   ние EXE$ABORTIO,  которая  завершает  запрос  с  состоянием
 
   нарушения доступа. Если  EXE$READCHK  завершилась  успешно,
 
   управление   передается    программе,    которая    вызвала
 
   EXE$READCHK.
 
 
        Входные данные:
 
   Регистры          Содержимое
 
   R0                Адрес буфера.
 
   R1                Размер передачи в байтах.
 
   R3                Адрес пакета запроса ввода/вывода.
 
   Поля              Содержимое
 
   -----             -----
 
        IPL при выполнении: IPL вызывающей программы.
 
        Выходные данные:
 
   Регистры            Содержимое
 
   R0                Адрес буфера (при успешном завершении).
 
 
 
                            - 188 -
 
                        00152-01 97 07-2
 
 
   R1                Размер передачи в байтах.
 
   R2                1(индицирует чтение).
 
   R3                Адрес IRP.
 
 
 
   Поля                Содержимое
 
   IRP$W_BCNT        Размер передачи в байтах.
 
   IRP$V_FUNC        1(индицирует чтение).
 
   ( в IRP$W_STS )
 
        IPL при завершении: IPL вызывающей программы.
 
 
        EXE$READCHKR
        ------------
 
        Модуль: SYSQIOFDT
 
 
        Программа выполняет те же функции, что и  EXE$READCHK,
 
   за исключением того, что при возникновении ошибки она снова
 
   вызывает программу FDT драйвера ,  как  сопрограмму,  чтобы
 
   навести порядок в QIO. Более полное информация  в  описании
 
   процедур ошибок в EXE$MODIFYLOCKR.
 
 
        EXE$READLOCK
        ------------
 
        Модуль: SYSQIOFDT
 
 
        Программы FDT вызывают эту программу, чтобы  проверить
 
   доступность буфера и заблокировать пользовательский буфер в
 
   памяти для чтения данных по прямому доступу к памяти.
 
 
        Программа выполняет те же функции и имеет тот же  вход
 
   и выход, что и EXE$MODIFYLOCK, за исключением того, что она
 
   используется, когда драйвер выполняет только операцию  чте-
 
   ния.
 
 
 
 
 
                            - 189 -
 
                        00152-01 97 07-2
 
 
         EXE$READLOCKR
         -------------
 
        Модуль: SYSQIOFDT
 
 
        Программа определяет, имеет ли процесс право на доступ
 
   для записи в требуемые страницы буфера, и, если доступ раз-
 
   решен,  программа  блокирует   эту   страницы   в   памяти.
 
   EXE$READLOCKR выполняет те же функции и имеет тот же  вход-
 
   ные и выходные данные, что и EXE$MODIFYLOCKR.
 
 
        EXE$SENSEMODE
        -------------
 
        Модуль: SYSQIOFDT
 
 
        Независящая от устройства программа FDT, которая копи-
 
   рует зависящие от устройства  характеристики  из  UCB  уст-
 
   ройства в R1.
 
 
        Эта программа записывает код успешного завершения в R0
 
   и передает управление EXE$FINISHIO.
 
 
        Входные данные:
 
   Регистры           Содержимое
 
   R3             Адрес пакета запроса ввода/вывода для
 
                  текущего запроса ввода/вывода.
 
   R4             Адрес РСВ текущего процесса.
 
   R5             Адрес UCB устройства, связанного с указанным
 
                  пользователем каналом ввода/вывода процесса.
 
   R6             Адрес ССВ, который описывает указанный поль-
 
                  зователем кпнал ввода/вывода проуесса.
 
   R7             Номер бита кода функции ввода/вывода,
 
                  определенной пользователем.
 
   R8             Адрес отправки таблицы выбора функций.
 
 
 
                            - 190 -
 
                        00152-01 97 07-2
 
 
   AP             Адрес первого функционально-зависимого
 
                  параметра, описанного в запросе пользователя
 
   Поля               Содержимое
 
   UCB$L_DEVDEPEND  состояние, зависящее от устройства.
 
        IPL при выполнении: IPL вызывающей программы.
 
 
        Выходные данные:
 
   Регистры            Содержимое
 
   R0                SS$_NORMAL
 
   R1                Зависящие от устройства  характеристики,
 
                     скопированные из UCB$L_DEVDEPEND.
 
   Поля                Содержимое
 
   -----               -----
 
        IPL при завершении: IPL вызывающей программы.
 
 
        Дополнительная информация содержится в разделе 8.
 
 
        EXE$SETCHAR
        -----------
 
        Модуль: SYSQIOFDT
 
 
        Независящая от устройства программа FDT, которая запи-
 
   сывает квадрослово, адрес которого находится в параметре P1
 
   QIO, в блок управления  устройством.  Программа  записывает
 
   код  успешного  завершения  в  R0  и  передает   управление
 
   EXE$FINISHIO.
 
 
        Выходные данные:
 
   Регистры             Содержимое
 
   R3             Адрес IRP для текущего запроса ввода/вывода.
 
   R4             Адрес текущего РСВ.
 
   R5             Адрес UCB назначенного устройства.
 
   R6             Адрес ССВ, который описывает указанный
 
 
                            - 191 -
 
                        00152-01 97 07-2
 
 
                  канал ввода/вывода процесса.
 
   R7             Номер бита кода функции ввода/вывода.
 
   R8             Адрес диспетчера FDT.
 
   AP             Адрес первого функционально-зависимого
 
                  параметра QIO.
 
   Поля                 Содержимое
 
   0(AP)          Адрес новых характеристик нового устройства
 
                  (р1).
 
        IPL при выполнении: IPL вызывающей программы.
 
 
        Если программа не  может  быть  выполнена  по  причине
 
   того, что у пользователя отсутствует право доступа для чте-
 
   ния характеристик, то управление передается  EXE$ABORTIO  с
 
   состоянием нарушения доступа.
 
 
        Если EXE$SETCHAR  завершается  успешно,  она  передает
 
   управление EXE$FINISHIO.
 
 
        Выходные данные:
 
 
   Регистры         Содержимое
 
   R0           SS$_NORMAL (при удачном завершении);
 
                SS$_ACCVIO (при неудачном завершении).
 
   Поля               Содержимое
 
   UCB$B_DEVCLASS    0   байт квадрослова.
 
   UCB$B_DEVTYPE     1   байт квадрослова.
 
   UCB$W_DEVBUFSIZ   2   и 3   байты квадрослова.
 
   UCB$L_DEVDEPEND   4-7 байты квадрослова.
 
        IPL при завершении: IPL вызывающей программы.
 
 
 
 
 
 
 
 
                            - 192 -
 
                        00152-01 97 07-2
 
 
        EXE$SETMODE
        -----------
 
        Модуль: SYSQIOFDT
 
 
        Независящее от устройства программа FDT, которая запи-
 
   сывает квадрослово, адрес которого является параметр QIO, в
 
   пакет запроса ввода/вывода и вызвает EXE$QIODRVPKT.
 
 
        Входные данные:
 
   Регистры            Содержимое
 
   R3             Адрес пакета запроса ввода/вывода
 
                  для текущего запроса ввода/вывода.
 
   R4             Адрес рсв текущего процесса.
 
   R5             Адрес UCB устройства назначенного  канала
 
                  ввода/вывода процесса, определенного поль-
 
                  зователем.
 
   R6             Адрес ссв, описывающий канал ввода/вывода
 
                  процесса, указанного пользователем.
 
   R7             Номер бита кода функции ввода/вывода.
 
   AP             Адрес первого функционально-зависимого
 
                  параметра QIO.
 
   Поле           Содержимое
 
   р0(ар)         Адрес счетверенного слова характеристик
 
                  устройства.
 
        IPL при выполнении: IPL вызывающей программы.
 
 
        Если пользователь не имеет права  доступа  для  чтения
 
   квадрослова характеристик  устройства,  программа  передает
 
   управление EXE$ABORTIO с состоянием нарушения доступа.
 
 
        Если EXE$SETMODE  завершилась  успешно,  она  передает
 
   управление EXE$QIODRVPKT.
 
 
 
                            - 193 -
 
                        00152-01 97 07-2
 
 
        Выходные данные:
 
   Регистры             Содержимое
 
   R0              SS$_NORMAL  (при удачном завершении)
 
                   SS$_ACCVIO
 
   Поля                 Содержимое
 
   IRP$L_MEDIA     Первое двойное слово  квадрослова
 
                   характеристик устройства.
 
   IRP$L_MEDIA+4   Второе двойное слово  квадрослова
 
                   характеристик устройства.
 
        IPL при завершении: IPL вызывающей программы.
 
 
        Более полная информация об этой программе содержится в
 
   разделе 8 документа [2].
 
 
 
         EXE$SNDEVMSG
         ------------
 
        Модуль: MBDRIVER
 
 
        Форк-процессы драйверов вызывают эту программу,  чтобы
 
   послать сообщения в системные процессы, такие как орсом.
 
 
        Программа  формирует  сообщение  в  стеке  и  вызывает
 
   EXE$WRIMAILBOX, чтобы послать сообщения в почтовый ящик.
 
 
        Входные данные:
 
   Регистры              Содержимое
 
   R3               Адрес UCB почтового ящика.
 
   R4               Тип сообщения.
 
   R5               Адрес UCB.
 
   Поле                  Содержимое
 
   UCB$W_INIT       Номер устройства.
 
   UCB$L_DDB        Адрес DDB устройства.
 
 
 
                            - 194 -
 
                        00152-01 97 07-2
 
 
   DDB$T_NAME       Имя контроллера устройства.
 
   Поле UCB почтового ящика.
 
 
        IPL при выполнении: IPL вызывающей программы.  (должен
 
   быть не выше IPL$_MAILBOX или ниже).
 
 
        Программа может прервать выполнение процесса  в  одном
 
   из следующих случаев:
 
 
        - сообщение слишком велико для почтового ящика;
 
 
        - почтовый ящик переполнен;
 
 
        - система не может выделить память для сообщения;
 
 
        - программа, вызвавшая EXE$SNDEVMSG не имеет  привиле-
 
   гий для записи в почтовый ящик.
 
 
        Если возникает любое из выше приведенных условий ,  то
 
   EXE$SNDEVMSG  возвращает  вызывающей  программе   состояние
 
   ошибки.
 
 
        Если EXE$SNDEVMSG завершается успешно, то она  выходит
 
   по инструкции RSB.
 
 
        Выходные данные:
 
   Регистры           Содержимое
 
   R0            SS$_NORMAL (при удачном завершении),
 
                 SS$_MBTOOSML (если сообщение слишком
 
                 большое для почтового ящика),
 
                 SS$_MBFULL (почтовый ящик переполнен),
 
                 SS$_INSFMEM (если система не может
 
                 выделить память для сообщение),
 
                 SS$_NOPRIV (если нет права доступа).
 
 
 
                            - 195 -
 
                        00152-01 97 07-2
 
 
   R1 - R4       Разрушено.
 
   Поля               Содержимое
 
   ----                -----
 
       IPL при завершении: IPL вызывающей программы.
 
 
         EXE$WRITE
         ---------
 
        Модуль: SYSQIOFDT
 
 
        Независящее от устройства программа FDT, которая  про-
 
   веряет  достоверность  и  подготавливает   пользовательский
 
   буфер для DMA операции записи по прямому доступу к памяти.
 
 
        Программа выполняет те же функции и имеет те же  вход-
 
   ные и выходные данные, что и программа EXE$MODIFY.
 
 
        EXE$WRITECHK
        ------------
 
        Модуль: SYSQIOFDT
 
 
        Проверяет страницы на доступность чтения и  записывает
 
   количество байтов передачи в  пакет  запроса  ввода/вывода.
 
   Если страницы не доступны для  чтения,  программа  передает
 
   управление EXE$ABORTIO, которая завершает запрос с  состоя-
 
   нием  нарушения  доступа.  Если  EXE$WRITECHK   завершается
 
   успешно, она возвращает управление  программе,  которая  ее
 
   вызвала.
 
 
        Входные данные:
 
   Регистры          Содержимое
 
   R0           Адрес буфера.
 
   R1           Размер передачи в байтах.
 
   R3           Адрес пакета запроса ввода/вывода.
 
        IPL при выполнении: IPL вызывающей программы.
 
 
                            - 196 -
 
                        00152-01 97 07-2
 
 
        Выходные данные:
 
   Регистры          Содержимое
 
   R0           Адрес буфера (при успешном выполнении)
 
   R1           Размер передачи в байтах.
 
   R2           Очищен (указывает  функцию записи).
 
   R3           Адрес пакета запроса ввода/вывода.
 
   Поля              Содержимое
 
   IRP$W_BCNT   Размер передачи в байтах.
 
        IPL при завершении: IPL вызывающей программы.
 
 
         EXE$WRITECHKR
         -------------
 
        Модуль: SYSQIOFDT
 
 
        Программа выполняет те же функции, что и  EXE$WRITECHK
 
   за  исключением  того,   что   при   возникновении   ошибки
 
   EXE$WRITECHKR вызывает программу  FDT  драйвера  назад  как
 
   сопрограмму, для наведения порядка в QIO.
 
 
        Дополнительная информация об этой сопрограмме в описа-
 
   нии процедуры ошибки в EXE$MODIFYLOCKR.
 
 
        EXE$WRITELOCK
        -------------
 
        Модуль: SYSQIOFDT
 
 
        Программ  FDT  вызывают  программу,  чтобы  определить
 
   имеет ли вызывающая программа доступ к чтению буфера и бло-
 
   кирует буфер в памяти для записи данных по рпямому  доступу
 
   к памяти.
 
 
        Входные данные:
 
   Регистры           Содержимое
 
   R0            Начальный адрес буфера ввода/вывода.
 
 
                            - 197 -
 
                        00152-01 97 07-2
 
 
   R1            Длина передачи в байтах.
 
   R3            Адрес пакета запроса ввода/вывода.
 
   R4            Адрес РСВ.
 
   R6            Адрес ССВ.
 
   Поля               Содержимое
 
   ----                -----
 
 
        IPL   при   выполнении:   IPL   вызывающей   программы
 
   (IPL$_ASTDEL)
 
 
        Программа вызывает EXE$WRITECHK и MMG$IOLOCK.
 
 
        MMG$IOLOCK   блокирует   страницы   в   памяти.   Если
 
   EXE$WRITELOCK не может  быть  выполнена  из-за  страничного
 
   отказа во  время  выполнения  процедуры  блокирования,  она
 
   передает управление в системную программу обслуживания оче-
 
   реди  запросов  ввода/вывода,  которая   повторяет   запрос
 
   ввода/вывода.
 
 
        При  неуспешном  завершении   EXE$WRITELOCK   передает
 
   управление EXE$AWORTIO.
 
 
        Если программа завершилась без  возникновения  ошибки,
 
   она передает управление в программу, которая ее вызвала.
 
 
        Выходные данные:
 
   Регистры          Содержимое
 
   R0              SS$_NORMAL
 
   R1              Адрес рте, который отображает первую
 
                   страницу буфера.
 
   R2              Разрушено.
 
   R3              адрес IRP.
 
 
 
 
                            - 198 -
 
                        00152-01 97 07-2
 
 
   Поля               Содержимое
 
   IRP$L_SVAPTE    Адрес РТЕ, который отображает первую
 
                   страницу буфера.
 
   IRP$W_BCNT      Размер передачи в байтах.
 
   IRP$V_FUNC      0 (указывает функцию записи).
 
   (в IRP$W_STS)
 
        IPL при завершении: IPL вызывающей программы.
 
 
        EXE$WRITELOCKR
        --------------
 
        Модуль: SYSQIOFDT
 
 
        Программа определяет, имеет ли процесс право на доступ
 
   для чтения страниц запрашиваемого  буфера  и,  если  доступ
 
   разрешен, EXE$WRITELOCKR блокирует эти страницы  в  памяти.
 
   EXE$WRITELOCKR   выполняет   те   же   функции,    что    и
 
   EXE$MODIFYLOCKR со следующими исключениями:
 
 
        - R2 при выходе содержит  0,  что  индицирует  функцию
 
   записи;
 
 
        _ IRP$M_FUNC (B IRP$W_FUNC) 0, что индицирует  функцию
 
   записи.
 
 
        EXE$WRTMAILBOX
        --------------
 
        Модуль: MBDRIVER
 
 
        Форк-процессы драйверов вызывают программу  для  пере-
 
   сылки сообщений в почтовый ящик.
 
 
        Входные данные:
 
   Регистры          Содержимое
 
   R3            Размер сообщения.
 
 
 
                            - 199 -
 
                        00152-01 97 07-2
 
 
   R4            Адрес сообщения.
 
   R5            Адрес UCB почтового ящика.
 
   Поля              Содержимое
 
   Поля UCB почтового ящика.
 
 
        IPL при выполнении: IPL вызывающей  программы  (должен
 
   быть не выше IPL$MAILBOX или ниже).
 
 
        Программа возвращает код ошибки в  программу,  которая
 
   ее вызвала, если возникает одна из следующих ситуаций:
 
 
        - сообщение слишком велико для почтового ящика;
 
 
        - почтовый ящик переполнен;
 
 
        - система не может выделить память под сообщение;
 
 
        - программа, вызвавшая EXE$WRTMAILBOX, не имеет приви-
 
   легии для записи в почтовый ящик.
 
 
        Выходные данные:
 
   Регистры            Содержимое
 
   R0             SS$_NORMAL (при удачном завершении),
 
                  SS$_MBTOOSML (сообщение слишком большое
 
                  для почтового ящика),
 
                  SS$_MBFULL (почтовый ящик переполнен),
 
                  SS$_INSFMEM (невозможно выделить память
 
                  под сообщение),
 
                  SS$_NOPRIV (нет доступа для записи в
 
                  почтовый ящик).
 
   R1 - R2        Разрушено.
 
 
 
 
 
 
 
                            - 200 -
 
                        00152-01 97 07-2
 
 
        EXE$ZEROPARM
        ------------
 
        Модуль: SYSQIOFDT
 
 
        Независящее от устройства программа FDT, которая  очи-
 
   щает поле параметра IRP и вызывает EXE$QIODRVPKT.
 
 
        Входные данные:
 
   Регистры           Содержимое
 
   R3            Адрес пакета запроса ввода/вывода для
 
                 текущего запроса ввода/вывода.
 
   R4            Адрес блока управления процессом для
 
                 текущего процесса.
 
   R5            Адрес блока управления устройством для
 
                 устройства связанного с каналом ввода/вывода
 
                 процесса, указанного пользователем.
 
   R6            Адрес блока управления каналом, который
 
                 описывает канал ввода/вывода процесса,
 
                 указанный пользователем.
 
   Р7            Номер бита кода функции ввода/вывода.
 
   Р8            Адрес вьода в FDT .
 
   Ар            Адрес первого функционально-зависимого
 
                 параметра, указанного в пользовательском
 
                 запросе.
 
 
   Поля               Содержимое
 
   ----                -----
 
 
        IPL при выполнении: IPL вызывающей программы.
 
 
        Программа завершается с  помощью  передачи  управления
 
   EXE$QIODRVPKT.
 
 
 
 
                            - 201 -
 
                        00152-01 97 07-2
 
 
        Выходные данные:
 
   Регистры            Содержимое
 
   -----               -----
 
   Поля                Содержимое
 
   IRP$L_MEDIA         0
 
 
        IPL при завершении: IPL вызывающей программы.
 
 
        IOC$ALOUBAMAP(N)
        -----------------
 
        Модуль: IOSUBNPAG
 
 
        Программа просматривает карту битов регистров  отобра-
 
   жения в блоке управления  адаптера,  чтобы  выделить  набор
 
   смежных регистров отображениф для форк-процесса драйвера.
 
 
        Входные данные:
 
   Регистры           Содержимое
 
   R3             Количество регистров отображения (если
 
                  запись - IOC$ALOUBAMAPN).
 
   R5             Адрес UCB.
 
   Поля                Содержимое
 
   UCB$W_BCNT     Счетчик байт передачи (если запись -
 
                  IOC$ALOUBAMAP).
 
   UCB$W_BOFF     Байтовое смещения на странице (если
 
                  запись -IOC$ALOUBAMAP ).
 
   UCB$L_CRB      Адрес сRB.
 
   CRB$L_INTD+    Адрес блока управления адаптера устройства.
 
   VEC$L_ADP
 
   VEC$V_MAPLOCK  Биты, которые индициируют, постоянно
 
   (в CRB$L_INTD  ли выделены регистры отображения в
 
   +VEC$W_MAPREG) этом контроллере.
 
 
 
                            - 202 -
 
                        00152-01 97 07-2
 
 
   ADP$W_MRBITMAP Определяет какие регистры отображения
 
                  доступны.
 
 
        IPL при выполнении:  IPL  вызывающей  программы.  Если
 
   регистры отображения постоянно выделены для  данного  конт-
 
   роллера, то программа завершается удачно без  распределения
 
   регистров отображения. Иначе, программа просматривает карту
 
   распределения  регистров  отображения  для  поиска  нужного
 
   количества   смежных   регистров   отображения,    вызывает
 
   IOC$ALTUWAMAP и завершается по инструкции RSB.
 
 
        Выходные данные:
 
   Регистры            Содержимое
 
   R0              1 (удачное завершение) или 0 (недостаточно
 
                   смежных регистров отображения).
 
   R1 - R2         Разрушено.
 
   Поля                Содержимое
 
   CRB$L_INTD+     Количество выделенных регистров
 
   VEC$B_NUMREG    отображения.
 
   CRB$L_INTD+     Номер начального регистра отображения.
 
   VEC$W_MAPREG
 
   ADP$W_MRBITMAP  Биты для выделеных регистров отображения
 
                   установлены в  0.
 
 
        IPL при завершении: IPL вызывающей программы.
 
 
        IOC$APPLYECC
        ------------
 
        Модуль: IOCUBRAMS
 
 
        Драйверы диска вызывают эту программу, чтобы применить
 
   корекцию есс для данных, переданных из устройства в память.
 
   Программа корректирует данные с помощью операции "исключаю-
 
 
                            - 203 -
 
                        00152-01 97 07-2
 
 
   щее или" с кодом коррекции из блока управления устройством.
 
   Программа также устанавливает бит UCB, чтобы показать,  что
 
   есс коррекция произведена.
 
 
        Входные данные:
 
   Регистры            Содержимое
 
   R0              Число байт данных, которые переданы,
 
                   не включая блок для коррекции;
 
                   должно быть кратно 512 байт.
 
   R5              Адрес блока управления устройством.
 
   Поля                Содержимое
 
   UCB$W_BCNT      Длина передачи в байтах.
 
   UCB$W_EC1       Номер начального бита ошибки.
 
   UCB$W_EC2       Код коррекции.
 
   UCB$L_SVPN      Адрес элемента системной таблицы страниц,
 
                   для страницы, которая доступна для
 
                   использования в драйвере.
 
   UCB$L_SVAPTE    Виртуальный адрес элемента таблицы
 
                   страниц, который отображает передачу.
 
        IPL при выполнении: IPL вызывающей программы.
 
        Выходные данные:
 
   Регистры            Содержимое
 
   R0 - R2             Разрушено.
 
   Поля                Содержимое
 
   UCB$V_ECC           1 показывает, что есс коррекция
 
   (в UCB$W_DEVSTS )   была произведенна.
 
        IPL при завершении: IPL вызывающей программы.
 
 
        IOC$CANCELIO
        ------------
 
        Модуль: IOSUBNPAG
 
 
 
                            - 204 -
 
                        00152-01 97 07-2
 
 
        Независящая    от    устройства    программа    отмены
 
   ввода/вывода,    которая    устанавливает    биты    отмены
 
   ввода/вывода в блоке  управления  устройством,  если  пакет
 
   запроса ввода/вывода в данный момент  выполняемый  на  уст-
 
   ройстве, поступает из текущего процесса на указанный канал,
 
   а устройство занято.
 
 
        Входные данные:
 
   Регистры            Содержимое
 
   R2              Индексный номер  канала.
 
   R3              Адрес пакета запроса ввода/вывода.
 
   R4              Адрес текущего РСВ.
 
   R5              Адрес блока управления устройством.
 
   Поля                Содержимое
 
   IRP$L_PID       Идентификатор процесса, который поставил
 
                   в очередь запрос ввода/вывода.
 
   IRP$W_CHAN      Индексный номер  канала.
 
   PCB$L_PID       Идентификатор процесса, который запросил
 
                   отмену.
 
   UCB$V_BSY       Флаг "устройство занято"(в UCB$L_STS).
 
   (в UCB$W_STS)
 
 
        IPL при выполнении: IPL вызывающей программы.
 
        Выходные данные:
 
   Регистры            Содержимое
 
   -----                -----
 
   Поля                Содержимое
 
   UCB$V_CANCEL    Установлено, если запрос ввода/вывода
 
   (в UCB$W_STS)   должен быть отменен.
 
        IPL при завершении: IPL вызывающей программы.
 
 
 
 
                            - 205 -
 
                        00152-01 97 07-2
 
 
        IOC$DIAGBUFILL
        --------------
 
        Модуль: IOSUBNPAG
 
 
        Форк-процессы драйверов вызывают эту программу,  чтобы
 
   заполнить диагностический буфер, если QIO  указывает  такой
 
   буфер. Программа записывает время завершения и  окончатель-
 
   ное значение счетчика ошибок в буфер.  Она  также  вызывает
 
   драйверную программу дампа регистров, чтобы заполнить оста-
 
   ток буфера.
 
 
        Входные данные:
 
   Регистры            Содержимое
    
   R4              Адрес регистра команд и состояния.
 
   R5              Адрес блока управления устройством.
 
   Поля                Содержимое
 
   UCB$L_IRP       Адрес текущего IRP.
 
   IRP$V_DIAGBUF   Определяет наличие диагностического буяера.
 
   (вIRP$W_STS )   Если установлено - буфер  существует.
 
   IRP$L_DIAGWUF   Адрес диагностического буфера, если
 
                   он имеется.
 
   UCB$B_ERTCNT    Конечное значение счетчика ошибок.
 
   UCB$L_DDB       Адрес блока данных устройства.
 
   DDB$L_DDT       Адрес диспетчерской таблицы драйвера.
 
   DDT$L_REGDAMP   Адрес драйверной программы дампа регистров.
 
   EXE$GQ_SYSTIME  Текущее системное время (время завершения
 
                   запроса ввода/вывода).
 
        IPL при выполнении: IPL вызывающей программы.
 
 
        Программа сохраняет системное время и конечное  значе-
 
   ние счетчика ошибок в  диагностическом  буфере.  Затем  она
 
   вызывает драйверную программу дампа регистров и завершается
 
 
                            - 206 -
 
                        00152-01 97 07-2
 
 
   инструкцией RSB.
 
 
        Выходные данные:
 
   Регистры            Содержимое
 
   R0-R1           Разрушено
 
   R2              Адрес DDT
 
   R3              Адрес пакета запроса ввода/вывода
 
   R4              Регистр CSR устройства
 
   R5              Адрес блока управления устройством
 
   Поля                Содержимое
 
   -----               -----
 
        IPL при завершении: IPL вызывающей программы.
 
 
        IOC$INITIATE
        ------------
 
        Модуль: IOSUBNPAG
 
 
        Программа запускает форк-процессы драйвера  для  обра-
 
   ботки пакета запроса ввода/вывода.
 
 
        Программа записывает адрес пакета запроса ввода/вывода
 
   и параметры передачи из пакета запроса ввода/вывода в  блок
 
   управления устройством. Она также  очищает  биты  состояния
 
   устройства. Если QIO определяет диагностический  буфер,  то
 
   программа записывает системное время  в  буфер.  Она  также
 
   выполняет инструкцию JMP для передачи управления  программе
 
   запуска ввода/вывода.
 
 
        Входные данные:
 
   Регистры            Содержимое
 
   R3              Адрес пакета запроса ввода/вывода.
 
   R5              Адрес блока управления устройством.
 
 
 
 
                            - 207 -
 
                        00152-01 97 07-2
 
 
   Поля                Содержимое
 
   IRP$L_SVAPTE    Адрес системного буфера (для буферизован-
 
                   ного ввода/вывода) или адрес PTE, который
 
                   отображает буфер процесса
 
                   (для прямого ввода/вывода).
 
   IRP$W_BOFF      Байт смещения начала буфера.
 
   IRP$W_SIZE      Размер передачи в байтах.
 
   IRP$V_DIAGBUF   Определяет наличие диагностического буфера.
 
   (в IRP$W_STS )  Это поле установлено, если буфер существует
 
   IRP$L_DIAGBUF   Адрес диагностического буфера, если он
 
                   существует.
 
   EXE$GQ_SYSTIME  Текущее системное время (начало обработки
 
                   ввода/вывода).
 
   UCB$L_DDB       Адрес DDB.
 
   UCB$L_DDT       Адрес DDT.
 
   DDT$L_START     Адрес программы запуска ввода/вывода
 
        IPL при выполнении: IPL вызывающей программы.
 
 
        IOC$INITIATE завершается переходам в драйверную  прог-
 
   рамму начала ввода/вывода адрес которой определен в диспет-
 
   черской таблице драйвера.
 
 
        Выходные данные:
 
   Регистры            Содержимое
 
   R0- R1             Разрушено
 
   Поля                Содержимое
 
   UCB$L_IRP          Адрес начала пакета запроса ввода/вывода
 
   UCB$L_SVAPTE       IRP$L-SVAPTE
 
   UCB$W_BOFF         IRP$W-BOFF
 
   UCB$W_BCNT         IRP$W-BCNT
 
   UCB$V_CANCEL        0
 
 
                            - 208 -
 
                        00152-01 97 07-2
 
 
   (B UCB$W_STS)
 
   UCB$V_TIMOUT        0
 
   (B UCB$W_STS )
 
   Диагностический    Текущее системное время (первое
 
   буфер              квадрослово).
 
        IPL при завершении: IPL вызывающей программы.
 
 
        IOC$IOPOST
        ----------
 
        Модуль: IOCIOPOST
 
 
        Программа обслуживания прерывания,  которая  обрабаты-
 
   вает пакеты запроса ввода/вывода  в  очереди  постобработки
 
   ввода/вывода. Программа получает управление, когда  процес-
 
   сор  разрезает   программное   прерывание   на   уровне   с
 
   IPL$-IOPOST.
 
 
        Для  каждой  записи  очереди,   программа   регулирует
 
   использование квот и разблокирует страницы или  освобождает
 
   буферы записи. Программа ставит в очередь AST режима  ядра,
 
   чтобы  скопировать  окончательное  состояние  ввода/вывода,
 
   скопировать  данные  буферизованного  чтения  и  освободить
 
   буфера чтения. Программа AST режима ядра ставит  в  очередь
 
   AST режима пользователя, если это указано в QIO.
 
 
        Когда очередь постобработки пуста,  IOC$IOPOST  откло-
 
   няет прерывание.
 
 
        Входные данные:
 
   Регистры            Содержимое
 
   -----               -----
 
   Поля                Содержимое
 
   IOC$GL_PSFL     Начало очереди постобработки ввода/вывода.
 
 
                            - 209 -
 
                        00152-01 97 07-2
 
 
                   программа использует это поле, для
 
                   определения полей в IPP.
 
   IRP$L_PID       Идентификатор процесса, который
 
                   инициировал запрос ввода/вывода. Программа
 
                   использует это поле, для определения РСВ.
 
        IPL при выполнении: IPL$_IOPOST; IPL$_ASTDEL.
 
 
        IOC$IOPOST производит разные результаты для прямого  и
 
   буферизованного  ввода/вывода.  Для  прямого   ввода/вывода
 
   программа разблокирует страницы, заблокированные для запро-
 
   са  ввода/вывода,  и  устанавливает  флаг  события  очереди
 
   ввода/вывода.  Разблокированные  страницы  включают   любые
 
   страницы, описанные в дискрипторах области  расширения  IRP
 
   (если IRPE существует).
 
 
        Для функций чтения буферизованного ввода/вывода  прог-
 
   рамма копирует данные из системного буфера в буфер  процес-
 
   са, освобождая затем системный буфер. Программа также уста-
 
   навливает флаг события очереди ввода/вывода, если это  зап-
 
   рашивалось.
 
 
        Для прямого и буферизованного ввода/вывода  IOC$IOPOST
 
   выполняет следующие действия:
 
 
        - копирует диагностический буфер из системы  в  прост-
 
   ранство процесса и освобождает системный буфер;
 
 
        - копирует  состояние  завершения  ввода/вывода  (если
 
   требуется) из пакета запроса ввода/вывода в блок  состояния
 
   ввода/вывода процесса;
 
 
        - ставит AST в очередь к процессу, если оно было  зап-
 
   рошено;
 
 
                            - 210 -
 
                        00152-01 97 07-2
 
 
        - освобождает IRP и любые расширения IRP.
 
 
        IOC$LOADUBAMAP(A)
        -----------------
 
        Модуль: LOADMREG
 
 
        Форк-процессы драйвера для передачи по прямому доступу
 
   к памяти вызывают программу для загрузки регистров  отобра-
 
   жения общей шины, требующихся для текущей передачи с  номе-
 
   ром физической страницы, номером путей  данных,  дальнейшей
 
   возможности доступа к двойному слову.
 
 
        Программа подтверждает, что было выделено  достаточное
 
   количество регистров отображения и устанавливает  последний
 
   регистр отображения недействительным для того, чтобы  оста-
 
   новить неправильную передачу.
 
 
        Входные данные:
 
   Регистры            Содержимое
 
   R5                  Адрес UCB.
 
 
        Путь данных и регистры отображения уже выделены.
 
 
   Поля                Содержимое
 
   UCB$W_BOFF      Смещение для первого байта в первой
 
                   странице передачи.
 
   UCB$W_BCNT      Число байт в передаче.
 
   UCB$L_CRT       Адрес блока запроса канала контролера.
 
   VEC$B_DATAPATH  Номер выделенного пути данных.
 
   VEC$V_LWAE      Определяет длину буферизации. Установлено,
 
   (в CRB$L_INTD+  если буферизация - двойное слово вместо
 
   VEC$B_DATAPATH) счетверенного.
 
   CRB$L_INTD+     Количество выделенных регистров
 
 
 
                            - 211 -
 
                        00152-01 97 07-2
 
 
   VEC$L_NUMREG    отображения.
 
   CRB$L_INTD+     Адрес блока управления адаптера.
 
   VEC$L_NUMREG
 
   UBA$L_MAP       Адрес первого регистра отображения общей
 
                   шины.
 
   UCB$L_SVAPTE    Адрес элемента таблицы страниц
 
                   для первой страницы передачи.
 
        Выходные данные:
 
   Регистры            Содержимое
 
   R0 - R2             Разрушено
 
   Поля                Содержимое
 
   Выделенные     Разряд байтового смещения установлен для
 
   регистры       входа IOC$LOADUBAMAP (никогда не установлен
 
   отображения    для IOC$LOADUBAMAP(A) ).
 
        IPL при завершении: IPL вызывающей программы.
 
 
        IOC$MOVFRUSER
        --------------
 
        Модуль BUFFERCTL
 
 
        Программа пересылает строку из буфера  пользователя  в
 
   буфер драйвера в системной области.
 
 
      Входные данные:
 
    Регистры                  Содержимое
 
      R1                Адрес буфера драйвера
 
      R2                Число байтов для передачи
 
      R5                Адрес UCB
 
 
 
    Поля                      Содержимое
 
    ---                         ----
 
 
 
 
                            - 212 -
 
                        00152-01 97 07-2
 
        IPL в процессе выполнения:  IPL  вызывающей  программы
 
   (должна быть форк IPL) выходные данные: строка переслана  в
 
   буфер драйвера.
 
   Регистры            Содержимое
   -------             --------
 
   Поля                Содержимое
   ----                -------

       IPL при завершении: IPL вызывающей программы (форк IPL)

 
        IOC$MOVFRUSER2
        --------------
 
        Модуль BUFFERCTL
 
        Программа пересылает строку из пользовательского буфе-
 
   ра в буфер драйвера в системную область.  Программа  приме-
 
   няется для пересылки блоков данных  частями,  начинающимися
 
   чаще всего в пределах страницы, а не на ее границах. Снача-
 
   ла драйвер  вызывает  IOC$MOVFUSER.  Для  каждой  следующей
 
   пересылающей части драйвер вызывает расматриваемую програм-
 
   му.
 
      Входные данные:
 
      Регистры                  Содержимое
 
   R0                        Адрес первого байта
 
                             в пересылаемой строке
 
   R1                        Адрес буфера драйвера
 
   R5                        Число пересылаемых байтов
 
      Поля                      Содержимое
      ----                      ----
 
        IPL в процессе выполнения:  IPL  вызываемой  программы
 
   (должна быть вызвана при форк IPL) выходные данные:  строка
 
   переслана в буфер драйвера. Регистры содержимое ---  --поля
 
   Регистры          Содержимое
   -----             -----
 
 
                            - 213 -
 
                        00152-01 97 07-2
 
 
  Поля               Содержимое  
  ----               ----

  IPL при завершении: IPL вызываемой программы (форк IPL)
 
 
        IOC$MOVTOUSER
        --------------
 
        Модуль BUFFERCTL
 
        Подпрограмма пересылает строку из  буфера  драйвера  в
 
   системной области в пользовательский буфер. Драйвер  должен
 
   затребовать страницу буфера в DPT перед вызовом подпрограм-
 
   мы.
 
      Входные данные:
 
      Регистры                  Содержимое
 
   R1                        Адрес буфера драйвера
 
   R2                        Число пересылаемых байтов
 
   R5                        Адрес UCB
 
      Поля                      Содержимое
 
       -                          ---

        IPL в процессе выполнения:  IPL  вызываемой  программы
 
   (должен быть форк-IPL).
 
 
     Выходные данные:
 
     Регистры                   Содержимое
 
      ---                          ---
 
     Поля                       Содержимое
 
      -                             ---
 
     IPL  при выходе: IPL вызываемой программы (форк IPL).
 
 
        IOC$MOVTOUSER2
        --------------
 
        Модуль BUFFERCTL

        Программа пересылает строку из буфера драйвера в  сис-
 
 
 
                            - 214 -
                            
                        00152-01 97 07-2
 
 
   темной области в  пользовательский  буфер.  Драйвер  должен
 
   затребовать страницу буфера в DPT перед вызовом этой  подп-
 
   рограммы. Подпрограмма  применяется  для  пересылки  блоков
 
   данных частям, начинающимися в пределах страницы, а  не  на
 
   ее границах. Сначала драйвер  вызывает  IOC$MOVTOUSER.  Для
 
   каждой  следующей  части  драйвер   вызывает   подпрограмму
 
   IOC$MOVTOUSER2.
 
 
      Входные данные:
 
      Регистры                  Содержимое
 
   R1                        Адрес буфера драйвера
 
   R2                        Число пересылаемых байтов
 
   R5                        Адрес UCB
 
      Поля                      Содержимое
 
       -                          ---
 
 
        IPL в процессе выполнения:  IPL  вызываемой  программы
 
   (должен быть форк IPL).
 
 
      Выходные данные:
 
      строка переслана в пользовательский буфер.
 
      Регистры                  Содержимое
 
       ---                        ---
 
      Поля                      Содержимое
 
      -                           ---
 
      IPL при выходе: IPL вызываемой программы (форк IPL).
 
 
 
 
        IOC$PURGDATAP
        -------------
 
        Модуль: LIOSUB
 
 
 
 
 
                            - 215 -
 
                        00152-01 97 07-2
 
 
        Драйверы устройств вызывают эту программу после  пере-
 
   дачи данных. IOC$PURGDATAP очищает буферизованный путь дан-
 
   ных адаптера общей шины так же, как для проверки, и сбрасы-
 
   вает ошибки, которые возникали во время передачи.
 
 
        Входные данные:
 
   Регистры            Содержимое
 
   R5                  Адрес UCB.
 
   Поля                Содержимое
 
   -----               -----
 
 
        IPL при выполнении: IPL вызывающей программы.
 
 
        Программа получает начало пространства регистров адап-
 
   тера общей шины, используя следующую цепочку указателей:
 
 
   UCB$L_CRT-->CRB$L_INTD+VEC$L_ADP-->ADP$L_CSR
 
 
        Программа извлекает номер пути данных вызвавшей  прог-
 
   раммы (буферизованных или прямых) из блока управления кана-
 
   ла. Затем,  программа  очищает  путь  данных  и  запоминает
 
   содержимое регистра пути данных в R1. IOC$PURGDATAP сбрасы-
 
   вает любые ошибки в регистре пути данных.  Программа  уста-
 
   навливает соответствующиее состояние в R0,  вычисляет  базу
 
   регистров отображения общей шины и записывает базу в R2.
 
 
        Очистка пути данных в 0 - законна и всегда завершается
 
   успешно.
 
 
        IOC$PURGDATAP изменяет содержимое регистров R0- R3, но
 
   сохраняет содержимое всех других регистров.
 
 
        Выходные данные:
 
   Регистры            Содержимое
 
 
                            - 216 -
 
                        00152-01 97 07-2
 
 
   R0              Младший бит установлен при удачном
 
                   завершении, и сброшен в противном случае.
 
   R1              Содержимое пути данных после очистки
 
                   (для программы дампа регистров).
 
   R2              Адрес начала регистров отображения
 
                   общей шины (для программы дампа регистров)
 
   R3              Адрес CRB.
 
   Поля                Содержимое
 
   -----               -----
 
        IPL при завершении: IPL вызывающей программы.
 
 
        IOC$RELCHAN
        -----------
 
        Модуль: IOSUBNPAG
 
 
        Форк-процессы драйверов вызывают эту программу,  чтобы
 
   освободить канала  данных  контроллера,  назначенного  уст-
 
   ройству. Если очередь ожидания  канала  содержит  ожидающие
 
   форк-процессы, то программа извлекает из  очереди  процесс,
 
   назначает этому процессу канал, восстанавливает R3 -  R5  и
 
   активизирует приостановленный процесс.
 
 
        Входные данные:
 
   Регистры            Содержимое
 
   R5                  Адрес UCB.
 
   Поля                Содержимое
 
   UCB$L_CRB       Адрес блока запроса канала.
 
   CRB$L_LINK      Адрес вторичного CRB.
 
   CRB$V_BSY       Установлен, если канал занят.
 
   (B CRB$B_MASK)
 
   CRB$L_INTD+     Адрес блока данных прерывания.
 
   VEC$L_IDB
 
 
                            - 217 -
 
                        00152-01 97 07-2
 
 
   IDB$L_OWNER     Адрес UCB владельца канала.
 
   CRB$L_WQFL      Начало создания очереди ожидания канала
 
                   UCB.
 
        IPL при выполнении: IPL вызывающей программы.
 
        Выходные данные:
 
   Регистры            Содержимое
 
   R0 - R2             Разрушено.
 
   Поля                Содержимое
 
   IDB$L_OWNER     Очищено, если нет драйвера, ожидающего
 
                   освобождения канала.
 
   CRB4V_BSY       Очищено, если нет драйвера, ожидающего
 
                   освобождения канала.
 
        IPL при завершении: IPL вызывающей программы.
 
 
        IOC$RELDATAP
        ------------
 
        Модуль: IOSUBNPAG
 
 
        Форк-процессы драйверов вызывают эту программу,  чтобы
 
   освободить адаптер буферизованных путей данных общей шины.
 
 
        Программа не выполняет  никаких  действий,  если  пути
 
   данных постоянно выделены в контроллере. Если очередь  ожи-
 
   дания путей данных  содержит  ожидающие  форк-процессы,  то
 
   программа извлекает из очереди процесс, выделяет пути  дан-
 
   ных этому процессу, восстанавливает R3 - R5 и  активизирует
 
   приостановленный процесс. Программа не  должна  вызываться,
 
   пока драйвер не овладеет буферизованными путями данных.
 
 
        Входные данные:
 
   Регистры            Содержимое
 
   R5                  Адрес UCB.
 
 
 
                            - 218 -
 
                        00152-01 97 07-2
 
 
   Поля                Содержимое
 
   UCB$L_CRB        Адрес блока запроса канала.
 
   CRB$L_INTD+      Адрес блока управления адаптером.
 
   VEC$L_ADP
 
   CRB$L_INTD+      Описатель путей данных.
 
   VEC$B_DATAPATH
 
   VEC$V_PATHLOCK   1 указывает, что пути данных постоянно
 
                    выделены в контроллере.
 
   ADP$L_DPQFL      Начало очереди ожидания адаптера путей
 
                    данных.
 
        IPL при выполнении: IPL вызывающей программы.
 
 
        Если карта распределения испорчена, то программа  сиг-
 
   нализирует системной ошибкой с кодом сообщения INCONSTATE .
 
   После успешного завершения IOC$RELDATAP выходит по инструк-
 
   ции RSB.
 
 
        Выходные данные:
 
   Регистры             Содержимое
 
   R0 - R2              Разрушено.
 
   Поля                 Содержимое
 
   ADP$W_DPBITMAP    Путь данных устанавливается свободным,
 
                     если он не выделен для другого форк-
 
                     процесса драйвера.
 
   Биты 0 - 4        Очищены
 
   (B  CRB$L_INTD+
 
   VEC$B_DATAPATH)
 
        IPL при завершении: IPL вызывающей программы.
 
 
 
 
 
 
 
 
                            - 219 -
 
                        00152-01 97 07-2
 
 
        IOC$RELMAPREG
        -------------
 
        Модуль: IOSUBNPAG
 
 
        Форк-процессы драйвера вызывают программу,  для  осво-
 
   бождения набора регистров отображения адаптера общей  шины.
 
   Программа не  выполняет  никаких  действий,  если  регистры
 
   отображения постоянно выделены для в контроллере. Если оче-
 
   редь  ожидания  регистра  отображения  содержит   ожидающие
 
   форк-процессы, то программа извлекает из очереди процесс  и
 
   пытается выделить запрашиваемый набор  регистров  отображе-
 
   ния. Если это удается, программа восстанавливает R3 - R5  и
 
   вновь активизирует приостановленный процесс. Если не удает-
 
   ся, то программа снова ставит процесс в очередь и извлекает
 
   из нее следующий процесс.
 
 
        Программа предпологает,  что  вызвавшая  ее  программа
 
   является текущим владельцем контроллера данных канала.
 
 
        Входные данные:
 
   Регистры           Содержимое
 
   R5                 Адрес UCB.
 
   Поля               Содержимое
 
   UCB$L_CRB        Адрес CRB.
 
   VEC$V_MAPLOCK    Если поле установлено, то регистры
 
   (в CRB$L_INTD+   отображения постоянно выделены  в
 
    VEC$W_MAPREG)   контроллере.
 
   CRB$L_INTD+      Адрес блока управления адаптером.
 
   VEC$L_ADP
 
   CRB$L_INTD+      Номер начального регистра отображения.
 
   VEC$W_MAPREG
 
   CRB$L_INTD+      Число регистров отображения для
 
 
                            - 220 -
 
                        00152-01 97 07-2
 
 
   VEC$B_NUMREG     освобождения.
 
   ADP$L_MRQFL      Начало очереди ожидающих драйверов.
 
       IPL при выполнении: IPL вызывающей программы.
 
 
        IOC$RELMAPREG вызывает IOC$ALTUBAMAP и  IOC$ALOVBAMAP.
 
   Программа завершается по инструкции RSB.
 
 
        Выходные данные:
 
 
 
   Регистры             Содержимое
 
   R0 - R2              Разрушено.
 
   Поля                 Содержимое
 
   ADP$W_MRBITMAP    Регистры отображения свободны.
 
       IPL при завершении: IPL вызывающей программы.
 
 
        IOC$REQCOM
        ----------
 
        Модуль: IOSUBNPAG
 
 
        Форк-процессы драйверов вызывают эту  программу  после
 
   завершения операции ввода/вывода и всей зависящей  от  уст-
 
   ройства обработки запроса ввода/вывода.
 
 
        Программа записывает Р0 и Р1 в поле  состояния  пакета
 
   запроса  ввода/вывода.  Затем   вставляет   пакет   запроса
 
   ввода/вывода в  очередь  постобработки  ввода/вывода.  Если
 
   зарегистрирована ошибка, программа записывает конечное сос-
 
   тояние  в   буфер   сообщений   об   ошибках   и   вызывает
 
   ERL$RELEASEMB. Если очередь ожидания ввода/вывода  содержит
 
   записи,  программа  извлекает  из  очереди  пакет   запроса
 
   ввода/вывода и вызывает IOC$INITIATE. В  противном  случае,
 
   программа очищает бит занятости  в  блоке  управления  уст-
 
   ройством, чтобы показать, что устройство свободно.
 
 
                            - 221 -
 
                        00152-01 97 07-2
 
 
        Входные данные:
 
   Регистры           Содержимое
 
   R0             Первое длинное слово состояния ввода/вывода.
 
   R1             Второе длинное слово состояния ввода/вывода.
 
   R5             Адрес UCB.
 
   Поля               Содержимое
 
   UCB$V_ERLOGIP   Установлено или очищено. Определяет должна
 
   (в UCB$W_STS)   ли выполнятся регистрация ошибок.
 
   UCB$W_STS       Конечное состояние устройства.
 
   UCB$B_ERTCNT    Конечное значение счетчика ошибок.
 
   UCB$L_EMB       Адрес буфера сообщений об ошибках.
 
   UCB$L_IRP       Адрес IRP.
 
        IPL при выполнении: IPL вызывающей программы.
 
 
        Программа помещает пакет запроса ввода/вывода  в  оче-
 
   редь озаглавленную с помощью IOC$GL_PSBL. Если  UCB$L_IOQEL
 
   имеет  пакет  в  очереди,  IOC$REQCOM  посылает   пакет   в
 
   IOC$INITIATE.    Программа    завершается    переходом    в
 
   IOC$RELCHAN.
 
 
        Выходные данные:
 
   Регистры             Содержимое
 
   R2 - R3              Разрушено.
 
 
        Если вызвалась IOC$INITIATE, содержимое других регист-
 
   ров тоже разрушается.
 
 
   Поля                Содержимое
 
   IRP$L_MEDIA      Состояние ввода/вывода (R0).
 
   IRP$L_MEDIA+4    Состояние ввода/вывода (R1).
 
   EMB$Q_IOSB       Состояние ввода/вывода (R0 и R1).
 
   UCB$L_OPCNT      Увеличено на 1.
 
 
                            - 222 -
 
                        00152-01 97 07-2
 
 
   EMB$B_ERTCNT     UCB$B_ERTCNT
 
   EMB$B_ERTCNT+1   UCB$B_ERTCNT
 
   EMB$W_DV_STS     UCB$W_STS
 
   UCB$V_BSY        Очищено, если нет больше пакетов в
 
   (вUCB$W_STS )    очереди.
 
        IPL при завершении: IPL вызывающей программы.
 
 
        IOC$REQDATAP (NW)
        -----------------
 
        Модуль: IOSUBNPAG
 
 
        Форк-процессы     драйверов     вызывают     программу
 
   IOC$REQDATAP (NW), для освобождения набора регистров  отоб-
 
   ражения адаптера общей шины. Программа не выполняет никаких
 
   действий, если путь данных постоянно выделен для контролле-
 
   ра. Программа определяет свободный путь данных и записывает
 
   номер этого пути данных в CRB.  Если  нет  свободных  путей
 
   данных, программа сохраняет содержимое регистров R3 и R4  в
 
   форк-блоке UCB, вставляет адрес форк-блока в очередь ожида-
 
   ния пути данных и приостанавливает  форк-процесс  драйвера.
 
   Эта программа не должна вызываться, если драйвер не владеет
 
   буферизованным путем данных.
 
 
        Входные данные:
 
   Регистры             Содержимое
 
   R5                 Адрес UCB.
 
   0(SP)              Адрес возврата в вызвавшую программу.
 
   4(SP)              Адрес возврата в программу, вызвавшую
 
                      вызывающую программу.
 
   Поля                 Содержимое
 
   UCB$L_CRB          Адрес блока запроса канала.
 
   VEC$V_PATHLOCK     Если установлено, то пути данных уже
 
 
                            - 223 -
 
                        00152-01 97 07-2
 
 
   (в CRB$L_INTD+     Выделены.
 
   VEC$B_DATAPATH)
 
   CRB$L_INTD+        Адрес блока управления адаптером.
 
   VEC$L_ADPT
 
   ADR$W_DPBTIMAP     Индицирует, что пути данных доступны.
 
        IPL при выполнении: IPL вызывающей программы.
 
 
        Если IOC$REQDATAP не может выделить пути данных  и  NW
 
   не указано, программа сохраняет контекст  процесса  помещая
 
   содержимое R3,R4 и PC в форк-блоке UCB, а содержимого R5  -
 
   в очереди ожидания путей данных (ADP$L_DPQBL). Если NW ука-
 
   зано, то программа не приостанавливает процесс для освобож-
 
   дения путей данных.
 
 
        Выходные данные:
 
   Регистры           Содержимое
 
   R0              SS$_NORMAL (при удачном завершении),
 
                   0 (при неудачном завершении).
 
   Поля               Содержимое
 
   CRB$L_INTD+     Номер пути данных.
 
   VEC$B_DATAPATH
 
   ADP$W_DPBITMAP     Бит для выделенного пути данных очищен.
 
        IPL при завершении: IPL вызывающей программы.
 
 
        IOC$REQMAPREG
        -------------
 
        Модуль: IOSUBNPAG
 
 
        Форк-процессы драйвера вызывают программу, чтобы  зап-
 
   росить набор регистров отображения адаптера общей шины  для
 
   передачи по прямому доступу  к  памяти.  Эта  программа  не
 
   выполняет никаких действий, если регистры отображения  пос-
 
 
 
                            - 224 -
 
                        00152-01 97 07-2
 
 
   тоянно выделены для данного контроллера.
 
 
        Программа определяет требуемое число регистров отобра-
 
   жения и записывает  количество  регистов  и  номер  первого
 
   регистра CRB. Если нужное количество регистров  отображения
 
   не доступно, программа сохраняет R3 и R4 в форк-блоке  UCB,
 
   вставляет адрес форк-блока  в  очередь  ожидания  регистров
 
   отображения и приостанавливает форк-процесс драйвера.
 
 
        Входные данные:
 
   Регистры             Содержимое
 
   R5                 Адрес UCB.
 
   0(SP)              Адрес возврата в вызвавшую программу.
 
   4(SP)              Адрес возврата в программу вызвавшую
 
                      вызвавшую программу.
 
   Поля                 Содержимое
 
   UCB$W_BCNT         Число  передаваемых байтов.
 
   UCB$W_BOFF         Байт смещения в начальной странице  буфе
 
   UCB$L_CRB          Адрес CRB.
 
   CRB$L_INTD+        Адрес блока управления адаптером.
 
   VEC$L_ADP
 
   VEC$V_MAPLOCK      Определяет состояние бита блокировки
 
   (в CRB$L_INTD+     отображения.
 
    VEC$W_MAPREG)
 
   ADP$W_MRBITMAP     Биты распределения регистров отображения
 
                      адаптера.
 
        IPL при выполнении: IPL вызывающей программы.
 
 
        Если регистры не доступны, эта программа приостанавли-
 
   вает процесс, сохраняя следующий контекст:
 
 
 
 
 
                            - 225 -
 
                        00152-01 97 07-2
 
 
        _ R3 и R4 сохраняются в UCB$L_FR3 и UCB$L_FR4;
 
 
        _ PC сохраняется в UCB$L_FPC;
 
 
        _ R5 сохраняется в ADP$L_MRQBL, который является  оче-
 
   редью ожидания регистров отображения адаптера.
 
 
        Выходные данные:
 
   Регистры            Содержимое
 
   R0              SS$-NORMAL (при нормальном завершении).
 
   R1 - R2         Разрушено.
 
   Поля                Содержимое
 
   CRB$L_INTD+     Номер первого выделенного  регистра
 
   VEC$W_MAPREG    Отображения.
 
   CRB$L_INTD+     Количество выделенных регистров
 
   VEC$B_NIMREG    отображения.
 
   ADP$W_MRBITMAP  Выделенные регистры отображения.
 
        IPL при завершении: IPL вызывающей программы.
 
 
        IOC$REQPCHANH
        -------------
 
        Модуль: IOSUBNPAG
 
 
        Форк-процессы драйвера вызывают программу, чтобы  зап-
 
   росить канал контроллера с высоким приоритетом. Если  канал
 
   данных контроллера свободен, то программа записывает  адрес
 
   UCB в блок данных прерывания и возвращает адрес CRB в R4. В
 
   противном случае программа сохраняет R3 в  форк-блоке  UCB,
 
   вставляет адрес форк-блока в начало очереди ожидания канала
 
   и приостанавливает форк-процесс драйвера.
 
 
        Входные данные:
 
   Регистры            Содержимое
 
 
 
                            - 226 -
 
                        00152-01 97 07-2
 
 
   R5               Адрес UCB.
 
   0(SP)            Адрес возврата в вызвавшую программу.
 
   4(SP)            Адрес возврата в программу, вызывающую
 
                    вызывающую программу.
 
   Поля                Содержимое
 
   UCB$L_CRB        Адрес блока запроса канала.
 
   CRB$L_LINK       Адрес вторичного блока запроса канала.
 
   CRB$L_INTD+      Адрес блока данных прерывания.
 
   VEC$L_IDB
 
   CRB$V_BSY        Установлено или очищено. Если установлено,
 
   (в CRB$B_MASK)   канал занят.
 
   IDB$L_CSR        Адрес CSR устройства.
 
        IPL при выполнении: IPL вызывающей программы.
 
 
        Если канал занят, программа сохраняет контекст драйве-
 
   ра, запоминая содержимое R3, R4  в  UCB$L_FR3  и  UCB$L_FR4
 
   соответственно; запоминая 0(SP) B UCB$L_FPC, помещая содер-
 
   жимое R5 в очереди ожидания CRB (CRB$W_WQFL ) IOC$REQPCHANH
 
   завершается по инструкции RSB.
 
 
        Выходные данные:
 
   Регистры            Содержимое
 
   R0 - R2             Разрушено.
 
   R4                  IDB$L_CSR
 
   Поля                Содержимое
 
   IDB$L_OWNER         R5
 
        IPL при завершении: IPL вызывающей программы.
 
 
 
        IOC$REQPCHANL
        -------------
 
        Модуль: IOSUBNPAG
 
 
 
                            - 227 -
 
                        00152-01 97 07-2
 
 
        Форк-прцессы драйвера вызывают  эту  программу,  чтобы
 
   запросить канал контроллера с низким приоритетом.
 
 
        Программа   выполняет   те   же   действия,   что    и
 
   IOC$REQPCHANL, за исключением  того,  что  помещает  UCB  в
 
   конец очереди ожидания канала.
 
 
 
        IOC$REQSCHANH
        -------------
 
        Модуль: IOSUBNPAG
 
 
        Форк-процесс драйвера вызывает  эту  программу,  чтобы
 
   запросить канал данных  вторичного  контроллера  с  высоким
 
   приоритетом.
 
 
        Входные и выходные данные программы такие же, что и  у
 
   IOC$REQPCHANH за исключением того, что указывает канал дан-
 
   ных вторичного контроллера.
 
 
 
        IOC$REQSCHANL
        -------------
 
        Модуль: IOSUBNPAG
 
 
        Форк-процесс драйвера вызывает  эту  программу,  чтобы
 
   запросить канал вторичного контроллера с  низким  приорите-
 
   том.
 
 
        Входные и выходные данные программы такие же, что и  у
 
   IOC$REQPCHANH за исключением того, что указывает канал вто-
 
   ричного контроллера
 
 
 
        IOC$RETURN
        ----------
 
 
 
 
                            - 228 -
 
                        00152-01 97 07-2
 
 
        Модуль: IOSUBNPAG
 
 
        Программа осуществляет  возврат,  выполняя  инструкцию
 
   RSB и не имеет ни входных, ни выходных данных.
 
 
 
        IOC$VERIFYCHAN
        --------------
 
        Модуль: IOSUBPAGD
 
 
        Драйвер вызывает эту программу, чтобы подтвердить дос-
 
   товерность номера канала, определенного пользователем, соз-
 
   дать индекс канала и получить адрес блока управления  кана-
 
   лом, на который указывает номер канала.
 
 
        Входные данные:
 
   Регистры             Содержимое
 
   R0                  Номер канала.
 
   Поля                 Содержимое
 
   CTL$GL_CCBASE       базовый адрес таблицы блоков управления
 
                       каналоми данного процесса.
 
        IPL при выполнении: IPL$_ASTDEL или ниже.
 
 
        Посколько  программа  получает  доступ  к  информации,
 
   запомненной в виртуальном адресном  пространстве  пользова-
 
   тельского процесса, она должна вызватся только тогда, когда
 
   пользовательский процесс отображен.
 
 
        Выходные данные:
 
   Регистры            Содержимое
 
   R0               SS$_NORMAL (при удачном завершении).
 
                    SS$_IVCHAN (неверный номер канала).
 
                    SS$_NOPRIV (нет привилегии доступа к ука-
 
                    занному каналу).
 
 
                            - 229 -
 
                        00152-01 97 07-2
 
 
   R1               Адрес блока управления канала.
 
   R2               Индексный номер  канала.
 
   Поля                Содержимое
 
   ----                 -----
 
        IPL при завершении: IPL вызывающей программы.
 
 
        IOC$WFIKPCH
        -----------
 
        Модуль: IOSUBNPAG
 
 
        Форк-процессы драйвера вызывают эту  программу,  чтобы
 
   приостановить работу драйвера для ожидания  прерывания  или
 
   тайм-аута устройства, сохраняя при этом канал данных  конт-
 
   роллера. Программа сохраняет R3, R4 и PC возврата в драйвер
 
   вершины стека в форк-блоке UCB. Она  устанавливает  разряды
 
   UCB, индицирующие прерывание или таймаут ожидаются, и уста-
 
   навливает время таймаута в блоке управления устройством.
 
 
        Программа очищает разряды UCB, которые показывают, что
 
   устройство в таймауте, и понижает IPL до уровня IPL, сохра-
 
   ненного в вершине стека. Затем программа возвращает  управ-
 
   ление программе, вызвавшей форк-процесс драйвера.
 
 
        Два байта, следующие за  JSB  в  IOC$WFIKPCH  содержат
 
   относительные смещения программы тайм-аута.
 
 
        Входные данные:
 
   Регистры            Содержимое
 
   R5               Адрес UCB.
 
   0(SP)            Адрес, следующий за JSB B  IOC$WFIKPCH.
 
   4(SP)            Величина таймаута в секундах.
 
   8(SP)            Значение IPL, до которого понижается
 
                    IPL до возврата в программу, вызвавшую
 
 
                            - 230 -
 
                        00152-01 97 07-2
 
 
                    вызывающую  программу.
 
   12(SP)           Адрес возврата в программу, вызвавшую
 
                    вызывающую программу.
 
   Поля                Содержимое
 
   EXE$GL_ABSTIM    Абсолютное время. Используется,  для
 
                    вычислениени время таймаута устройства.
 
 
        IPL при  выполнении:  IPL  устройства  (IPL  вызвавшей
 
   программы).
 
 
        Программа удаляет 0(SP)  -  11(SP)  из  стека  явно  и
 
   12(SP) - 15(SP) неявно завершаясь по инструкции RSB,  кото-
 
   рая возвращает управление программе,  вызвавшей  вызывающую
 
   программу.
 
 
        Выходные данные:
 
   Регистры            Содержимое
 
   -----               -----
 
   Поля                Содержимое
 
   UCB$L_DUETIM     Сумма величин таймаутов и  EXE$GL_ABSTIM.
 
   UCB$V_INT        Установлено для указания, что ожидается
 
                    прерывание устройства.
 
   UCB$V_TIM        Установлено для указания, что ожидается
 
                    таймаут устройство.
 
   UCB$V_TIMOUT     Очищено, чтобы показать, что устройство не
 
                    имело таймаута.
 
   UCB$L_FR3        R3.
 
   UCB$L_FR4        R4.
 
   UCB$L_FPC        0(SP)+2
 
        IPL при завершении: IPL, определенный в 8(SP).
 
 
 
 
 
                            - 231 -
 
                        00152-01 97 07-2
 
 
        IOC$WFIRLCH
        -----------
 
        Модуль: IOSUBNPAG
 
 
        Форк-процессы драйверов вызывают эту программу,  чтобы
 
   приостановить работу драйвера для ожидания  прерывания  или
 
   тайм-аута устройства и при  этом  освободить  канал  данных
 
   контроллера.
 
 
        Входные и выходные данные этой программы такие же, что
 
   и у IOC$WFIKPCH, за исключением того, что IOC$FIRLCH завер-
 
   шается выходом в  IOC$RELCHAN,  которая  освобождает  канал
 
   данных контроллера.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
                            - 232 -
 
                        00152-01 97 07-2
 
 
                                                  Приложение 4
 
 
 
 
 
                Точки входа в драйвер устройства
 
 
 
 
 
 
 
          1. ОСНОВНЫЕ ПОДПРОГРАММЫ ДРАЙВЕРА УСТРОЙСТВА
 
 
 
 
        Приложение описывает  основные  подпрограммы  драйвера
 
   устройства, или  так  называемые  точки  входа  в  драйвер,
 
   используемые МОС ВП для активизации драйвера устройства.
 
 
 
        1.1. Подпрограммы FDT
 
 
 
        Данная часть драйвера осуществляет подготовку к опера-
 
   циям на устройстве. Операция может как включать, так  и  не
 
   включать передачу данных.
 
 
        Указание точки входа
 
 
        Для указания установки программ FDT необходимо исполь-
 
   зовать макрокоманду FUNCTAB, что осуществляет подготовку  к
 
   запросам активизации ввода/вывода данного  типа  и  указать
 
   имена подпрограмм в порядке их выполнения для каждого  типа
 
   операции ввода/вывода.
 
 
        Входные параметры
 
 
    Регистры           Содержимое
 
      R0            Адрес вызова подпрограммы FDT
 
 
 
                            - 233 -
 
                        00152-01 97 07-2
 
 
      R3            Адрес IRP для текущего запроса
 
                    ввода/вывода
 
      R4            Адрес PCB запрашиваемого (текущего)
 
                    процесса
 
      R5            Адрес UCB устройства, на котором
 
                    запрашивается ввод/вывод. Устройство
 
                    привязывается к каналу ввода/вывода
 
                    пользовательского процесса.
 
      R6            Адрес CRB, описывающий канал ввода/
 
                    вывода пользовательского процесса.
 
      R7            Номер бита, указывающего на код
 
                    запрашиваемой функции ввода/вывода.
 
      R8            Адрес входа в FDT, передающий
 
                    управление программе FDT.
 
      AP            Адрес первого параметра-функции,
 
                    указанного в QIO.
 
 
        Выходные параметры
 
 
        Выходные данные не  требуются,  но  управление  должно
 
   быть возвращено команде QIO посредством инструкции RSB  или
 
   передано инструкцией JMP подпрограмме, ставящей  в  очередь
 
   IPR, или подпрограмме, заканчивающей или прерывающей запрос
 
   ввода/вывода.
 
 
        Использование регистров
 
 
        Подпрограммы FDT должны сохранять содержимое регистров
 
   R3-R5, AP и FP.
 
 
        Контекст
 
 
 
 
 
                            - 234 -
 
                        00152-01 97 07-2
 
 
        Подпрограммы FDT  выполняются  в  контексте  процесса,
 
   запрашивающего ввод/вывод. Подпрограммы FDT не должны пони-
 
   жать IPL ниже IPL$_ASTDEL. Если они повышают IPL, то  перед
 
   передачей управления любой другой команде  должны  понизить
 
   его до IPL$_ASTDEL. Если подпрограмма FDT изменяет стек, то
 
   должна восстановить его перед возвратом управления вызываю-
 
   щей программе.
 
 
        IPL при входе и выходе
 
 
        Подпрограммы FDT вызываются при IPL$_ASTDEL  и  должны
 
   возращаться с IPL$_ASTDEL.
 
 
        Использование точки входа
 
 
        Системный сервис QIO вызывает точку входа из выполняю-
 
   щегося модуля SYSQIOREQ.
 
 
        Механизм выхода
 
 
        Способ выхода из подпрограмм FDT  зависит  от  запроса
 
   ввода/вывода.
 
 
        Для каждой поддерживаемой устройством функции установ-
 
   ка подпрограмм FDT должна предполагать подготовку к запросу
 
   этой функции. Кроме последней подпрограммы FDT каждая подп-
 
   рограмма должна возвращать управление вызывающей  программе
 
   посредством инструкции RSB.  Последняя  должна  выходить  в
 
   одну из программ:
 
 
     Программа                Функция
 
     EXE$ABORTIO         Прерывает запрос ввода/вывода
 
                         и возвращает вызывающей программе
 
                         системного сервиса QIO как
 
 
                            - 235 -
 
                        00152-01 97 07-2
 
 
                         статус информации содержимое R0
 
     EXE$ALTQUEPKT       Ставит IRP в очередь изменяющейся
 
                         точки входа без проверки статуса
 
                         устройства
 
     EXE$FINISHIO        Заканчивает процесс ввода/вывода,
 
                         возвращает квадрослово статуса
 
                         информации вызывающей программе
 
                         в системном сервисе QIO;
 
                         информация возвращается в IOSB,
 
                         указанном в вызове QIO, статус
 
                         информации берется из R0 и R1,
 
                         когда EXE$FINISHIO получает
 
                         управление.
 
     EXE$FINISHIOC       Заканчивает процесс ввода/вывода,
 
                         возвращает длинное слово статуса
 
                         информации вызывающей программе
 
                         системного сервиса QIO; информация
 
                         возвращается в первое длинное слово
 
                         IOSB, указанном в вызове QIO, и
 
                         статус информации берется из R0,
 
                         когда EXE$FINISHIOC получает
 
                         управление; следующее слово IOSB
 
                         очищается.
 
     EXE$QIODRVPKT       Если устройство занято, ставит
 
                         IRP в пересмотренную очередь
 
                         ввода/вывода или активизирует
 
                         ввод/вывод, если устройство
 
                         свободно.
 
     RSB                 Возвращает управление вызывающей
 
                         подпрограмме, организуя, таким
 
 
                            - 236 -
 
                        00152-01 97 07-2
 
 
 
 
                         системном сервисе QIO.
 
 
 
        1.2. Подпрограмма начала ввода/вывода
 
 
 
        Подпрограммы IOC$REQCOM и IOC$INITIATE вызывают  драй-
 
   верную подпрограмму начала ввода/вывода. Подпрограмма нача-
 
   ла ввода/вывода активизирует устройство.
 
 
        Указание точки входа
 
 
        Указать имя подпрограммы начала ввода/вывода как пара-
 
   метр START  в  макрокоманде  DDTAB.  Макрокоманда  помещает
 
   адрес подпрограммы в DDT.
 
 
        Входные параметры
 
 
      Регистры              Содержимое
 
        R3                  Адрес IRP
 
        R5                  Адрес UCB
 
 
 
 
        Мос вп копирует следующую информацию из текущего IRP в
 
   поля UCB.
 
 
      Поле                      Содержимое
 
      UCB$W_BCNT         Число байтов, которые должны быть
 
                         переданы, копируется из IRP$W_BCNT
 
                         заметим, что из IRP копируется только
 
                         слово младшего порядка; если
 
                         устройство поддерживает передачу
 
                         такого числа байтов, для
 
                         представления величины
 
 
                            - 237 -
 
                        00152-01 97 07-2
 
 
                         которого требуется длинное слово,
 
                         подпрограмма начала ввода/вывода
 
                         должна выделить число из IRP и
 
                         хранить в доступном месте как
 
                         зависящее от устройства  расширение
 
                         UCB.
 
      UCB$W_BOFF         Смещение от начала страницы до
 
                         первого байта, который необходимо
 
                         передать; копируется из IRP$W_BOFF
 
      UCB$L_SVAPTE       Адрес входа в таблицу,
 
                         копируется из IRP$L_SVAPTE
 
 
        Выходные параметры
 
 
        Результатом подпрограммы начала ввода/вывода  является
 
   активизация устройства.
 
 
        Использование регистров
 
 
        Содержимое всех регистров, кроме  R0,  R1,  R2  и  R4,
 
   должно быть сохранено.
 
 
        Если подпрограмма начала ввода/вывода использует стек,
 
   она должна восстановить  стек  перед  завершением  запроса,
 
   ожидая прерывания или запрашивая системные ресурсы.
 
 
        Контекст
 
 
        Подпрограмма начала ввода/вывода получает  и  передает
 
   процессу управление на форк IPL. Для многих устройств подп-
 
   рограмма начала ввода/вывода повышает  IPL  до  IPL$_POWER,
 
   IPL отказа питания, чтобы  проверить,  произошел  ли  отказ
 
   источника  питания  на  устройстве.   Подпрограмма   начала
 
 
 
                            - 238 -
 
                        00152-01 97 07-2
 
 
   ввода/вывода инициирует запуск устройства на IPL  устройст-
 
   ва.
 
 
        Использование точки входа
 
 
        IOC$INITIATE и IOC$REQCOM в модуле IOSUBNPAG.
 
 
 
        1.3. Подпрограмма обслуживания прерывания
 
 
 
        Подпрограмма обслуживания прерывания обрабатывает пре-
 
   рывания, генерируемые устройством. Прерывания сигнализируют
 
   о завершении операции ввода/вывода или об ошибке. Устройст-
 
   ва UNIBUS требуют  наличия  подпрограммы  ввода/вывода  для
 
   каждого вектора прерывания устройства.
 
 
        Функции, выполняемые подпрограммой обслуживания преры-
 
   вания, следующие:
 
 
        - определить, ожидалось ли прерывание;
 
 
        - обработать или отбросить незапланированные  прерыва-
 
   ния;
 
 
        - активизировать или остановить драйвер так, чтобы  он
 
   мог обрабатывать ожидаемые прерывания.
 
 
        Указание точки входа
 
 
        Указать  имя  подпрограммы  обслуживания   прерывания,
 
   используя макрокоманда  DPT_STORE,  чтобы  поместить  адрес
 
   подпрограммы в CRB, в поле CRB$L_INTD+4.
 
 
        Если устройство имеет  две  подпрограммы  обслуживания
 
   прерывания, надо использовать макрокоманда DPT_STORE, чтобы
 
 
 
                            - 239 -
 
                        00152-01 97 07-2
 
 
   указать имя второй подпрограммы обслуживания  прерывания  и
 
   поместить  адрес   этой   подпрограммы   в   длинное   поле
 
   CRB$L_INTD2+4 внутри CRB.
 
 
        Входные параметры
 
 
        Когда подпрограмма вызвана, стек содержит следующее:
 
 
      Локализация стека     Содержимое
 
      0(SP)                 Адрес длинного слова, которое
 
                            содержит адрес IDB
 
      4(SP) до 24(SP)       Для устройств общей шины -
 
                            содержимое регистров R0-R5
 
                            во время прерывания;
 
      28(SP)                PC во время прерывания
 
      32(SP)                PSL во время прерывания
 
 
        Выходные параметры
 
 
        Перед тем, как сбросить прерывание, подпрограмма долж-
 
   на переслать адрес указателя в IDB из вершины стека и восс-
 
   тановить содержимое регистров R0-R5, которые были сохранены
 
   МОС ВП перед отправлением в прерывание. Затем эта  подпрог-
 
   рамма должна заканчиваться инструкцией REI.
 
 
        Перед тем, как подпрограмма передает управление приос-
 
   тановленному драйверу, она должна  восстановить  содержимое
 
   регистров R3 и R4 из  UCB.  Затем  передать  управление  по
 
   адресу из UCB$L_FPC.
 
 
        Использование регистров
 
 
        Если  подпрограмма  обработки  прерывания   использует
 
   регистры с R6 по R11,  AP  или  FP,  она  должна  сохранить
 
 
                            - 240 -
 
                        00152-01 97 07-2
 
 
   содержимое регистров, восстанавливая  их  содержимое  перед
 
   выходом по инструкции REI.
 
 
        Контекст
 
 
        Процесс запускается в  режиме  ядра  (KERNEL  MODE)  и
 
   использует стек прерываний. Подпрограмма  может  обращаться
 
   только к адресам бесстраничной системной памяти.
 
 
        IPL при входе и выходе
 
 
        Подпрограмма  вызывается,  выполняется  и   возвращает
 
   управление на IPL устройства.
 
 
        Использование точки входа
 
 
        Подпрограмма  вызывается  подпрограммами  обслуживания
 
   прерывания МОС ВП, адреса которой обычно загружены  в  ADP,
 
   CRB (или в оба) прерывающего устройства.
 
 
 
        1.4. Подпрограмм отмена ввода/вывода
 
 
 
        Подпрограмма вызывается  МОС  ВП,  когда  пользователь
 
   вызывает системный сервис отмена ввода/вывода, чтобы  отме-
 
   нить все запросы активизации ввода/вывода на канале.  Прог-
 
   рамма должна выполнять следующие функции:
 
 
        - определить,  активизировался  ли  IRP,  связанный  с
 
   отменой ввода/вывода. Это обычно делается во  время  первой
 
   проверки бита UCB$V_BSY в  поле  UCB$W_STS,  чтобы  узнать,
 
   обрабатывается ли какой-либо запрос  на  устройстве.  Таким
 
   образом, подпрограмма отмена ввода/вывода проверяет,  соот-
 
   ветствуют ли PID и номер канала обрабатываемого запроса PID
 
 
 
                            - 241 -
 
                        00152-01 97 07-2
 
 
   и номеру канала, указанному в запросе отмена ввода/вывода;
 
 
        - указать, чтобы по возможности быстро  были  отменены
 
   все активные запросы ввода/вывода на указанном  устройстве,
 
   что  должно  быть  сделано  процессом,  запросившим  отмену
 
   ввода/вывода.
 
 
        Подпрограмма отмена ввода/вывода заканчивает это уста-
 
   новкой UCB$V_CANCEL в поле UCB$W_STS. Когда  произойдет  на
 
   устройстве следующее  прерывание  или  таймаут,  драйверная
 
   подпрограмма начала ввода/вывода, опрашивая этот бит, обна-
 
   ружит наличие активных, но отмененных запросов ввода/вывода
 
   и предпримет такие действия,  как  завершение  запроса  без
 
   инициирования дальнейшей активности устройства.
 
 
        Указание точки входа
 
 
        Указать имя подпрограммы отмена ввода/вывода как пара-
 
   метр в  макрокоманде  DDTAB.  Макрокоманда  помещает  адрес
 
   подпрограммы в DDT.
 
 
        Входные параметры
 
 
 
      Регистр           Содержимое
 
       R2            Индексный номер канала
 
       R3            Адрес IRP, обрабатываемого драйверной
 
                     подпрограммой начала ввода/вывода
 
       R4            Адрес PCB процесса, для которого
 
                     запрос ввода/вывода отменяется
 
       R5            Адрес UCB устройства
 
       R8            Значение, посылаемое вызывающей
 
                     программе, одно из следующих:
 
 
 
                            - 242 -
 
                        00152-01 97 07-2
 
 
                     Код           Значение
 
                     CAN$C_CANCEL  Системный сервис
 
                                   $CANCEL или $DALLOC
 
                     CAN$C_DASSGN  Системный сервис
 
                                   $DASSGN
 
 
        Выходные параметры
 
 
        Запросы ввода/вывода на указанном канале отменены, бит
 
   UCB$V_CANCEL в поле UCB$L_STS установлен.
 
 
        Использование регистров
 
 
        Драйверная  подпрограмма  аннулирования   ввода/вывода
 
   может свободно использовать регистры с R0 по R3. Содержимое
 
   любых других регистров должно быть восстановлено перед тем,
 
   как подпрограмма аннулирования ввода/вывода передаст управ-
 
   ление по инструкции RSB.
 
 
        Контекст
 
 
        Подпрограмма выполняется в контексте пользовательского
 
   процесса, в режиме ядра (KERNEL MODE).
 
 
        IPL при входе и выходе
 
 
        Подпрограмма вызвана на форк IPL устройства.
 
 
        Использование точки входа
 
 
        Системный сервис $CANCEL, $DASSGN и $DALLOC использует
 
   данную  точку  входа  в  модулях  SYSCANCEL,   SYSASSGN   и
 
   SYSDEVALC соответственно.
 
 
 
 
 
 
                            - 243 -
 
                        00152-01 97 07-2
 
 
        1.5. Подпрограмма обработки таймаута
 
 
 
        Подпрограмма обрабатывает ситуацию,  когда  устройство
 
   еще не ответило на запрос активизации устройства, а  время,
 
   разрешенное для ответа, истекло.
 
 
        Указание точки входа
 
 
        Указать имя подпрограммы обработки таймаута как  аргу-
 
   мент в макрокомандах WFIKPCH или WFIRLCH .
 
 
        Входные параметры
 
 
      Регистр         Содержимое
 
      R3           Содержимое R3 во время последнего
 
                   вызова WFIKPCH или WFIRLCH
 
      R4           Содержимое R4 во время последнего
 
                   вызова WFIKPCH или WFIRLCH
 
      R5           Адрес UCB устройства
 
 
        Выходные параметры
 
 
        Выходные данные не требуются,  но,  в  зависимости  от
 
   характеристик устройства, подпрограмма  обработки  таймаута
 
   должна   отменить   или    возобновить    текущий    запрос
 
   ввода/вывода, послать сообщение оператору  или  предпринять
 
   другие действия.
 
 
        Перед вызовом подпрограммы МОС ВП помещает  устройство
 
   в положение, когда  прерывания  не  ожидаются  (очищая  бит
 
   UCB$V_INT в поле UCB$W_STS).  Если  запрошенное  прерывание
 
   произошло после вызова подпрограммы, то оно принимается как
 
   незапланированное. Многие  драйверы  обрабатывают  ситуацию
 
 
 
                            - 244 -
 
                        00152-01 97 07-2
 
 
   невозможных прерываний  во  время  выполнения  подпрограммы
 
   обработки таймаута.
 
 
        Использование регистров
 
 
        Подпрограмма может свободно оперировать с регистрами с
 
   R0 по R2, но должна  сохранить  содержимое  всех  остальных
 
   регистров.
 
 
        Если подпрограмма использует стек, она должна  восста-
 
   новить стек перед завершением или отменой текущего  запроса
 
   ввода/вывода, перед ожиданием прерывания  или  возвращением
 
   управления вызывающей программе.
 
 
        Контекст
 
 
        Подпрограмма выполняется  в  контексте  форк-процесса.
 
   Подпрограмма может обращаться только к адресам  бесстранич-
 
   ной системной памяти.
 
 
        IPL при входе и выходе
 
 
        Подпрограмма  вызывается  при  IPL  устройства.  После
 
   предпринятия  какого-либо  специфического  для   устройства
 
   действия  (обязательно  при  IPL  устройства)  подпрограмма
 
   должна понизить IPL до форк IPL.
 
 
        Использование точки входа
 
 
        Макрокоманды WFIKPCH и WFIRLCH используют данную точку
 
   входа, но только когда имя подпрограммы выступает как пара-
 
   метр в указанных макрокомандах.
 
 
        Макрокоманды  используются  драйверной   подпрограммой
 
   начала ввода/вывода, поэтому, строго говоря, только драйвер
 
 
                            - 245 -
 
                        00152-01 97 07-2
 
 
   является единственной областью, использующей  данную  точку
 
   входа.
 
 
        Подпрограммы МОС ВП из модуля TIMESCHDL вызывают  дан-
 
   ную подпрограмму в запросах WFIKPCH и WFIRLCH .
 
 
 
        1.6. Подпрограмма дампа регистров
 
 
 
        Подпрограммы МОС ВП транспортировки ошибок и  загрузки
 
   диагностического буфера вызывают  данную  подпрограмму  для
 
   копирования  содержимого  регистров  устройства  в  область
 
   транспортирования ошибок или диагностический буфер.
 
 
        Указание точки входа
 
 
        Указать имя подпрограммы дампа регистров как  параметр
 
   REGDMP в макрокоманды DDTAB.  Макрокоманда  помещает  адрес
 
   подпрограммы в DDT.
 
 
        Входные параметры
 
 
        Подпрограмма  дампа  регистров  использует   следующие
 
   входные данные:
 
 
      Регистр         Содержимое
 
      R0              Адрес буфера, в который копируется
 
                      содержимое регистров устройства
 
      R4              Адрес CSR устройства
 
      R5              Адрес UCB устройства
 
 
        Выходные параметры
 
 
        Содержимое регистров устройства копируется в буфер.
 
 
 
 
                            - 246 -
 
                        00152-01 97 07-2
 
 
        Использование регистров
 
 
        Подпрограмма сохраняет содержимое всех регистров, кро-
 
   ме R0-R2. Если подпрограмма  использует  стек,  она  должна
 
   восстановить содержимое стека  перед  передачей  управления
 
   другой подпрограмме, перед ожиданием прерывания и возвраще-
 
   нием в вызывающую подпрограмму.
 
 
        Контекст
 
 
        Подпрограмма выполняется  без  контекста  подпрограммы
 
   обслуживания прерывания, используя стек режима ядра (KERNEL
 
   MODE). Она может обращаться только к адресам  бесстраничной
 
   системной памяти.
 
 
        IPL при входе и выходе
 
 
        Подпрограмма вызывается с тем же IPL, что и вызываемые
 
   драйвером подпрограммы МОС ВП  ERL$DEVICEERR,  ERL$DEVICTMO
 
   или IOC$DIAGBUFILL. Она не должна менять IPL.
 
 
        Использование точки входа
 
 
        Подпрограммы  ERL$DEVICERR,  ERL$DEVICTMO   в   модуле
 
   ERRORLOG и IOC$DIAGWUFILL в модуле IOSUBNPAG вызывают  дан-
 
   ную подпрограмму.
 
 
 
        1.7. Альтернативная   подпрограмма    начала
 
             ввода/вывода
 
 
 
        Альтернативная подпрограмма начала ввода/вывода - нео-
 
   бязательная точка входа.  Она  включается  только  в  такие
 
   драйверы, которые при некоторых обстоятельствах  инициируют
 
 
 
                            - 247 -
 
                        00152-01 97 07-2
 
 
   повторную  активность  устройства.  Драйверы,  использующие
 
   альтернативную  подпрограмму  начала  ввода/вывода,  должны
 
   выполнить собственную синхронизацию доступа к  UCB  и  уст-
 
   ройству.
 
 
        Указание точки входа
 
 
        Указать   имя   альтернативной   подпрограммы   начала
 
   ввода/вывода как параметр ALTSTART  в  DDTAB.  Макрокоманда
 
   помещает адрес этой подпрограммы в DDT.
 
 
        Входные параметры
 
 
      Регистр          Содержимое
 
       R3             Адрес IRP
 
       R5             Адрес UCB
 
 
        Подпрограмма требует такие же входные параметры, как и
 
   подпрограмма старта ввода/вывода.
 
 
 
        Выходные параметры
 
 
   результатом альтернативной подпрограммы старта ввода/вывода
 
   является активность устройства.
 
 
        Использование регистров
 
 
        Содержимое всех регистров, кроме  R0-R5,  должно  быть
 
   сохранено.
 
 
        Контекст
 
 
        Подпрограмма старта ввода/вывода  передает  управление
 
   процессору в контексте форк-процесса. Следовательно, только
 
   адреса бесстраничной системной памяти доступны альтернатив-
 
 
                            - 248 -
 
                        00152-01 97 07-2
 
 
   ной подпрограмме старта ввода/вывода.
 
 
        IPL при входе и выходе
 
 
        Альтернативная подпрограмма старта ввода/вывода  вызы-
 
   вается при форк IPL.
 
 
        Использование точки входа
 
 
        Подпрограмма EXE$ALQUEPKT в модуле SYSQIOREQ  вызывает
 
   альтернативную подпрограмму начала ввода/вывода.
 
 
 
        1.8. Подпрограмма инициализации контроллера
 
 
 
        Подпрограммы инициализации контроллера  готовят  конт-
 
   роллеры к операции. Если контроллер запрашивает их, драйвер
 
   должен инициализировать контроллер, когда  системная  подп-
 
   рограмма загрузки драйвера загружает драйвер и когда систе-
 
   ма перезагружается после отказа питания.
 
 
        Указание точки входа
 
 
        Указать имя  подпрограммы  инициализации  контроллера,
 
   используя      макрокоманду      DPT_STORE      в      поле
 
   CRB$L_INTD+VEC$L_INITIAL.
 
 
        Входные параметры
 
 
        При  вызове  подпрограмма  инициализации   контроллера
 
   обеспечивается следующей информацией:
 
 
      Регистр         Содержимое
 
       R4             Адрес CSR
 
       R5             Адрес IDB, описывающего устройство
 
 
 
                            - 249 -
 
                        00152-01 97 07-2
 
 
       R6             Адрес DDB, связанного с контроллером
 
       R8             Адрес CRB для контроллера
 
 
        Программа  SYSGEN   создает   все   структуры   данных
 
   ввода/вывода, связанных с устройством перед  вызовом  подп-
 
   рограммы инициализации контроллера.
 
 
        Выходные параметры
 
 
        В зависимости от устройства подпрограмма инициализации
 
   контроллера выполняет выборочно (или в целом) следующее:
 
 
        - очищает в регистрах устройства биты  состояния  оши-
 
   бок;
 
 
        - разрешает прерывания;
 
 
        - накапливает значения в полях,  которые  представляют
 
   смещение более, чем 256 байтов с начала структуры данных  и
 
   не могут быть достигнуты макрокомандой DPT_STORE;
 
 
        - распределить ресурсы, которые должны постоянно  при-
 
   надлежать контроллеру;
 
 
        - если  контроллер  обслуживает  простое   устройство,
 
   TAKOE  KAK,  например,  печатающее  устройство,   загрузить
 
   IDB$L_OWNER  и  установить  бит  ONLINE   (UCB$V_ONLINE   в
 
   UCB$W_STS).
 
 
        Использование регистров
 
 
        Подпрограммы инициализации должны сохранить содержимое
 
   всех регистров, кроме с R0 по R2. Если подпрограмма инициа-
 
   лизации контроллера использует регистры, она должна  прежде
 
   запомнить содержимое регистров, а перед выходом в  вызываю-
 
 
                            - 250 -
 
                        00152-01 97 07-2
 
 
   щую подпрограмму восстановить их.
 
 
        Контекст
 
 
        Подпограмма инициализации контроллера выполняется  без
 
   системного контекста. Подпрограмма может обращаться  только
 
   к адресам бесстраничной системной памяти.
 
 
        IPL при входе и выходе
 
 
        Мос вп вызывает подпрограмму инициализации контроллера
 
   на IPL$_POWER. Подпрограмма  инициализации  контроллера  не
 
   должны понижать IPL.
 
 
        Использование точки входа
 
 
        Мос вп вызывает данную точку входа, когда  выполняется
 
   команда CONNECT. Мос вп вызывает подпрограмму,  когда  уст-
 
   ройство, контроллер, процессор или адаптер, к которому уст-
 
   ройство присоединено, испытывают отказ питания.
 
 
 
        1.9. Подпрограмма инициализации устройства
 
 
 
        Подпрограмма инициализации  устройства  подготавливает
 
   контроллеры и подсоединенные к ним устройства  к  операции.
 
   Драйвер должен иницилизировать устройство во время загрузки
 
   драйвера подпрограммой загрузки драйвера и во время восста-
 
   новления системы после отказа питания.
 
 
        Указание точки входа
 
 
        Можно указать данную точку входа двумя способами. Каж-
 
   дый из них годится для  всех,  но  нескольких  определенных
 
   устройств. Если в одном и том же драйвере используются  оба
 
 
                            - 251 -
 
                        00152-01 97 07-2
 
 
   способа, МОС ВП производит выбор случайно.
 
 
        Чтобы указать подпрограмму  инициализации  устройства,
 
   можно использовать макрокоманду DDTAB, где в качестве аргу-
 
   мента UNITINIT указано имя подпрограммы.
 
 
        Можно также поместить адрес подпрограммы инициализации
 
   устройства в CRB, в поле CRB$L_INTD+VEC$L_UNITINIT, исполь-
 
   зуя макрокоманду DPT_STORE.
 
 
        Входные параметры
 
 
        Подпрограмма,  вызывающая  подпрограмму  инициализации
 
   устройства, обеспечивает следующую информацию:
 
 
     Регистр    Содержимое
 
      R3        Адрес первой CSR;
 
      R4        Адрес второй CSR, если она существует;
 
                если нет, то содержимое R3 и R4 одно и то же;
 
      R5        Адрес UCB.
 
 
        К   тому   же,   SYSGEN   создает   структуры   данных
 
   ввода/вывода, связанные с устройством, перед вызовом  подп-
 
   рограммы инициализации.
 
 
        Выходные параметры
 
 
        В зависимости от устройства подпрограмма инициализации
 
   устройства выполняет следующие функции (все или выборочно):
 
 
        - очищает биты состояния ошибок в регистрах  устройст-
 
   ва;
 
 
        - разрешает прерывания контроллера;
 
 
 
 
                            - 252 -
 
                        00152-01 97 07-2
 
 
        - устанавливает бит ONLINE (UCB$V_ONLINE в UCB$W_STS);
 
 
        - сохраняет содежимое полей, которые смещены более чем
 
   на 256 байтов с начала UCB и соответственно не  могут  быть
 
   изменены макрокомандой DPT_STORE;
 
 
        - распределяет ресурсы, которые должны постоянно  при-
 
   надлежать устройству или нескольким устройствам, контролле-
 
   ру;
 
 
        - если контроллер обслуживает  одно  устройство,  как,
 
   например, печатающее устройство, то заполняет IDB$L_OWNER.
 
 
        Использование регистров
 
 
        Подпрограммы инициализации должны сохранить содержимое
 
   всех регистров, кроме с R0 по R2. Поэтому перед использова-
 
   нием этих регистров подпрограмма  инициализации  устройства
 
   должна сохранить их  содержимое,  а  перед  возвращением  в
 
   вызывающую подпрограмму восстановить их содержимое.
 
 
        Контекст
 
 
        Мос вп вызывает подпрограмму инициализации  устройства
 
   без системного  контекста.  Подпрограмма  может  обращаться
 
   только к адресам бесстраничной системной памяти.
 
 
        IPL при входе и выходе
 
 
        Мос вп вызывает подпрограмму инициализации  устройства
 
   на IPL$_POWER.  Подпрограмма  инициализации  устройства  не
 
   должна понижать IPL.
 
 
 
 
 
 
 
                            - 253 -
 
                        00152-01 97 07-2
 
 
        Использование точки входа
 
 
        SYSGEN  вызывает  подпрограмму  во  время   выполнения
 
   команды CONNECT. Мос вп вызывает данную точку входа во вре-
 
   мя отказа питания устройства, контроллера,  процессора  или
 
   адаптера, к которому устройство присоединено, или при восс-
 
   тановлении.
 
 
 
        1.10. Подпрограмма доставки устройства
 
 
 
        Если контроллеры  могут  обслуживать  различное  число
 
   устройств, то подпрограмма доставки устройства  определяет,
 
   какие устройства присутствуют и могут быть включены в  кон-
 
   фигурацию.
 
 
        SYSGEN вызывает подпрограмму доставки  устройства  для
 
   каждого  устройства,  обслуживаемого  контроллером,   всего
 
   DEFUNITS раз, где DEFUNITS указан в параметре DEFUNITS  для
 
   макрокоманды DPTAB.
 
 
        Указание точки входа
 
 
        Нужно указать имя подпрограммы доставки устройства как
 
   параметр DELIVER в макрокоманды DPTAB.
 
 
        Входные параметры
 
 
      Регистр    Содержимое
 
       R3        Адрес IDB контроллера; 0, если IDB существует
 
       R4        Адрес CSR
 
       R5        Число устройств, которые подпрограмма
 
                 должна включить в конфигурацию
 
       R6        Адрес начала пространства ввода/вывода
 
 
                            - 254 -
 
                        00152-01 97 07-2
 
 
                 адаптера общей шины
 
       R7        Адрес ACF команды AUTOCONFIGURE
 
       R8        Адрес ADP общей шины
 
 
        Выходные параметры
 
 
        Если в R0 установлен бит 0, то устройство должно  быть
 
   включено в конфигурацию; если бит 0 очищен,  то  устройство
 
   не должно быть включено в конфигурацию.
 
 
        Использование регистров
 
 
        Подпрограмма может свободно пользоваться регистрами  с
 
   R0 по R2.  Она  должна  сохранить  содержимое  всех  других
 
   регистров.
 
 
        Контекст
 
 
        Подпрограмма выполняется в контексте процесса, в кото-
 
   ром выполняется SYSGEN.
 
 
        IPL при входе и выходе
 
 
        Подпрограмма вызывается на IPL$_POWER,  IPL  31  и  не
 
   должна понижать IPL.
 
 
        Использование точки входа
 
 
        Команда SYSGEN'а AUTOCONFIGURE  вызывает  подпрограмму
 
   доставки устроства.
 
 
 
 
 
 
 
 
 
 
 
 
                            - 255 -
 
                        00152-01 97 07-2
 
 
                                                  Приложение 5
 
 
 
 
 
        Пример драйвера аналого-цифрового преобразователя
 
 
 
 
 
        .SBTTL функциональное описание драйвера
 
   ;
 
   ; драйвер обеспечивает проверку группы каналов  с помощью
 
   ;  запросов на чтение  в  очереди  на   ввода/вывода
 
   ;
 
   ; доступные функции очереди на ввода/вывода
 
   ; IO$_READVBLK - чтение виртуального блока
 
   ; IO$_READLBLK - чтение логического блока
 
   ; IO$_READPBLK - чтение физического блока=IO$_LOOPBACK
 
   ; IO$_LOOPBACK - запись Dас, чтение результатов; запросы на
 
   ;                освобождение физического ввода/вывода
 
   ;
 
   ; стандартные параметры очереди на ввода/вывода
 
   ; P1= адрес буфера
 
   ; P2= буферный счетчик байтов
 
   ; P3= спецификатор проверяемых каналов:
 
   ;      бит 0-7/ начальный канал # /0-63/
 
   ;      бит 8-15/ # общий проверяемых каналов /1-64/
 
   ;      бит 16-23/ приращение канала /0-63/
 
   ;      бит 24-31/ игнорируется
 
   ; P4= Dас величина, используется только для циклич. Команд:
 
   ;      бит 0-7/ 8 бит Dас значения
 
   ;      бит 8-31/ игнорируется
 
   ; P5, P6 не используются
 
 
                            - 256 -
 
                        00152-01 97 07-2
 
 
   ;
 
   ; в дополнение к стандартным кодам состояния,  возвращаемым
 
   ; для очереди на ввода/вывода
 
   ; устройсва следующие значения состояний ввода/вывода
 
   ; SS$_DATAOVERUN - бит ошибки,  устанавливаемый в CSR;
 
   ;                  проверка заканчивается раньше времени  в
 
   ;                  буфере остается последний  неиспорченный
 
   ;                  пример
 
   ; SS$_BADPARAM   - неправильный спецификатор канала;
 
   ;                  примеры не выполняются
 
   ; SS$_BUFFEROVF  - пользователь перешел границу буфера;
 
   ;                  сколько каналов будет готово,
 
   ;                  те проверяются
 
   ;
 
   ; примеры  возвращаются в вызывающий буфер вызывающий буфер
 
   ; упакованными по одному в слово, биты 0-11. Счетчик байтов
 
   ; возвращается во второе слово блока состояний ввода/вывода
 
   ; причем в байтах, отражающих   действительное   заполнение
 
   ; данными  этого примера ставится. Количество  примеров со-
 
   ; держится в одной половине возвращаемого счетчика байтов.
 
   ;
 
   ; SWEEPBUF: .BLKW 32
 
   ; NUMINPUT: .LONG 32
 
   ; CHANSPEC: .BYTE 0,32,2  ;начинаем с канала 0;
 
   ;                         ;пример каналов 0,2,4,...,62
 
   ;
 
   ;           $QIO_S CHAN=X, FUNC=IO$_READVBLK,_
 
   ;                  P1=SWEEPBUF, р2=NUMINPUT, P3=CHANSPEC
 
   ;-
 
 
 
 
                            - 257 -
 
                        00152-01 97 07-2
 
 
        .SBTTL  вызовы макробиблиотек
 
   ;
 
   ; внешние символы :
 
   ;
 
        $CRBDEF   ; блок запросов канала - CRB
 
        $DDBDEF   ; блок данных устройства
 
        $IDBDEF   ; блок данных прерывания
 
        $IODEF    ; функциональные коды ввода/вывода
 
        $IPLDEF   ; определения IPL для аппаратуры
 
        $IRPDEF   ; пакет запросов на ввода/вывода
 
        $UCBDEF   ; управляющий блок устройства - UCB
 
        $VECDEF   ; блок вектора прерывания
 
        $JIBDEF   ; информационный блок задания
 
   ;
 
   ; пользователь  должен   определить    внешние     символы,
 
   ; содержащиеся в библиотеке пользователя. Содержимое  таких
 
   ; библиотек может соединяться   с  системной   библиотекой,
 
   ; разрешая   пользователю     использовать      расширенные
 
   ; коды без обьявления их локально.
 
   ; этот драйвер должен ассемблироваться   с "А"  библиотекой
 
   ; пользователя для определения  $XIODEF.
 
   ;
 
        $XIODEF ; расширенные функциональные коды ввода/вывода
 
                ; это MACRO содержит определения для петлевого
 
                 ; метода IO$_LOOPBACK
 
   ;
 
 
 
 
 
 
 
 
 
 
                            - 258 -
 
                        00152-01 97 07-2
 
 
               .SBTTL  локальные определения
 
   ; локальные определения:
 
   ; лист смещений аргумента QIO:
 
   ;
 
   р1=0          ; первый,
 
   р2=4          ; второй,
 
   р3=8          ; третий,
 
   р4=12         ; четвертый,
 
   р5=16         ; пятый,
 
   р6=20         ; и шестой параметры.
 
   ;
 
   ; параметры устройства:
 
   DAC_TIMER=20  ; 20 интервалов времени для установки DAC
 
   MAX_INLCH =63 ; максимальный начальный канал-
 
   MAX_NUMCH =64 ; количество каналов
 
   MAX_INCCH =63 ; и приращение канала
 
   ADC_TIMER=2   ; A/D преобразование по таймауту =2 секунды
 
   ;
 
   ; определение регистра устройства:
 
        $DEFINI  AD
 
   $DEF AD_CSR  .BLKW 1      ; регистр управления состоянием
 
        _VIELD  AD_CSR,0,<-  ; определение полей CSR.
 
        <GO,,M>,-            ; начало преобразования
 
        <,з>,-               ; з неизпользуемых бита
 
        <EXT,,M>,-           ; возможность внешнего старта
 
        <COV,,M>,-           ; возможность временного избытка
 
        <IE,,M>,-            ; возможность прерывания
 
        <DON,,M>,-           ; флаг преобразования
 
        <MUX,6,M>,-          ; 6 битов MUX канала - #
 
        <,I>,-               ; бит 14 не используется
 
 
                            - 259 -
 
                        00152-01 97 07-2
 
 
        <ERR,,M>,-           ; флаг ошибки
 
        >                    ; конец полей CSR
 
   $DEF AD_DBR  .BLKW I      ; буферный регистр данных
 
     .=.-2                   ; буф. Регистр данных=DAC буф.рег
 
   $DEF AD_DAC  .BLKW 1      ; буферный регистр данных DAC
 
        $DEFEND AD           ; конец определений регистра
 
   ;
 
   ; зависимые от устройства UCB расширения:
 
        $DEFINI UCB
 
     .=UCB$K_LENGTH         ; переход к концу стандартного UCB
 
                            ; замечание: следующие 4 байта
 
                            ; относятся к соседям
 
    $DEF   UCB$B_AD_CURCHN  .BLKB  1 ;текущий канал MUX-#
 
    $DEF   UCB$B_AD_NUMCHN  .BLKB  1 ;#каналы остав.для пример
 
    $DEF   UCB$B_AD_INCCHN  .BLKB  1 ; приращение канала
 
                            .BLKB  1 ; резервный байт
 
    $DEF   UCB$W_AD_CSR     .BLKW  1 ; сохранение CSR
 
           _VIELD  UCB$W_CSR,1,<_    ;заимствованный неисполь-
 
           <BRO,,M>,_                ; зований бит CSR
 
                                     ;если польз.перешел
 
                                     ;границы буфера
 
    USB$K_ADLENGTH=.                 ;длина А/D UCB
 
           $DEFEND UCB               ;конец расширений UCB
 
   ;
 
   ;использование драйвером временной памяти IRP:
 
    IRP$L_CHSPEC=IRP$L_MEDIA         ;спецификатор канала-(P3)
 
    IRP$L_DACVAL=IRP$L_MEDIA+4       ;необязательная  величи-
 
                                     ; на (р4)
 
 
 
 
 
 
                            - 260 -
 
                        00152-01 97 07-2
 
 
         .SBTTL прологовые и диспетчерские таблицы драйвера
 
   ;
 
   ; прологовая таблица драйвера:
 
   ;
 
         DPTAB _                     ;определение пролог.табл.
 
               END=AD_END,-          ;конец драйвера,
 
               ADAPTER=UBA,-         ;адаптер общей шины,
 
               UCBSIZE=UCB$K_ADLENGTH,-;размер UCB A/D,
 
               NAME=ADDRIVER         ;имя драйвера
 
                                     ;
 
         DPT_STORE      INIT         ;устанавл.при загрузке
 
         DPT_STORE      UCB,UCB$B_FIPL,B,8 ;форк-IPL устройст.
 
         DPT_STORE      UCB,UCB$B_DIPL.B,22;IPL устройства
 
         DPT_STORE      UCB,UCB$L_DEVCHAR,L,-;характеристики
 
                        <DEV$M_AVL-  ;доступное
 
                        !DEV$M_IDV-  ;входное устройство
 
                        !DEV$M_RTM>  ;уст-во реального времени
 
    DPT_STORE   REINIT               ;устанавл.при перезагруз.
 
    DPT_STORE   CRB,CRB$L_INTD+4,D,- ;адрес обслуж.прерывания
 
                AD_INTERRUPT
 
    DPT_STORE   CRB,_                ;адрес программы
 
                CRB$L_INTD+VEC$L_INITIAL,-;инициализации
 
             D,AD_CTLINIT            ;контроллера
 
    DPT_STORE   DDB,DDB$L_DDT,D,-    ;адрес диспетчерской
 
                AD$DDT               ;таблицы драйвера
 
                                     ;
 
    DPT_STORE   END                  ;конец прологавой таблицы
 
   ;
 
 
 
 
 
 
                            - 261 -
 
                        00152-01 97 07-2
 
 
 
 
   ; диспетчерская таблица драйвера:
 
   ;
 
    DDTAB   -                   ;макрокоманда образование DDT
 
            DEVNAM=AD,-         ;название устройства
 
            START=AD_STARTIO,-  ;адрес программы начала ввода/
 
                                ;вывода
 
            FUNCTB=AD_FUNCTABLE ;адрес FDT
 
 
 
 
 
 
 
 
 
 
 
 
 
                            - 262 -
 
                        00152-01 97 07-2
 
 
    .SBTTL таблица выбора функций аналого-цифрового устройства
 
   ;
 
   ; таблица выбора функций  - FDT
 
   ;
 
    AD_FUNCTABLE:               ;начало FDT
 
         FUNCTAB ,-             ;разрешенные функции:
 
                 <LOOPBACK,-    ;циклическое чтение
 
                 READPBLK,-     ;чтение физического блока
 
                 READLBLK,-     ;чтение логического блока
 
                 READVBLK>      ;чтение виртуального блока
 
         FUNCTAB ,-             ;функции буферизованного
 
                                ;ввода/вывода:
 
                 <LOOPBACK,-    ;циклическое чтение
 
                 READPBLK,-     ;чтение физического блока
 
                 READLBLK,-     ;чтение логического блока
 
                 READVBLK>      ;чтение виртуального блока
 
         FUNCTAB -              ;препроцессорные программы:
 
                 AD_READ,-      ;вызов одного препроцессора
 
                 <LOOPBACK,-    ; дла циклического чтения
 
                 READPBLK,-     ;чтения физического блока
 
                 READLBLK,-     ;чтения логического блока
 
                 READVBLK       ;и чтения виртуального блока
 
   ;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
                            - 263 -
 
                        00152-01 97 07-2
 
 
         .SBTTL AD_READ:    выполнение функции чтения
 
   ;+
 
   ; AD_READ - препроцессорная функция чтения
 
   ;
 
   ; эта    программа  вызывается диспетчером из   таблицы
 
   ; выбора функции  для выполнения физического чтения,ло-
 
   ; гического чтения, чтения виртуального или циклических
 
   ; функций ввода/вывода.
 
   ; AD_READ с начала проверяет правильнось вызывающих пара-
 
   ; метров, завершает запрос нормально или как  ошибочный,
 
   ; если необходимо. Р3 и р4 сохраняют IRP. Системный  бу-
 
   ; фер выделен, а  его адрес сохраняется в IRP. Квота вре-
 
   ; мени для вызывающего скорректирована, а запрос на  чте-
 
   ; ние поставлен в очередь к драйверу для запуска.
 
   ; входные данные:
 
   ;      R0,R1,R2=рабочие
 
   ;      R3 = адрес IRP
 
   ;      R4 = адрес рсв для текущего процесса
 
   ;      R5 = адрес UCB устройства
 
   ;      R6 = адрес ссв
 
   ;      R7 = функциональный код ввода/вывода
 
   ;      R8 = диспетчерский адрес FDT
 
   ;      R9-R11 = рабочие
 
   ;      AP = адрес листа функциональных параметров
 
   ;
 
   ;  выходные данные:
 
   ;      R0,R1,R2 = сбрасываются
 
   ;      R3-R11,AP = сохраняются
 
   ;      IRP$L_CHSPEC/R3/ = спецификатор канала/р3/
 
   ;      IRP$L_DACVAL/R3/ = необязательное значение DAC/р4/
 
 
                            - 264 -
 
                        00152-01 97 07-2
 
 
   ;      IRP$L_SVAPTE/R3/ = адрес назначенного системного
 
   ;                         буфера
 
   ;      IRP$W_BOFF/R3/ = счетчик байтов запроса
 
   ;
 
   ;     системный буфер:
 
   ;     длинное слова 0 - адрес начала данных= BUFF ADDR+12;
 
   ;     длинное слова 1 - адрес буфера пользователя;
 
   ;     длинное слова 2 - структура данных для бухгалтерии;
 
   ;-
 
         .ENABL   LSB
 
   AD_READ:                         ;препроцессорная функция
 
                                    ;чтения
 
         MOVZWL   P2(AP),R1         ;получение счетчика байтов
 
                                    ; пользователя
 
         BEQL     IO$               ;переход, если 0 байтов
 
                                    ;чтения(=немедленный
 
                                    ;успех)
 
         MOVZWL   #SS$_BADPARAM,R0  ;обознач.ошибки для канала
 
         MOVAL    р3(ар),R2         ;адрес спецификации канала
 
         CMPB     (R2)+,#MAX_INLCHN ;начал. # канала слишком
 
                                    ;велик?
 
         BGTRU    20$               ;переход, если да
 
         TSTB     (R2)              ; # канала =0 ?
 
         BEQL     IO$               ;переход,если да(удачно)
 
         CMPB     (R2)+,#MAX_NUMCHN ; # каналов для проверки
 
                                    ;велика?
 
         BGTRU    20$               ;переход, если да
 
         CMPB     (R2),#MAX_INCCHN  ;велико приращение канала?
 
         BGTRU    20$               ; переход, если да
 
         MOVQ     P3(AP),IRP$L_CHSPEC(R3) ;сохранение р3 и р4
 
       [5~
                            - 265 -
 
                        00152-01 97 07-2
 
 
                                    ;(необязательно) в IRP до
 
                                    ;выполнения запроса
 
         MOVL     P1(AP),R0         ;получение адр.польз.бу-
 
                                    ; фера
 
         JSB      G^EXE$READCHK     ;проверка, имеет ли вызы-
 
                                    ;вающий доступ записи  в
 
                                    ;буфер
 
         PUSHR    #^M<R0,R3>        ;сохранение адр.польз.буф.
 
                                    ;IRP адреса
 
         аDDL     #12,R1            ;+12 байтов к буферу запр.
 
                                    ;для заголовка буфера
 
         JSB      G^EXE$BUFFRQUOTA  ;проверка буферного прос-
 
                                    ;транства предоставл.квоте
 
                                    ;вызывающего
 
         BLBC     R0,30$            ;переход, если квота мала
 
         JSB      G^EXE$ALLOCBUF    ;назначение системного
 
                                    ;буфера
 
         BLBC     R0,30$            ;переход, если недоступен
 
         POPR     #^M<R0,R3>        ;сохр.польз.буф.,адр. IRP
 
         MOVL     R2,IRP$W_SVAPTE(R3);сохр.адр.системного буфе
 
                                    ;ра
 
         MOVW     R1,IRP$W_BOFE(R3) ;и счетчика байтов запроса
 
         MOVZWL   R1,R1             ;преобразование в длинное
 
                                    ;слово
 
         MOVL     PCB$L_JIB(R4),R4  ;инф.блок адр.задания
 
         SUBL     R1,JIB$L_BYTCNT(R4) ;вычитание счетчика бай-
 
                                    ;тов у квоты процесса
 
         MOVAB    12(R2),(R2)+      ;сохр.адр.начала польз.
 
                                    ;данных в 1-м сл.сист.буф.
 
         MOVL     R0,(R2)           ;сохр.адр.польз.буф.во
 
 
                            - 266 -
 
                        00152-01 97 07-2
 
 
                                    ;втором длинном слове
 
         JMP      C^EXE$QIODVPKT    ;очередь ввода/вывода ркт
 
                                    ;к драйверу
 
   ; сюда передается управление, если пользователь затребовал
 
   ; чтение 0 байтов или 0 каналов. Это всегда успешно, но не
 
   ; выполняется устройством  ввода/вывода:
 
   ;
 
   10$:  MOVZWL   #SS$_NORMAL,R0     ;нормальное окончание
 
   20$:  JMP      C^EXE$FINISHIOC    ;завершение запроса в/в.
 
   ;
 
   ; сюда передается управление,если преждевременное окончание
 
   ; запроса причем состояние записано в R0:
 
   ;
 
   30$:  POPR     #^M<R2,R3>         ;чистка адр.буф.,сохране-
 
                                     ;ние адр. IRP
 
         JMP      C^EXE$ABORTIO      ;завершение запроса
 
         .DSABL   LSB
 
 
 
 
 
 
 
 
 
                            - 267 -
 
                        00152-01 97 07-2
 
 
         .SBTTL   AD_STARTIO:   выполнение А/D преобразований
 
   ;+
 
   ; AD_STARTIO - начало операции ввода/вывода
 
   ; эта программа начинает работу, если ассоциативный блок
 
   ; незанят и пакет запросов доступен для выполнения.
 
   ;
 
   ; при подготовке к проверке AD_STARTIO выполняет следующие
 
   ; шаги:
 
   ; 1.настраивает UCB на спецификацию канала и адрес в сис-
 
   ; темном буфере для загрузки первого примера.
 
   ; 2.если определены циклы, DAС устанавливается со значением
 
   ; определенном вызывателем.
 
   ;
 
   ; драйвер выполняет циклы от  AD_NXTSAMPLE  до  AD_ENDAMPLE
 
   ; собирая   примера, пока все примеры не будут собраты, или
 
   ; довозникновения ошибки. Прерывание получается для каждого
 
   ; примера, но, для сохранения  времени, драйвер  не   будет
 
   ; разветвляеться до момента окончания запроса на ввод/вывод
 
   ;
 
   ; входные данные:
 
   ;     R3 = адрес IRP
 
   ;     R5 = адрес UCB блока устройства
 
   ;
 
   ; выходные данные:
 
   ;     R0,R1,R2 = не сохраняются
 
   ;     другие регистры сохраняются
 
   ;-
 
         .ENABL   LSB
 
   AD_STARTIO:                  ;начало след.QIO
 
         MOVL     IRP$L_CH$PEC(R3),- ;копия спец.канала из IRP
 
 
                            - 268 -
 
                        00152-01 97 07-2
 
 
                  UCB$B_AD_CURCHN(R5);в UCB
 
         MOVL     @IRP$L_SVAPTE(R3),-;уст.адр.начала данных
 
                  UCB$L_SVAPTE(R5)   ;в UCB
 
         MOVL     UCB$L_CRB(R5),R4   ;получ.адр.CRB,
 
         MOVL     @CRB$L_INTD+VEC$L_IDB(R4),R4  ;после адр.CSR
 
         BICB3    #^C<IO$M_FCODE>-   ;получение функциональног
 
                  IRP$W_FUNC(R3),R0  ;кода ввода/вывода
 
         CMPB     R0,#IO$_LOOPBACK   ; цикл ?
 
         BNEQ     AD-_NXTSAMPLE       ;переход, если нет
 
         MOVZBW   IRP$L_DACVAL(R3),- ;уст.значения DAC в
 
                  AD_DAC(R4)         ;буф.регистре DAC
 
         MFPR     S^#PR$_ICR,RI      ;получен.тек.интервала
 
                                     ;счетчика
 
         ADDL     #DAC_TIMER,R1      ;+DAC назнач.времени к R1
 
         BLSS     10$                ;переход, если счетч. Не
 
                                     ; переполнен
 
         MOVAW    -10000(R1),R1      ;иначе вычисление счетчик
 
                                     ;для следующ. Интервала
 
   10$:  MFPR    S^#PR$_ICR,R0      ; чтение текущ.счетчика
 
         CMPL      R0,R1             ;кончилось устан.время ?
 
         BLSS     10$                ;переход, если нет
 
   AD_NXTSAMPLE:                     ;начало след.примера
 
         MOVZBW   #AD_CSR_M_IE!AD_CSR_M_GO,R0 ;уст.разреш.
 
                                ;прерывания и начало преобраз.
 
         INSV     UCB$B_AD_CURCHN(R5)<,-#8,#6,R0
 
   ; установка MAX канала =- # для CSR
 
         DSBINT                      ;блокировка прерывания
 
                                     ;(IPL=IPL$POWER)
 
         BBSC     #UCB$V_POWER,-     ;переход при сбоя питания
 
                 UCB$W_STS(R5),AD_POWERFAIL ;и чистка признака
 
 
                            - 269 -
 
                        00152-01 97 07-2
 
 
                                     ;сбоя питания
 
         MOVW     R0,AD_CSR(R4)    ;установка CSR
 
   WFIKPCH AD_TIMEOUT,#ADC_TIMER   ;ожид.прерыв.или таймаута
 
         MOVW     AD_CSR(R4),USB#W_AD_CSR(R5)
 
   ; сохранение CSR в UCB
 
         BLSS     AD_CSRERROR        ;переход если ошибка
 
         MOVW     AD_DBR(R4),@UCB$L_SVARTE(R5)
 
   ; копия значения A/D в системный буфер
 
         ADDL     #2.UCB$L_SVAPTE(R5) ;шаг указателя буфера
 
         SUBL     #2,UCB$W_BCNT(R5)   ;умен.кол.байтов запроса
 
         DECB     UCB$B_AD_NUMCHN(R5) ;умен.номера канала
 
         BEQL     AD_DONE             ;переход если больше нет
 
         CMPW     UCB$W_BCNT(R5),#2   ;последн.2 байта в буф.?
 
         BLSSU    AD_BUFFEROVF        ;переход, если нет
 
         BICW     #UCB$W_CSR_M_BFO,-  ;иначе очищ.буф.бита
 
                  UCB$W_AD_CSR(R5)   ;переполнения в копии CSR
 
         ADDB     UCB$B_AD_INCCHN(R5),UCB$B_AD_CURCHN(R5)
 
   ; след.канал #=тек.канал + приращение
 
         BICB     #^C<MAX_NUMCHN-1>,- ;модуль максимального
 
                  UCB$B_AD_CURCHN(R5) ;канала
 
   AD_ENDSAMPLE:                      ;окончание этого примера
 
         BRB      AD_NXTSAMPLE        ;переход на начало
 
                                      ;следующего примера
 
         .DSABL   LSB
 
 
 
 
 
 
 
 
 
 
 
 
 
 
                            - 270 -
 
                        00152-01 97 07-2
 
 
         .SBTTL       окончание запроса ввода/вывода
 
   ;
 
   ; сюда передается управление, если запрос на ввод/вывод
 
   ; окончился нормально или с ошибкой.
 
   ; переполнение пользовательского буфера, то есть нельзя
 
   ; больше собрать ни одного примера:
 
         .ENABL    LSB
 
   AD_BUFFEROVF:
 
         BISW      #UCB$W_CSR_M_BFO,-;установка бита переполн.
 
                   UCB$W_A_CSR(R5)   ;буф. в копии CSR
 
   ; бит ошибки в CSR установлен:
 
   аAD_CSRERROR:
 
           TSTW       AD_DBR(R4)       ;очищение ошибки
 
         BRB       AD_DONE            ;присоед.к общего оконч.
 
                                      ;ввода/вывода
 
   ; таймаут устройства обусловлен либо действительным
 
   ; таймаутом, либо падением напряжения. Оба случая
 
   ; обрабатываются одинаково.
 
   A_TIMEOUT:
 
        CLRW     AD_CSR(R4)            ;снимаем разреш.прерыв.
 
        TSTW     AD_DBR(R4)            ;ожид.преобразования
 
                                       ;или ошибка
 
        SETIPL   UCB$B_FIPL(R5)        ;уменьш.приоритета
 
                                       ;уровню устройства
 
        BRB     10$                    ;соединение общего кода
 
                                       ;и законченного запроса
 
   ; падение напряжения,обнаруженное при попытке инициализации
 
   ; чтения или цикла запроса. Окончание запроса такое же, как
 
   ; в случае QIO.
 
   AD_POWERFAIL:                       ;
 
 
                            - 271 -
 
                        00152-01 97 07-2
 
 
         ENBINT                        ;сниженный IPL возвращ.
 
                                       ;в форк IPL
 
   10$:  MOVZWL   #SS$_TIMEOUT,R0      ;установка состояния
 
                                       ;таймаута
 
         BRB      20$
 
   ; нормальное состояние, аннулирование ввода/вывода, и общее
 
   ; завершение запроса на ввод/вывод:
 
   AD_DONE:                          ;
 
         CLRW     AD_CSR(R4)         ;чистка возможного прерыв
 
         IOFORK                      ;запрос продолжается как
 
                                     ;форк-процесс
 
         MOVZWL   #SS$_DATAOVERRUN,R0;засыл.ошибки в CSR
 
         BBS      #AD_CSR_V_ERR,-    ;переход, если да
 
                  UCB$W_AD_CSR(R5),20$
 
         MOVZWL   #SS$BUFFEROVF,R0   ;засыл.переполнения в буф
 
         BBS      #UCB$W_CSR_V_BFO,- ;переход,если да
 
                   UCB$W_AD_CSR(R5),20$
 
         MOVZWL   #SS$_NORMAL,R0     ;состояние нормального
 
                                     ;завершения
 
   20$:  SUBW3    UCB$W_BCNT(R5),-   ;получ.запрош.байтов
 
                  IRP$W_BCNT(R3),R1  ;-# байты не XFERRED
 
         INSV     R1,#16,#16,R0      ;=# байты XFERRED
 
         CLRL     R1                 ;чистка вторичного слова
 
                                     ;состояния ввода/вывода
 
         REQCOM                      ;окончание запроса в/в
 
         .DSABL   LSB
 
   ;
 
 
 
 
 
 
 
 
                            - 272 -
 
                        00152-01 97 07-2
 
 
          .SBTTL   AD_INTERRUPT -  обслуживание прерываний.
 
   ;
 
   ; эта программа получает управление по JSB в случае возник-
 
   ; новения прерывания преобразователя. Обслуживание прерыва-
 
   ; ния получает адрес UCB интерпретируемого устройства, сох-
 
   ; раняет  оставшийся  контекст  драйверного   форк-процесса
 
   ; который инициализировал готовность устройства, и вызывает
 
   ; форк-процесс  драйвера.
 
   ;
 
   ; входные данные:
 
   ;     все общие регистры = произвольно
 
   ;     SP/ стек прерывания
 
   ;     0(SP) = адрес адреса IDB
 
   ;     4(SP) = сохраняет R0
 
   ;     8(SP) = сохран. R1
 
   ;    12(SP) = сохран. R2
 
   ;    16(SP) = сохран. R3
 
   ;    20(SP) = сохрон. R4
 
   ;    24(SP) = сохрон. R5
 
   ;    28(SP) = сохран. Рс
 
   ;    32(SP) = сохран. PSL
 
   ;    IPL - уровень прерывания  устройства
 
   ;
 
   ; выходные данные:
 
   ;     R3 = восстанавливается из форк-процесса  драйвера
 
   ;          (IRP  ADDR)
 
   ;     R4 = восстанавливается из форк-процесса драйвера CSR
 
   ;     R5 = адрес UCB
 
   ;     стек как и раньше, но указатель IDB сброшен
 
   ;     IPL - уровень прерывания  устройства
 
 
                            - 273 -
 
                        00152-01 97 07-2
 
 
   ;-
 
         .ENABL   LSB
 
   AD_INTERRUPT:                    ;обсл.прерывания
 
        MOVL     @(SP)+,R3          ;R3:=адрес IDB
 
        MOVQ     IDB$L_CSR(R3),R4   ;R4:=адрес CSR
 
        BBCC     #UCB$V_INT,-       ;переход,если прерывание
 
                 UCB$W_STS(R5),AD_UNSOL ;неожиданое и чистка
 
                                        ;бита ожидания
 
        MOVL     UCB$L_FR3(R5),R3   ;восст.оставш.драйверного
 
                                    ;контекста:R3;R4 уже
 
                                    ; устан.
 
        JSB      @UCB$L_FPC(R5)     ;вызов форк-процесса
 
                                    ; драйвера
 
   IO$: MOVQ     (SP)+,R0           ;восст. Регистров
 
        MOVQ     (SP)+,R2           ;
 
        MOVQ     (SP)+,R4           ;
 
        REI                         ;
 
   AD_UNSOL:                        ;не затребован.прерывание
 
        CLRW     AD_CSR(R4)         ;прекращение ложного прер.
 
        TSTW     AD_DBR(R4)         ;чтен.буф.дан.для очищения
 
                                    ;ошибок
 
        BRB      IO$                ;присоединение к восстано-
 
                                    ;влению прерывания
 
         .DSABL   LSB
 
 
 
 
 
 
 
 
 
 
 
 
 
 
                            - 274 -
 
                        00152-01 97 07-2
 
 
         .SBTTL  AD_CTLINIT  инициализация контроллера
 
   ;
 
   ; эта  программа  вызывается при  рестарте  системы и после
 
   ; падения напряжения.
 
   ; CSR  очищается  для  блокировки  прерываний. Это заставит
 
   ; последний  пример, если  еще один  есть в запасе, выйти в
 
   ; таймаут в случае, если инициализация является результатом
 
   ; падения напряжения.
 
   ; таймаут будет продолжать в течение 0-1 секунд.
 
   ;
 
   ; регистр буфера   данных считывается для очистки ожидающих
 
   ; решения преобразований, прерывания или ошибки для инициа-
 
   ; лизации устройства.
 
   ;
 
   ; входные данные:
 
   ;     R4 = адрес CSR.
 
   ;     R5 = адрес IDB блока устройства
 
   ;     R6 = адрес DDB
 
   ;     R8 = адрес CRB
 
   ;
 
   ; выходные данные:
 
   ;     все регистры сохранены
 
   ;-
 
   AD_CTLINIT:
 
         CLRW     AD_CSR(R4)        ;чистка CSR
 
         TSTW     AD_DBR(R4)         ;чистка всех ожид.реш.
 
                                     ;преобразований,
 
                                     ;прерываний или ошибок
 
         RSB                         ;
 
 
 
 
                            - 275 -
 
                        00152-01 97 07-2
 
 
         .SBTTL   AD_UNITINIT  инициализация устройства
 
   ;+
 
   ; AD_UNITINIT - инициализация уст. Аналого-цифрового
 
   ;               преобразователя.
 
   ;
 
   ; эта программа вызывается при рестарте системы и после
 
   ; падения напряжения. UCB и IDB инициализируются.
 
   ;
 
   ; входные данные:
 
   ;     R5 = адрес UCB устройства
 
   ;
 
   ; выходные данные:
 
   ;     R0 = адрес IDB
 
   ;     остальные регистры сохранены
 
   ;     UCB$W_STS(R5), установка бита неавтономности
 
   ;     IDB$L_OWNER(R0) = адрес владельца UCB
 
   ;-
 
   AD_UNITINIT:                      ;
 
         BISW     #UCB$M_ONLINE,-    ;установка бита
 
                  UCB$W_STS(R5)      ;
 
         MOVL     UCB$L_CRB(R5),R0   ;получение адреса CSR
 
         MOVL     CRB$L_INTD+VEC$L_IDB(R0),R0   ;получ.адр.IDB
 
         MOVL     R5,IDB$L_OWNER(R0) ;уст.адр.UCB владельца
 
         RSB                         ;
 
                                     ;
 
   AD_END:                           ;конец  драйвера
 
         .END
 
 
 
 
 
 
 
 
                            - 276 -
 
                        00152-01 97 07-2
 
 
                                                  Приложение 6
 
 
 
 
 
                        Основные термины
 
 
 
 
 
        Адаптер общей шины
        ------------------
 
        Интерфейс с устройством обратной связи для общей шины.
 
 
 
 
        Аппаратный рсв
        --------------
 
        Структура данных, известная процессору, которая содер-
 
   жит контекст  аппаратуры  во  время  бездействия  процесса.
 
   Аппаратный рсв процесса находится в заголовке процесса.
 
 
 
 
        Асинхронное системное прерывание (AST)
        --------------------------------------
 
        Прерываие,  инициированное  программным   обеспечением
 
   обслуживающей программы,  определенной  пользователем.  Это
 
   системное прерывание асинхронно уведомляет процесс  пользо-
 
   вателя о действиях при наступлении особого случая.  Если  в
 
   процессе  выполнения  программы  пользователя   встречается
 
   программно определенное  асинхронное  системное  прерывание
 
   для какого-либо события, система прерывает выполнение  про-
 
   цесса и выполняет программу, обслуживающую это событие.  По
 
   окончании работы программы обслуживания  асинхронного  сис-
 
   темного прерывания система продолжает выполнение прерванной
 
   программы с того места, где произошло прерывание.
 
 
 
 
 
                            - 277 -
 
                        00152-01 97 07-2
 
 
 
 
        База данных
        -----------
 
        1. Все места расположения данных, описанных  системным
 
   управлением базы данных.
 
 
        2. Множество структур связанных данных.
 
 
 
 
        База данных ввода/вывода
        ------------------------
 
        Набор структур данных в системе МОС ВП, который описы-
 
   вает запросы на ввод/вывод, контроллеры,  блоки  устройств,
 
   тома и драйверы устройств. Например; диспетчерская  таблица
 
   драйвера, прологовая таблица драйвера, таблица данных  уст-
 
   ройства, управляющий блок устройства, блок запросов канала,
 
   пакет запросов на ввод/вывод и блок данных при прерывании.
 
 
 
 
        Форк блок (блок ветвления)
        -------------------------
 
        Часть блока управления  устройством,  содержащая  кон-
 
   текст драйвера в то время, когда драйвер  ожидает  подкачки
 
   ресурсов. При ожидании драйвером ресурсов процессора  необ-
 
   ходим блок ветвления, включенный в блокочеред   ветвления.



 
 
        Блок данных устройства
        -----------------------
 
        Структура в базе данных ввода/вывода, идентифицирующая
 
   общее имя для устройства и контроллера и имя  драйвера  для
 
   набора устройств, подключенных к тому же контроллеру.
 
 
 
 
                            - 278 -
 
                        00152-01 97 07-2
 
 
 
 
        Блок запросов канала
        ---------------------
 
        Структура в базе  данных  ввода/вывода,  отслеживающая
 
   активность определенного контроллера. Блок запросов  канала
 
   для контроллера содержит  указатели  для  очереди  ожидания
 
   готовности драйверов при доступе к устройству  через  конт-
 
   роллер.
 
 
 
 
        Блок состояния ввода/вывода
        ----------------------------
 
        Структура данных  , сообщающаяся с системным  обслужи-
 
   ванием очереди запросов на ввод/вывод. Эта служба не обяза-
 
   на возвращать код состояния, количество переданных байтов и
 
   функционально зависимую информацию  от  устройства  в  блок
 
   состояния ввода/вывода. Возвращение  информации  происходит
 
   не от сервисного вызова, а заполняется МОС ВП при  заверше-
 
   нии работы запроса на ввод/вывод.
 
 
 
 
        Блок управления адаптером
        --------------------------
 
        Структура  в  базе  данных  ввода/вывода,  описывающая
 
   адаптера.
 
 
 
 
        Блок управления каналом
        ------------------------
 
        Структура в базе  данных  ввода/вывода,  обслуживаемая
 
   системным сервисом назначения канала ввода/вывода для  опи-
 
   сания устройства, к которому подсоединен канал.
 
 
 
 
 
                            - 279 -
 
                        00152-01 97 07-2
 
 
 
 
        Блок управления процессом - PCB
        --------------------------------
 
        Структура данных, в которой хранится контекст  процес-
 
   са. Блок управления процессом аппаратуры содержит  контекст
 
   аппаратуры. PCB программного обеспечения содержит  контекст
 
   программного обеспечения с указателем на PCB аппаратуры.
 
 
 
 
        Блок управления программным процессом
        ---------------------------------------
 
        Структура данных, хранящая контекст программного  про-
 
   цесса. Операционная система определяет  PCB  программы  для
 
   каждого процесса при его образовании. PCB программы  содер-
 
   жит следующую информацию  о  процессе:  текущее  состояние,
 
   адрес памяти, если была выгрузка из  памяти;  идентификатор
 
   процесса и адрес начала  процесса  /где  содержится  и  PCB
 
   аппаратуры/. PCB программы находится  в  системной  области
 
   виртуального адресного  пространства.  Оно  не  выгружается
 
   вместе с процессом.
 
 
 
 
        Блок управления устройством
        ----------------------------
 
        Структура в базе данных ввода/вывода,  которая  описы-
 
   вает параметры активного в данный момент  устройства.  Блок
 
   управления устройством  также  хранит  блок  ветвления  для
 
   драйвера этого устройства, причем блок  ветвления  является
 
   основной частью процесса ветвления драйвера. Блок  управле-
 
   ния  устройства  также  обеспечивает  драйвер   статической
 
   памятью.
 
 
 
 
 
                            - 280 -
 
                        00152-01 97 07-2
 
 
 
 
        Блок устройства
        -----------------
 
        Один управляющий блок и его управляющая логика, напри-
 
   мер, управление диском или терминалом. Некоторые контролле-
 
   ры могут об'едитять несколько блоков  устройств,  подсоеди-
 
   ненных к одному контроллеру; например контроллеры  массовой
 
   памяти.
 
 
 
 
        Блокировка ввода/вывода
        ------------------------
 
        Состояние страницы, при котором она не может быть про-
 
   нумерована или выгружена из памяти.
 
 
 
 
        Блокировка страницы в памяти
        -----------------------------
 
        Образ страницы становится недоступным для нумерации  и
 
   обмена. Страница в физической памяти остается заблокирован-
 
   ной до тех пор, пока МОС ВП специально не разблокирует ее.
 
 
 
 
        Вектор, вектор прерывания
        -------------------------
 
        1. Вектор прерывания или исключения, являющийся  ячей-
 
   кой в памяти, известной системе, которая содержит начальный
 
   адрес программы, которая будет выполняться, если произойдет
 
   указанное прерывание или  исключение.  Система  имеет  свой
 
   вектор для каждого прерывания адаптера и всех классов  иск-
 
   лючений. Каждый системный вектор является двойным словом.
 
 
        2. ДЛЯ УПРАВЛЕНИЯ ИСКЛЮЧЕНИЕМ ПОЛЬЗОВАТЕЛИ МОГУТ  НАЗ-
 
   начать по 2 вектора исключения / первичный и вторичный/ для
 
 
                            - 281 -
 
                        00152-01 97 07-2
 
 
   каждого из четырех методов доступа. Каждый вектор  содержит
 
   адресс  условного управления.
 
 
        3. ОДНОМЕРНЫЙ МАССИВ.
 
 
 
 
        Внутренняя обратная связь
        -------------------------
 
        Внутренняя шина процессора, которую адаптер общей  шин
 
   используют для связи с основной памятью и центральным  про-
 
   цессором. Обратная внутренняя связь  называется  синхронной
 
   внутренней обратной связью в процессоре комплекса СМ1700.
 
 
 
 
        Вспомогательный управляющий процесс - ACP
        ------------------------------------------
 
        Процесс, действующий как интерфейс  между  программами
 
   пользователя и  драйвером  ввода/вывода.  ACP  обеспечивает
 
   выполнение таких дополнительных функций для  драйвера,  как
 
   работа с файловой структурой. Примеры ACP: управление  фай-
 
   лами, управление магнитной лентой, сетевое управление.
 
 
 
 
        Вызов команд
        -------------
 
        Команды процессора CALLG (вызов процедуры с  основными
 
   аргументами) и CALLS (вызов процедуры с аргументами, храня-
 
   щимися в стеке).
 
 
 
 
        Диагностика
        -------------
 
        Программа , тестирующая аппаратуру, работу  периферий-
 
   ных устройств, логику, память и отчеты, содержащие  обнару-
 
 
 
                            - 282 -
 
                        00152-01 97 07-2
 
 
   жение какого-либо дефекта.
 
 
 
 
        Диспетчер
        ----------
 
        Общее название для группы процедур, включенных в  опе-
 
   рационную систему, которые обеспечивают  основной  контроль
 
   управления и функционирование операционной системы.
 
 
 
 
        Диспетчерский блок прерываний
        -----------------------------
 
        Структура в базе данных ввода/вывода,  которая  описы-
 
   вает характеристики определенного контроллера  и  указатели
 
   на устройства, прикрепленные к этому контроллеру.
 
 
 
 
        Диспетчер ветвления
        -------------------
 
        Программа, обслуживающая прерывание МОС ВП происшедшее
 
   при прерывании программного обеспечения с приоритетом  пре-
 
   рывания при ветвлении.
 
 
 
 
        Диспетчерская таблица драйвера
        ------------------------------
 
        Таблица в пространстве ввода/вывода, в  которой  пере-
 
   числяются входные адреса  программ  стандартных  драйверов,
 
   величины диагностики и буферы регистрации ошибок  для  уст-
 
   ройства.
 
 
 
 
 
 
 
 
 
 
                            - 283 -
 
                        00152-01 97 07-2
 
 
        Драйвер, драйвер ввода/вывода
        -----------------------------
 
        Множество  кодов  и  таблиц,  управляющих  физическими
 
   командами ввода/вывода устройства.
 
 
 
 
        Идентификатор процесса  (PID)
        ----------------------------
 
        Тридцати  двухбитная  двоичная  величина,   однозначно
 
   идентифицирующая процесс. Каждый процесс имеет свой иденти-
 
   фикатор и название.
 
 
 
 
        Исключение
        -----------
 
        Событие,  обнаруженное  аппаратной,  или   программным
 
   обеспечением (но не обычные прерывания, переходы,  условные
 
   переходы, случай или вызов команды), который изменяет  нор-
 
   мальное  выполнение  команды.  Исключение  может  произойти
 
   только во время выполнения инструкции или набора инструкций
 
   (тогда как прерывание вызывается активной задачей независи-
 
   мо от текущей команды). Существует три типа аппаратных иск-
 
   лючений:  прерывания  при  возникновении  непредусмотренной
 
   ситуации, дефекты  и  преждевременные  прекращения  работы.
 
   Например: попытки выполнить привилегированную или резервную
 
   команду, регистрационные прерывания, дефекты совместимости,
 
   точка прерывания в программе и арифметические прерывания.
 
 
 
 
        Канал
        -----
 
        Логический путь, по которому пользовательский  процесс
 
   связывается с физическим устройством. Пользовательский про-
 
 
 
                            - 284 -
 
                        00152-01 97 07-2
 
 
   цесс запрашивает операционную систему о  назначении  канала
 
   для связи процесса  с  устройством.  См.  также  контроллер
 
   канала.
 
 
 
 
        Квота
        -----
 
        Общая сумма системного ресурса, такого как время цент-
 
   рального процессора, которое разрешается использовать зада-
 
   нию за указанный период, причем это определяется  из  файла
 
   пользователя управлением системы. См. также "лимит".
 
 
 
 
        Код состояния
        -------------
 
        Двухсловная величина, которая  указывает  на  успешную
 
   или нет  работу  определенной  функции.  Например,  система
 
   возвращает код состояния в  нулевой  регистр  по  окончании
 
   какой-либо работы.
 
 
 
 
        Консоль
        -------
 
        Ручной блок управления, присоединенный к  центральному
 
   процессору. Консоль имеет стандартный интерфейс,  присоеди-
 
   ненный к устройству для распечатки листингов. Это позволяет
 
   оператору запускать и останавливать систему, работу систем-
 
   ного монитора и выполнение диагностики.
 
 
 
 
        Консольный терминал
        -------------------
 
        Устройство, распечатывающие листинги, присоединенное к
 
   консоли центрального процессора.
 
 
                            - 285 -
 
                        00152-01 97 07-2
 
 
 
 
        Контекст
        --------
 
        Окружение активной задачи. См. также "контекст процес-
 
   са", " контекст аппаратуры", "контекст программного обеспе-
 
   чения".
 
 
 
 
        Контекст аппаратуры
        -------------------
 
        Величины, хранящиеся во время  выполнения  процесса  в
 
   следующих регистрах: PC, PSL, 14 общих регистров / от 0  до
 
   13/; 4 регистра процессора / POBR, POLR, PIBR и PILR /; эти
 
   величины описывают процессы в виртуальном  адресном  прост-
 
   ранстве; SP для текущего метода доступа работы  процессора;
 
   плюс содержимое ячеек, которые загружаются в SP при  других
 
   методах доступа.  Во  время  выполнения  процесса  контекст
 
   аппаратуры корректируется процессом. У  неработающего  про-
 
   цесса контекст аппаратуры хранится в его  аппаратном  блоке
 
   управления процесса.
 
 
 
 
        Контекст программного обеспечения
        ---------------------------------
 
        Контекст, поддерживаемый МОС ВП для описания процесса.
 
   См. "блок  управления  процесса  программного  обеспечения.
 
   /РСВ/."
 
 
 
 
        Контекст процесса
        -----------------
 
        Контексты аппаратуры и программного  обеспечения  про-
 
   цесса
 
 
                            - 286 -
 
                        00152-01 97 07-2
 
 
 
 
        Контроллер канала
        -----------------
 
        Логический путь, по  которому  драйверу  устройства  с
 
   многоблочным контроллером может  быть  разрешен  доступ  до
 
   начала работы устройства.
 
 
 
 
        Лимит
        -----
 
        Размер или число единиц требующихся системных ресурсов
 
   / таких как почтовые ящики, блокированные страницы, запросы
 
   на ввод/вывод или доступные файлы /, которыми, как  опреде-
 
   лено системным  управлением  для  пользовательского  файла,
 
   разрешается пользоваться заданию единовременно при работе.
 
 
 
 
        Логическая функция ввода/вывода
        -------------------------------
 
        Множество команд / например, чтение и запись  логичес-
 
   кого блока/, которые допускают ограниченный прямой доступ к
 
   устройству на уровне команд, которые  пользуются  числовыми
 
   логическими блоками.
 
 
 
 
        Малый процесс
        -------------
 
        Системный процесс, не имеющий  управляющей  области  в
 
   своем виртуальном адресном пространстве, но имеющий  укоро-
 
   ченный контекст. Примеры: нулевой процесс  и  рабочее  мно-
 
   жество свопинга. Малый процесс  планируется  как  пользова-
 
   тельский, но остается в  памяти  до  своего  окончания,  то
 
   есть, его нельзя выгружать.
 
 
 
                            - 287 -
 
                        00152-01 97 07-2
 
 
 
 
        Модификатор функции ввода/вывода
        --------------------------------
 
        Десятибитная величина, указанная в системном  обслужи-
 
   вании очереди запросов на ввод/вывод, которая  модифицирует
 
   функциональный код ввода/вывода (например, чтение  ввода  с
 
   терминала без эха).
 
 
 
 
        Назначение канала
        -----------------
 
        Необходимо  при  установлении  связи  между  процессом
 
   пользователя и устройством до  того,  как  пользовательский
 
   процесс сможет работать с этим устройством. Процесс пользо-
 
   вателя просит систему  назначить  канал,  в  ответ  система
 
   сообщает номер канала.
 
 
 
 
        Назначение устройства
        ---------------------
 
        Резервирование определенного  устройства  для  индиви-
 
   дуального  пользователя.  Пользовательский  процесс   может
 
   зарезервировать только то  устройство,  которое  не  занято
 
   никаким другим процессом.
 
 
 
 
        Драйвер программы начала ввода/вывода
        -------------------------------------
 
        См. "программа начала ввода/вывода."
 
 
 
 
        Номер блока страниц
        -------------------
 
        Старший 21 бит физического адреса страницы в  физичес-
 
 
 
                            - 288 -
 
                        00152-01 97 07-2
 
 
   кой памяти.
 
 
 
 
        Общее название устройства
        -------------------------
 
        Название устройства, относящееся к типу устройства,  а
 
   не к определенному блоку; название устройства, где  пропус-
 
   кается специальный номер  блока  и/или  контроллера.  Когда
 
   обсуждаются драйверы устройства, общее название  устройства
 
   не содержит обозначение контроллера или номер блока, напри-
 
   мер, дв.
 
 
 
 
        Ожидание запроса прерывания
        ---------------------------
 
        Запрос,   выданный   драйверной   программой    начала
 
   ввода/вывода в момент готовности устройства. Запросы влияют
 
   на процесс  ветвления  драйвера,  приостанавливая  его  для
 
   получения требования на прерывание  от  устройства  или  по
 
   тайм-ауту устройства.
 
 
 
 
        Освобождение ввода/вывода
        -------------------------
 
        Функция   операционной   системы,   которая    очищает
 
   какой-либо ввод/вывод в расчете на выход образа.
 
 
 
 
        Очередь ветвления
        -----------------
 
        Очередь из блоков ветвления драйверов  с  определенным
 
   уровнем приоритета,  ожидающих  активизации  от  диспетчера
 
   ветвления МОС ВП.
 
 
 
 
                            - 289 -
 
                        00152-01 97 07-2
 
 
 
 
        Пакет запросов на ввод/вывод
        ----------------------------
 
        Структура в базе данных ввода/вывода,  которая  описы-
 
   вает индивидуальный запрос на ввод/вывод. Системное  обслу-
 
   живание запросов на ввод/вывод  создает  пакет  запроса  на
 
   ввод/вывод для каждого запроса. Информацию из пакета запро-
 
   са на ввод/вывод при выполнении запроса использует  драйвер
 
   об'ектного устройства и МОС ВП.
 
 
 
 
        Почтовый ящик
        -------------
 
        Структура  данных  программного  обеспечения,  которая
 
   рассматривается как ориентированное  на  записи  устройство
 
   для общей межпроцессной  связи.  При  связи  почтовый  ящик
 
   используется подобным образом для других  независимых  уст-
 
   ройств ввода/вывода. Передатчики делают записи  в  почтовом
 
   ящике, а получатель  считывает  оттуда.  Примеры  некоторых
 
   обще-системных почтовых ящиков: регистратор ошибок и чтение
 
   орсом из обще-системных почтовых ящиков.
 
 
 
 
        Прерывание
        ----------
 
        Событие, изменяющее нормальное выполнение  инструкции,
 
   но отличное от исключения, условного перехода,  случая  или
 
   вызова инструкции.  Прерывания  во  время  работы  процесса
 
   обычно являются внешними по отношению к процессу. См. также
 
   прерывание устройства, прерывание программного обеспечения,
 
   срочное прерывание.
 
 
 
 
 
                            - 290 -
 
                        00152-01 97 07-2
 
 
 
 
        Прерывание программного обеспечения
        -----------------------------------
 
        Прерывание на уровне приоритета от 1 до  15,  затребо-
 
   ванное программным обеспечением.
 
 
 
 
        Прерывание устройства
        ---------------------
 
        Прерывание, полученное на уровне приоритетов  прерыва-
 
   ний от 20 до 23. Прерывания от устройства могут быть затре-
 
   бованы только устройствами, контроллерами и памятью.
 
 
 
 
        Приоритет процесса
        ------------------
 
        Приоритет, присвоенный процессу в целях  планирования.
 
   Операционная система распознает 32 уровня приоритетов  про-
 
   цесса, причем 0 - низкий, а 31 - высокий. С 16 по 31 уровни
 
   используются в  процессах  реального  времени.  Система  не
 
   меняет приоритет процесса реального времени / хотя управле-
 
   ние системы или сам процесс может изменить /. Уровни с 0 по
 
   15 используются для нормальных процессов. Система, в  зави-
 
   симости от активности процесса  может  увеличить  приоритет
 
   нормального процесса.
 
 
 
 
        Проверка технического дефекта
        -----------------------------
 
        Внутренняя диагностическая проверка операционной  сис-
 
   темой. Система вносит неисправность и портит систему.
 
 
 
 
 
 
 
                            - 291 -
 
                        00152-01 97 07-2
 
 
        Программа инициализации устройства
        ----------------------------------
 
        Программа, приводящая в готовность контроллеры и блоки
 
   устройства. Это требуется после  падения  напрежения  и  во
 
   время процедуры загрузки драйвера.
 
 
 
 
        Программа начала ввода/вывода
        ------------------------------
 
        Программа в драйвере устройства, отвечающая за получе-
 
   ние необходимых ресурсов,  например,  контроллер  канала  и
 
   готовность устройства.
 
 
 
 
        Программа обслуживания прерывания
        ---------------------------------
 
        Программа, выполняемая при возникновении прерывания от
 
   устройства.
 
 
 
 
        Программы, обслуживающие таблицы выбора функций
        -----------------------------------------------
 
        Драйверные программы, вызываемые системным  обслужива-
 
   нием очереди запросов на ввод/вывод для выполнения предпро-
 
   цессной обработки запроса на ввод/вывод  в  соответствии  с
 
   определенным устройством.
 
 
 
 
        Программная секция
        ------------------
 
        Кусок программы с  определенной  защитой  и  множество
 
   атрибутов управления памятью. Программные  секции,  имеющие
 
   одинаковые атрибуты, об'единяются линкером для  образования
 
   образа секции.
 
 
 
                            - 292 -
 
                        00152-01 97 07-2
 
 
 
 
        Прологовая таблица драйвера
        ---------------------------
 
   таблица в драйвере, описывающая драйвер  и  тип  устройства
 
   для процедуры МОС ВП, которая загружает драйверы в систему.
 
 
 
 
        Пространство ввода/вывода
        -------------------------
 
        Области в физическом  адресном  пространстве,  которые
 
   содержат конфигурацию регистров, устройство  контроля  сос-
 
   тояния и регистры данных. Эти  области  являются  физически
 
   непрерывным.
 
 
 
 
        Процесс
        -------
 
        Запланированная  системным  программным   обеспечением
 
   основа для обслуживания контекста,  в  котором  выполняется
 
   образ. Процесс состоит из адресного пространства контекстов
 
   как аппаратуры, так и программного обеспечения.
 
 
 
 
        Форк-процесс
        ------------
 
        Форк-процесс является минимальным контекстом процесса,
 
   выполняющего код при следующих обстоятельствах:  выполнение
 
   происходит на более высоком уровне  приоритета  прерывания;
 
   используются регистры R0 - R5 (остальные регистры необходи-
 
   мо сохранить и восстановить); выполняется в системном  вир-
 
   туальном адресном пространстве; разрешены пересылки и изме-
 
   нение статической памяти,  которая  никогда  не  изменяется
 
   более высоком кодом уровня приоритета  прерывания.  Мос  вп
 
 
 
                            - 293 -
 
                        00152-01 97 07-2
 
 
   использует   прерывания    программного    обеспечения    и
 
   форк-процессы для синхронизации выполняемых инструкций.
 
 
 
 
        Прямой ввод/вывод
        -----------------
 
        Операция ввода/вывода, при которой  МОС  ВП  блокирует
 
   содержимое страниц ассоциативного буфера физической  памяти
 
   для    продолжения    операции    ввода/вывода.    Передача
 
   ввода/вывода осуществляется непосредственно из буфера  про-
 
   цесса. В противоположность  с  системным  вводом/выводом  с
 
   буфером.
 
 
 
 
        Прямой путь данных
        ------------------
 
        Путь данных для адаптера общей шины;  который  пересы-
 
   лает несколько байтов данных за одну передачу с  внутренней
 
   обратной связью.
 
 
 
 
        Буферизованный путь данных
        --------------------------
 
        Путь данных для адаптера общей шины,  при  котором  за
 
   одну пересылку с внутренней шине процессора можно  передать
 
   несколько байтов данных.
 
 
 
 
        Регистр базы
        ------------
 
        Общий регистр, используемый для хранения адреса начала
 
   страницы, таблицы, массива или другой структуры данных.
 
 
 
 
 
 
                            - 294 -
 
                        00152-01 97 07-2
 
 
        Регистр конфигурации
        --------------------
 
        Регистр управления и состояния для адаптера,  например
 
   адаптера общей шины. Он расположен  в  памяти  ввода/вывода
 
   адаптера.
 
 
 
 
        Регистр команд и состояния (CSR)
        --------------------------------
 
        Регистр управления и состояния устройства или контрол-
 
   лера. Он расположен в пространстве ввода /вывода  процессо-
 
   ра.
 
 
 
 
        Регистр устройства
        ------------------
 
        Ячейка в контроллере устройства логически  исползуемая
 
   для  запроса  функцйи  устройства   (таких   как   передача
 
   ввода/вывода) и/или отчета о состоянии.
 
 
 
 
        Регистратор ошибок
        ------------------
 
        Системный процесор, очищяющий буфер регистрации ошибок
 
   и записывающий сообщения об ошибках в файл ошибок.  Ошибка-
 
   ми, зарегистрированными системой, являются: ошибки  систем-
 
   ной памяти, ошибки, устройств,  таймауты  и  прерывания  по
 
   неправильной адресации.
 
 
 
 
        Связь с прерыванием
        ------------------
 
        Функция с помощью которой процесс связывается с  вект-
 
   ром прерывания устройства. При выполнении связи с  прерыва-
 
 
 
                            - 295 -
 
                        00152-01 97 07-2
 
 
   нием  процессу   необходимо   отобразить   в   пространство
 
   ввода/вывода содержание вектора.
 
 
 
 
        Системный ввод/вывод с буфером
        ------------------------------
 
        Операция ввода/вывода, например от терминала или  поч-
 
   тогого ящика ввода/вывода, в которой используется  промежу-
 
   точный буфер из системного буферного  пула  помимо  буфера,
 
   указанного   процессом.   В    противоположность    прямому
 
   вводу/выводу.
 
 
 
 
        Системный виртуальный адрес
        ---------------------------
 
        Виртуальный адрес, указывающий  на  ячейку  в  памяти,
 
   соответствующую адресу в системном пространстве.
 
 
 
 
        Системное обслуживание очереди запросов ввода/вывода
        ----------------------------------------------------
 
   сервис системы МОС ВП, который обслуживает запросы  $QIO  и
 
   $QIOW.   Системное   обслуживание   очереди   запросов   на
 
   ввод/вывод подготавлиавет запрос на ввод/вывод для обработ-
 
   ки драйвером и предварительной обработкой,  независимой  от
 
   устройства. Это системное обслуживание вызывает также драй-
 
   вер программы, обслуживающей таблицу выбора функций.
 
 
 
 
        Системная таблица страниц
        -------------------------
 
        Структура данных, устанавливающая соответствие систем-
 
   ным виртуальным адресам, включая адреса,  используемые  при
 
   обращении к страничным таблицам процеса. Системная  таблица
 
 
                            - 296 -
 
                        00152-01 97 07-2
 
 
   страниц содержит одну страничную таблицу входов для  каждой
 
   страницы системной виртуальной памяти.  Базовый  физический
 
   адрес системной таблицы страниц хранится в регистре процес-
 
   сора, называемым системным базовым регистром.
 
 
 
 
        Смещение
        --------
 
        Фиксированный сдвиг от  начала  блока  данных.  Внутри
 
   блока данных системные смещения для элементов обычно  имеют
 
   общее символическое имя, которое используется  вместе  чис-
 
   ленного сдвига. Программы всегда ссылаются на символические
 
   имена, если символы определены, вместо использования число-
 
   вых сдвигов.
 
 
 
 
        Срочное прерывание
        ------------------
 
        Прерывание, полученное на уравне прерываний от  24  до
 
   31. Tакое прерывание может исходить только от процессора по
 
   истечении интервала времени, в случае  серьезных  ошибок  и
 
   падения напряжения.
 
 
 
 
        Стек прерывания
        ---------------
 
        Системно-доступный стек,  используемый,  когда  работа
 
   происходит в контексте обслуживания  прерывания.  В  разные
 
   моменты времени процессор, как указывается стеком  прерыва-
 
   ния и битами текущего режима в PLS, может работать в режиме
 
   или пользовательского контекста процессора, или  супервизо-
 
   ра,  или  исполнителя,   или   в   режиме   ядра,   или   в
 
   системно-доступном контексте обслуживания прерывания, рабо-
 
 
                            - 297 -
 
                        00152-01 97 07-2
 
 
   тающем в режиме ядра. Стек прерывания не является контекст-
 
   но изменяемым.
 
 
 
 
        Страничная таблица входов
        -------------------------
 
   Структура данных, которая идентифицирует физическую  ячейку
 
   памяти с положением страницы виртуального адресного  прост-
 
   ранства. Если виртуальная страница находится в  памяти,  то
 
   страничная таблица входов  содержит  номер  блока  страниц,
 
   необходимый при отображении виртуальной страницы в физичес-
 
   кую. Если виртуальная страница не в памяти,  то  страничная
 
   таблица входов содержит информацию, необходимую для опреде-
 
   ления места страницы во вспомогательной памяти /на диске/.
 
 
 
 
        Структура данных
        ----------------
 
        Какая-либо таблица, лист, массив, очередь или  дерево,
 
   чей формат или условия доступа четко определены для обраще-
 
   ния к ней одним или более образом.
 
 
 
 
        Таблица страниц процесса
        ------------------------
 
        Таблицы страниц, используемые для описания виртуальной
 
   памяти процесса.
 
 
 
 
        Таблица выбора функций
        ----------------------
 
        Таблица драйвера, содержащая все значения функциональ-
 
   ных  кодов  устройства  и  адреса  предпроцессных  программ
 
   ввода/вывода, соответствующих каждому значению функции.
 
 
                            - 298 -
 
                        00152-01 97 07-2
 
 
 
 
        Таймаут
        -------
 
        Окончание интервала времени,  необходимого  устройству
 
   для завершения передачи  ввода/вывода.  Ожидание  драйвером
 
   запроса на прерывание, определенном окончанием таймаута.
 
 
 
 
        Таймер
        ------
 
        Системный процесс, обслуживающий дату и  время.  Также
 
   он следит за таймаутами устройств и выполняет запланирован-
   
   ные по времени запросы. Программа  обслуживания  прерывания
 
   от таймера создает процесс таймера.
 
 
 
 
        Указатель стека прерывания
        --------------------------
 
        Указатель стека для стека прерывания. Указатели  стека
 
   для стеков контекста хранятся в аппаратном РСВ, а указатель
 
   стека прерывания хранится во внутреннем регистре процесса.
 
 
 
 
        Уровень асинхронного системного прерывания
        ------------------------------------------
 
        Величина, хранящаяся во внутреннем регистре  процесса,
 
   соответствующая найвысшему приоритету режима  доступа,  для
 
   которого  продолжается  выполнение  программы  асинхронного
 
   системного прерывания.  Программа  асинхронного  системного
 
   прерывания не начинает работу, пока не закончится  выполне-
 
   ние текущей программы, работающей в  более  привилегирован-
 
   ном, по отношению к уровню асинхронного системного прерыва-
 
   ния, режиме.
 
 
 
                            - 299 -
 
                        00152-01 97 07-2
 
 
 
 
        Уровень приоритета прерывания
        -----------------------------
 
        Уровень прерывания, при котором происходит  прерывание
 
   аппаратуры или программного обеспечения. Существуют 32 воз-
 
   можных уровня: 0 - низший, 3I -  высший.  Для  обслуживания
 
   процесса уровни рассматриваются арбитражем. Например,  уст-
 
   ройство не может прервать работу процессора, если в  данный
 
   момент процессор работает на более высоком уровне  прерыва-
 
   ния, чем уровень прерывания у программы, обслуживающей пре-
 
   рывание от устройства.
 
 
 
 
        Форк-IPL драйвера
        -----------------
 
        Уровни приоритета прерывания  от  8  до  II,  являются
 
   уровнями, при которых выполняется  форк-процессы  драйвера.
 
   Каждый блок управления требует свой форк-IPL.
 
 
 
 
        Физический адрес
        ----------------
 
        Адрес,  используемый  аппаратурой  для   идентификации
 
   ячейки в физической памяти или во вспомогательной памяти на
 
   прямо адресуемых устройствах, например, дисках.  Физический
 
   адрес памяти состоит из номера блока страниц и номера  бита
 
   внутри страницы. Физический адрес блока на диске состоит из
 
   номера цилиндра, дорожки и сектора.
 
 
 
 
        Физическое адресное пространство
        --------------------------------
 
        Множество всех возможных физических  адресов,  исполь-
 
 
 
                            - 300 -
 
                        00152-01 97 07-2
 
 
   зуемых для ссылки на ячейку  памяти  /пространство  памяти/
 
   или регистры устройства /пространство ввода/вывода/.
 
 
 
 
        Физические функции ввода/вывода
        -------------------------------
 
        Множество функций ввода/вывода, которые разрешают дос-
 
   туп к любому устройству на уровне ввода/вывода кроме режима
 
   обслуживания.
 
 
 
 
        Функции виртуального ввода/вывода
        ---------------------------------
 
        Множество  функций  ввода/вывода,   интерпретирующихся
 
   вспомогательным управляющим процессом.
 
 
 
 
        Функция ввода/вывода
        --------------------
 
        Команда ввода/вывода, обработанная операционной систе-
 
   мой, обычным результатом выполнения которой  являются  одна
 
   или более физических команд ввода/вывода.
 
 
 
 
        Функциональный код
        ------------------
 
        См. Функциональный код ввода/вывода
 
 
 
 
        Функциональный код ввода/вывода
        -------------------------------
 
        Шестибитная  величина,  указанная   очереди   запросов
 
   ввод/вывод,   которая   описывает   определенную    команду
 
   ввода/вывода, которая должна  быть  выполнена  /такую,  как
 
   чтение, запись, перемотка/.
 
 
                            - 301 -
 
                        00152-01 97 07-2
 
 
 
 
        Функциональный модификатор
        --------------------------
 
        См. модификатор функции ввода/вывода
 
 
 
 
        ХDELTA
        ------
 
        Средство для отлаки операционных систем и драйверов.
 
 
 
 
 
                            - 302 -
 
                        00152-01 97 07-2
 
 
                                                  Приложение 7
 
 
 
 
 
                  Перечень принятых сокращений
 
 
 
 
 
 
   АСР - вспомогательный управляющий процесс
 
   ADP - блок управления адаптером
 
   AST - асинхронное системное прерывание
 
   ASTLVL - уровень AST
 
   CCB - блок управления каналом
 
   CRB - блок запросов канала
 
   CSR - регистр управляющий состояние
 
   DDB - блок данных устройства
 
   DDT - диспетчерская таблица драйвера
 
   DPT - прологовая таблица драйвера
 
   ECC - код коррекции ошибки
 
   FDT - таблица выбора функций
                               
   IDB - диспетчерский блок прерывания
 
   IOSB - блок состояния ввода/вывода
 
   IPL - уровень приоритета прерывания
 
   IOP - пакет запросов  ввода/вывода
 
   IS  - стек прерывания
 
   ISP - указатель стека прерывания
 
   ISR - программа обслуживания прерывания
 
   PCB - блок управления процессом
 
   PFN - номер блока страниц
 
   PID - идентификатор процесса
 
   PTE - страничная таблица входов
 
 
 
                            - 303 -
 
                        00152-01 97 07-2
 
 
   QIO - системное обслуживание очереди запросов  ввода/вывода
 
   SBI - синхронная обратная связь
 
   SPT - системная таблица страниц
 
   SVA - системный виртуальный адрес
 
   UCB - блок управления устройством
 
 

 
 
 
                            - 304 -
 
                        00152-01 97 07-2
 
 
              ПЕРЕЧЕНЬ ССЫЛОЧНЫХ ДОКУМЕНТОВ
 
 
        1.Операционная система МОС ВП.  Подсистема  системного
 
   програмиста. Программа генерации системы. Руководство поль-
 
   зователя. 00152-01 92 07
 
 
        2. Операционная система МОС ВП. Подсистема  системного
 
   сервиса.   Разработка   драйверов.   Справочный   материал.
 
   00152-01 97 07-1
 
 
        3. Операционная система МОС ВП. Подсистема  системного
 
   програмиста. Программа анализа аварийного состояния  систе-
 
   мы. Руководство оператора. 00152-01 34 16
 
 
        4. Операционная система МОС ВП. Подсистема  системного
 
   програмиста. Установка и запуск  компонент  системы.  Руко-
 
   водство системного программиста. 00152-01 32 01
 
 
 
 

                            - 304K -
 
                        00152-01 97 07-2
 
 
              ПЕРЕЧЕНЬ ССЫЛОЧНЫХ ДОКУМЕНТОВ
 
 
        1.Операционная система МОС ВП.  Подсистема  системного
 
   програмиста. Программа генерации системы. Руководство поль-
 
   зователя. 2б.00152-01 92 07
 
 
        2. Операционная система МОС ВП. Подсистема  системного
 
   сервиса.   Разработка   драйверов.   Справочный   материал.
 
   2б.00152-01 97 07-1
 
 
        3. Операционная система МОС ВП. Подсистема  системного
 
   програмиста. Программа анализа аварийного состояния  систе-
 
   мы. Руководство оператора. 2б.00152-01 34 16
            
 
        4. Операционная система МОС ВП. Подсистема  системного
 
   програмиста. Установка и запуск  компонент  системы.  Руко-
 
   водство системного программиста . 2б.00152-01 32 01
 
  
  
                         - 305K -

                      00152-01 97 07-02
  
  ------------------------------------------------------------
  I                                                          I
  I                  Лист регистрации изменений              I
  I                                                          I
  I----------------------------------------------------------I
  IНомера листов (страниц)IВсего IN     IВходящий IПодп.IДатаI
  I-----------------------IлистовIдоку- IN сопро- I     I    I
  IИ IИз- IЗа- IНо- IАнну-I(стра-Iмента Iводитель-I     I    I
  Iз Iме- Iме- Iвых Iлиро-Iниц)  I      Iного до- I     I    I
  Iм Iнен-Iнен-I    Iван- Iв до- I      Iкум. И   I     I    I
  I. Iных Iных I    Iных  Iкум.  I      Iдата     I     I    I
  I----------------------------------------------------------I
  I  I    I    I    I     I      I      I         I     I    I
  I  I    I    I    I     I      I      I         I     I    I
  I  I    I    I    I     I      I      I         I     I    I
  I  I    I    I    I     I      I      I         I     I    I
  I  I    I    I    I     I      I      I         I     I    I
  I  I    I    I    I     I      I      I         I     I    I
  I  I    I    I    I     I      I      I         I     I    I
  I  I    I    I    I     I      I      I         I     I    I
  I  I    I    I    I     I      I      I         I     I    I
  I  I    I    I    I     I      I      I         I     I    I
  I  I    I    I    I     I      I      I         I     I    I
  I  I    I    I    I     I      I      I         I     I    I
  I  I    I    I    I     I      I      I         I     I    I
  I  I    I    I    I     I      I      I         I     I    I
  I  I    I    I    I     I      I      I         I     I    I
  I  I    I    I    I     I      I      I         I     I    I
  I  I    I    I    I     I      I      I         I     I    I
  I  I    I    I    I     I      I      I         I     I    I
  I  I    I    I    I     I      I      I         I     I    I
  I  I    I    I    I     I      I      I         I     I    I
  I  I    I    I    I     I      I      I         I     I    I
  I  I    I    I    I     I      I      I         I     I    I
  I  I    I    I    I     I      I      I         I     I    I
  I  I    I    I    I     I      I      I         I     I    I
  I  I    I    I    I     I      I      I         I     I    I
  I  I    I    I    I     I      I      I         I     I    I
  I  I    I    I    I     I      I      I         I     I    I
  I  I    I    I    I     I      I      I         I     I    I
  I  I    I    I    I     I      I      I         I     I    I
  I  I    I    I    I     I      I      I         I     I    I
  I  I    I    I    I     I      I      I         I     I    I
  I  I    I    I    I     I      I      I         I     I    I
  I  I    I    I    I     I      I      I         I     I    I
  I  I    I    I    I     I      I      I         I     I    I
  I  I    I    I    I     I      I      I         I     I    I
  I  I    I    I    I     I      I      I         I     I    I
  I  I    I    I    I     I      I      I         I     I    I
  I  I    I    I    I     I      I      I         I     I    I
  I  I    I    I    I     I      I      I         I     I    I
  I  I    I    I    I     I      I      I         I     I    I
  I  I    I    I    I     I      I      I         I     I    I
  I  I    I    I    I     I      I      I         I     I    I
  I  I    I    I    I     I      I      I         I     I    I
  I  I    I    I    I     I      I      I         I     I    I
  I  I    I    I    I     I      I      I         I     I    I
  I  I    I    I    I     I      I      I         I     I    I
  I  I    I    I    I     I      I      I         I     I    I
  I  I    I    I    I     I      I      I         I     I    I
  I  I    I    I    I     I      I      I         I     I    I
  I  I    I    I    I     I      I      I         I     I    I
 
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!