
 
                              
 
 
        Министерство приборостроения, средств автоматизации
 
                        и систем управления
 
 
 
           
 
               
 
 
 
 
                Операционная система   МОС ВП
  
                Подсистемм системного сервиса
  
           Р А З Р А Б О Т К А   Д Р А Й В Е Р О В
                     
                     Справочный материал
 
                       Лист утверждения
 
                    2б.00152-01 97 07-1-ЛУ
 
                           Листов 2
 
  
  
                   Руководитель темы
 
                           Зам. директора ИНЭУМ
 
                           -----------------Xрущев С.Н.
                                                
                           "---"------------1987 г.
 
                    Представители предприятия-разработчика:
 
                           Зав. отделом СКБ ВМ 
 
                           -----------------Паулаускас Э.С.

                           "---"------------1987 г.
 
                           Зав. сектором СКБ ВМ 
 
                           -----------------Лабяцките Г.Й.
 
                           "---"------------1987 г.
 
  
  
                         1987

 
    Перв. примен.                             Литера
    2б.00152-01
 

                             - 2 -
 
                   2б.00152-01 97 07-1-ЛУ
  
  
 
 
 
 
 
                    Представители ИНЭУМ:
                      
                            Ответственный исполнитель темы
 
                            Зав. отделением
 
                            -----------------Остапенко Г.П.
 
                            "---"------------1987 г.
 
                            Нормоконтролер
 
                            -----------------
 
                            "---"------------1987 г.
 
 
 
 

 
  
                             
 
 
   Утвержден
 
   2б.00152-01 97 07-1-ЛУ
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
                 Операционная  система  МОС ВП
   
                 Подсистема системного сервиса
  
            Р А З Р А Б О Т К А   Д Р А Й В Е Р О В 
 
                     Руководство оператора
 
                     2б.00152-01 97 07-1
 
                          Листов 316/4К
  
  
  
  
    
   
   
 
 
  
  
  
 1K  
 12K  
 312К  
 313К
  
  
  
  
  
  
                              1987 
 
    Перв. Примен.                              Литера
    2б.00152-01
 
                                 
 
 
 
 
  
  
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
                 Операционная система  МОС ВП
   
                 Подсистема системного сервиса
  
            Р А З Р А Б О Т К А    Д Р А Й В Е Р О В
 
                     Руководство оператора
 
                       00152-01 97 07-1
 
                          Листов 312
  
  
  
  
    
   
   
 
 
  
  
  
  
  
  
  
  
  
  
  
  
  
                              1987 
 
 
 
                             - 2 -
 
                        00152-01 97 07-1
 
 
 
 
 
 
                            АННОТАЦИЯ
 
 
 
 
 
        Данный документ предназначен системным  программистам,
 
   которые знакомы с операционной системой  МОС  ВП.  Документ
 
   поясняет, как писать драйверы для устройств,  не  поддержи-
 
   ваемых системой МОС ВП, и как загружать эти драйверы в опе-
 
   рационную систему МОС ВП. Драйвер устройства является набо-
 
   ром стандартных программ  и  таблиц,  которые  используются
 
   системой для  обработки  запросов  ввода/вывода  устройства
 
   конкретного типа.
 
 
        Документ состоит из двух частей. В первой  части  нас-
 
   тоящего докумета введены основные  концепции,  связанные  с
 
   разработкой драйверов. Во второй части документа рассматри-
 
   вается загрузка драйвера в систему  МОС  ВП.  Вторая  часть
 
   содержит также приложения, в которых описывается база  дан-
 
   ных ввода/вывода, макрокоманды и стандартные программы сис-
 
   темы МОС ВП, которые можно использовать в драйверах.
 

 
 
 
                             - 3 -
 
                        00152-01 97 07-1
 
 
 
 
 
 
                           СОДЕРЖАНИЕ
 
 
 
 
 
   1.  ВВЕДЕНИЕ В ДРАЙВЕРЫ УСТРОЙСТВ                        13
 
 
   1.1.    Общие сведения                                   16
 
   1.2.    Компоненты драйвера устройства                   18
 
   1.3.    Асинхронная природа драйвера устройства          19
 
   1.4.    Форк-процессы                                    20
 
   1.5.    Контекст процесса и контекст прерывания          22
 
   1.6.    Зависимость     от     устройства     и
 
           независимость от устройства                      24
 
   1.7.    База данных ввода/вывода                         25
 
   1.7.1.    Блоки   управления   в   базе    данных
 
             ввода/вывода                                   28
 
   1.7.1.1.  Блок данных устройства                         28
 
   1.7.1.2.  Блок управления устройством                    29
 
   1.7.1.3.  Блок запроса канала                            29
 
   1.7.1.4.  Блок диспетчеризации прерываний                29
 
   1.7.1.5.  Блок управления адаптером                      30
 
   1.7.1.6.  Блок управления каналом                        30
 
   1.7.2.    Пакеты запросов ввода/вывода                   31
 
   1.8.    Синхронизация                                    31
 
   1.8.1.    Уровни приоритета прерываний                   32
 
   1.8.2.    Прерывания от устройств                        33
 
   1.8.3.    Форк-очереди                                   33
 
   1.8.4.    Очереди ожидания ресурсов                      34
 
   1.9.    Функции драйвера устройства                      35
 
 
 
                             - 4 -
 
                        00152-01 97 07-1

 
   1.9.1.    Программы инициализации                        36
 
   1.9.2.    Программы FDT                                  37
 
   1.9.3.    Стартовая программа ввода/вывода               38
 
   1.9.4.    Программа обслуживания прерываний              39
 
   1.9.5.    Управление таймаутом устройства                39
 
   1.9.6.    Программа отмены ввода/вывода                  40
 
   1.9.7.    Программа регистрации ошибок                   40
 
   1.10.   Пример запроса  ввода/вывода  по  общей
 
           шине                                             40
   
   1.11.   Общая шина                                       46
 
   1.12.   Программируемый ввод/вывод и ввод/вывод
 
           с прямым доступом к памяти                       49
 
   1.13.   Буферизированный  ввод/вывод  и  прямой
 
           ввод/вывод                                       50
 
   1.14.   Загружаемые драйверы                             51
 
 
   2.  ОБСУЖДЕНИЕ ОЧЕРЕДИ ЗАПРОСОВ ВВОДА/ВЫВОДА             53
 
 
   2.1.    Программы   драйвера   для   реализации
 
           функции  записи  устройства  построчной
 
           печати                                           55
 
   2.2.    Запросы         ввода/вывода         из
 
           пользовательского процесса                       56
 
   2.3.    Предобработка  ввода/вывода  с  помощью
 
           МОС ВП                                           56
 
   2.4.    Предобработка ввода/вывода драйвером             58
 
   2.5.    Помещение пакета в очередь ввода/вывода
 
           к драйверу                                       60
 
   2.6.    Активизация драйвера устройства                  61
 
   2.7.    Ожидание прерывания устройства                   63
 
   2.8.    Обработка прерываний                             64
 
 
                             - 5 -
 
                        00152-01 97 07-1
 
 
   2.9.    Завершение    обработки    ввода/вывода
 
           драйвером                                        65
 
   2.10.   Завершение    обработки    ввода/вывода
 
           системой                                         66
 
 
   3.  СИНХРОНИЗАЦИЯ ОБРАБОТКИ ЗАПРОСА ВВОДА/ВЫВОДА         67
 
 
   3.1.    Уровни приоритетов прерываний                    67
 
   3.1.1.    IPL, определяемые системой МОС ВП              68
 
   3.1.2.    IPL, определенные для аппаратуры               69
 
   3.1.3.    Программы обслуживания прерываний              69
 
   3.1.4.    Повышение IPL                                  71
 
   3.1.5.    Понижение IPL                                  71
 
   3.1.6.    Диспетчеризация прерываний устройств           72
 
   3.1.7.    Передача     управления     драйверному
 
             форк-процессу                                  77
 
   3.1.8.    Использование IPL  во  время  обработки
 
             ввода/вывода                                   78
 
   3.1.8.1.  IPL$_ASTDEL (IPL 2)                            78
 
   3.1.8.2.  IPL$_IOPOST (IPL 4)                            80
 
   3.1.8.3.  Драйверная форк-обработка (IPL от 8  до
 
             11)                                            81
 
   3.1.8.4.  Аппаратные прерывания устройств (IPL от
 
             20 до 23)                                      81
 
   3.1.8.5.  IPL$_POWER ( IPL 31 )                          82
 
   3.1.9.    Дополнительные IPL                             83
 
   3.1.9.1.  IPL$_SCHED ( IPL 3 )                           83
 
   3.1.9.2.  IPL$_QUEUEAST ( IPL 6 )                        84
 
   3.1.9.3.  IPL$_SYNCH и IPL$_TIMER ( IPL 8 )              84
 
   3.1.9.4.  IPL$_MAILBOX ( IPL 11 )                        85
 
   3.1.9.5.  IPL$_XDELTA (IPL 5 )                           85
 
 
                             - 6 -
 
                        00152-01 97 07-1
 
 
   3.1.10.   Обзор использования IPL                        86
 
   3.1.11.   Изменение IPL в драйверной программе           90
 
   3.1.11.1. Макрокоманда      установки      уровня
 
             приоритета прерывания                          90
 
   3.1.11.2. Макрокоманда запрета прерываний                91
 
   3.1.11.3. Макрокоманда разрешения прерываний             92
 
   3.1.11.4. Макрокоманда программного прерывания           92
 
   3.2.    Форк-блоки и форк-диспетчеризация                93
 
   3.2.1.    Программа обслуживания  прерываний  для
 
             форк-диспетчеризации                           94
 
   3.3.    Очереди ожидания ресуров                         96
 
   3.3.1.    Конкуренция за канал данных контроллера        99
 
 
   4.  АДАПТЕР ОБЩЕЙ ШИНЫ                                  102
 
 
   4.1.    Чтение и запись в регистры устройств            104
 
   4.2.    Преобразование  адресов  общей  шины  в
 
           физические  для  передач   по   прямому
 
           доступу в память                                104
 
   4.2.1.    Пути  передачи  данных  адаптера  общей
 
             шины                                          107
                                                            
   4.2.1.1.  Режим прямой передачи                         109
 
   4.2.1.2.  Буферизованные пути данных                    111
 
   4.2.1.3.  Передача данных со смещением на байт          116
 
   4.2.1.4.  Очистка буферизованных путей данных           116
 
   4.2.1.5.  Режим произвольного доступа в  границах
 
             32-разрядного длиного слова                   117
 
   4.3.    Адаптер    интерфейса    общей     шины
 
           вычислительного комплекса СМ1700                119
 
 
   5.  ОБЗОР ОБРАБОТКИ ВВОДА/ВЫВОДА                        121
 
 
 
                             - 7 -
 
                        00152-01 97 07-1
 
 
   5.1.    Предобработка запроса ввода/вывода              124
 
   5.1.1.    Назначение канала ввода/вывода процессу       125
 
   5.1.2.    Нахождение драйвера устройства  в  базе
 
             данных ввода/вывода                           126
 
   5.1.2.1.  Блок управления устройством (UCB)             127
 
   5.1.2.2.  Блок запроса канала                           128
 
   5.1.2.3.  Блок диспетчеризации прерывания (IDB)         129
 
   5.1.2.4.  Блок данных устройства (DDB)                  130
 
   5.1.3.    Проверка     достоверности      функции
 
             ввода/вывода                                  132
 
   5.1.4.    Проверка  квот  процесса  для   запроса
 
             ввода/вывода                                  132
 
   5.1.5.    Проверка  доступа  к  блоку   состояния
 
             ввода/вывода                                  133
 
   5.1.6.    Выделение и подготовка  пакета  запроса
 
             ввода/вывода                                  133
 
   5.1.7.    Обработка FDT                                 136
 
   5.2.    Управление деятельностью устройства             142
 
   5.2.1.    Создание  форк-процесса  драйвера   для
 
             начала ввода/вывода                           142
 
   5.2.2.    Активизация   устройства   и   ожидание
 
             прерывания                                    145
 
   5.2.3.    Обработка прерывания устройства               147
 
   5.2.4.    Переключение  контекста  прерывания  на
 
             контекст форк-процесса                        148
 
   5.2.5.    Активизация      форк-процесса       из
 
             форк-очереди                                  149
 
   5.3.    Завершение запроса ввода/вывода                 152
 
   5.3.1.    Постобработка ввода/вывода                    152
 
 
 
 
                             - 8 -
 
                        00152-01 97 07-1
 
 
   6.  ОБРАЗЕЦ ДРАЙВЕРА ВВОДА/ВЫВОДА                       155
 
 
   6.1.    Соглашения по программированию                  157
 
   6.2.    Ограничения использования  пространства
 
           регистров устройств ввода/вывода                159
 
   6.3.    Образец драйвера МОС ВП                         163
 
 
   7.  НАПИСАНИЕ ТАБЛИЦ ДРАЙВЕРА УСТРОЙСТВА                181
 
 
   7.1.    Прологовая таблица драйвера (DPT)               182
 
   7.1.1.    Макрокоманда DPTAB                            185
 
   7.1.2.    Макрокоманда DPT_STORE                        188
 
   7.2.    Диспетчерская таблица драйвера (DDT)            191
 
   7.2.1.    Макрокоманда DDTAB                            192
 
   7.3.    Таблица выбора функций (FDT)                    194
 
   7.3.1.    Определение       кодов        функций,
 
             специфических для устройства                  196
 
   7.3.2.    Определение   тех   функций,    которые
 
             являются буферизованным вводом/выводом        198
 
   7.3.3.    Макрокоманда FUNCTAB                          200
 
 
   8.  НАПИСАНИЕ ПРОГРРММ FDT                              202
 
 
   8.1.    Контекст для выполнения программы FDT           202
 
   8.2.    Предустановка регистров для  исполнения
 
           программы FDT                                   203
 
   8.3.    Соглашения, которым  следуют  программы
                                                            
           FDT                                             204
 
   8.3.1.    Соглашения о регистрах                        204
 
   8.3.2.    Соглашения по контексту процесса              205
 
   8.4.    Переход к программе FDT и выход из нее          206
 
   8.5.    Программы FDT для прямого ввода/вывода          209
 
 
 
                             - 9 -
 
                        00152-01 97 07-1
 
 
   8.6.    Программы   FDT   для   буферизованного
 
           ввода/вывода                                    210
 
   8.6.1.    Проверка буфера пользователя                  210
 
   8.6.2.    Выделение системного буфера                   210
 
   8.6.3.    Окончание буферизованного  ввода/вывода
 
             в постобработке                               212
 
   8.7.    Программы FDT, предоставляемые системой
 
           MOC BП                                          214
 
   8.7.1.    EXE$ONEPARM                                   214
 
   8.7.2.    EXE$READ                                      215
 
   8.7.3.    EXE$SENCEMODE                                 218
    
   8.7.4.    EXE$SETCHAR                                   219
 
   8.7.5.    EXE$SETMODE                                   220
 
   8.7.6.    EXE$WRITE                                     221
 
   8.7.7.    EXE$ZEROPARM                                  223
 
   8.8.    Программы выхода в системе МОС ВП               224
 
   8.8.1.    EXE$ABORTIO                                   224
 
   8.8.2.    EXE$FINISHIO и EXE$FINSHIOC                   226
 
   8.8.3.    EXE$QIODRVPKT                                 229
 
   8.8.4.    EXE$ALTQUEPKT                                 233
 
 
   9.  НАПИСАНИЕ ПРОГРАММЫ НАЧАЛА ВВОДА/ВЫВОДА             236
 
 
   9.1.    Передача управления началу ввода/вывода         236
 
   9.2.    Контекст драйверного форк-процесса              237
 
   9.3.    Активизация устройства                          239
 
   9.3.1.    Получение доступа к контроллеру               240
 
   9.3.2.    Получение кода функции  ввода/вывода  и
 
             преобразование    этой    функции     и
 
             модификаторов                                 244
 
   9.3.3.    Вычисление длины передачи                     244
 
 
                            - 10 -
 
                        00152-01 97 07-1
 
 
   9.3.4.    Вычисление адреса начала передачи             245
 
   9.3.5.    Подготовка  битовой  маски  активизации
 
             устройства                                    245
 
   9.3.6.    Блокировка всех прерываний                    246
 
   9.3.7.    Проверка сбоя питания                         246
 
   9.3.8.    Активизация устройства                        247
 
   9.4.    Ожидание прерывания или таймаута                247
 
   9.4.1.    Форматы макрокоманд WFIKPCH и WFIRLCH         248
 
   9.4.2.    Расширение макрокоманды WFIKPCH               249
 
   9.4.3.    Программа IOC$WFIKPCH                         250
 
   9.5.    Реакция   на    ожидаемое    прерывание
 
           устройства                                      251
 
 
   10. ОПИСАНИЕ ПЕРЕДАЧ ПО ОБЩЕЙ ШИНЕ С ПРЯМЫМ ДОСТУПОМ К
 
       ПАМЯТИ                                              253
 
 
   10.1.   Запрос буферизованного пути данных              255
 
   10.1.1.   Запрос постоянного буферизованного пути
 
             данных                                        256
 
   10.1.2.   Запрос прямого пути данных                    258
 
   10.1.3.   Смешанные   передачи   по   прямому   и
 
             буферизованному пути данных                   258
 
   10.2.   Запрос регистров  отображения  адаптера
 
           общей шины                                      258
 
   10.2.1.   Назначение регистров отображения              259
 
   10.2.2.   Постоянное     назначение     регистров
 
             отображения                                   260
 
   10.3.   Загрузка регистров отображения адаптера
 
           общей шины                                      261
 
   10.4.   Вычисление начального адреса передачи           263
 
   10.5.   Активизация устройства                          264
 
 
                            - 11 -
 
                        00152-01 97 07-1
 
 
   10.6.   Окончание передачи по прямому доступу к
 
           памяти                                          265
 
   10.6.1.   Очистка пути данных                           266
 
   10.6.2.   Освобождение    буферизованного    пути
 
             данных                                        267
 
   10.7.   Освобождение   регистров    отображения
 
           адаптера общей шины                             269
 
 
   11. НАПИСАНИЕ ПРОГРАММ ОБСЛУЖИВАНИЯ ПРЕРЫВАНИЙ          270
 
 
   11.1.   Доставка   прерывания   устройства    к
 
           драйверу                                        273
 
   11.2.   Контекст прерывания                             275
 
   11.3.   Обслуживание ожидаемых прерываний               276
 
   11.4.   Обслуживание неожидаемого прерывания            278
 
   11.4.1.   Примеры обработки неожидаемых входов          280
 
 
   12. ОКОНЧАНИЕ ЗАПРОСА ВВОДА/ВЫВОДА                      284
 
 
   12.1.   Постобработка ввода/вывода                      285
 
   12.1.1.   EXE$IOFORK                                    285
 
   12.1.2.   Окончание запроса ввода/вывода                286
 
   12.1.2.1. Освобождение контроллера                      287
 
   12.1.2.2. Сохранение   состояния,   счетчика    и
 
             зависимого от устройства состояния            288
 
   12.1.2.3. Возвращение в операционную систему            288
 
   12.2.   Обработчики таймаута                            290
 
   12.2.1.   Перезапуск операции ввода/вывода              293
 
   12.2.2.   Прекращение запроса ввода/вывода              294
 
   12.2.3.   Посылка сообщения оператору                   295
 
 
   13. НАПИСАНИЕ    ПРОГРАММ    ИНИЦИАЛИЗАЦИИ,     ОТМЕНА
 
 
 
                            - 12 -
 
                        00152-01 97 07-1
 
 
       ВВОДА/ВЫВОДА И РЕГИСТРАЦИИ ОШИБОК                   297
 
 
   13.1.   Программы инициализации                         297
 
   13.1.1.   Инициализация   во    время    загрузки
 
             драйвера                                      298
 
   13.1.2.   Инициализация во  время  восстановления
 
             после сбоя питания                            300
 
   13.1.3.   Контекст инициализации                        301
 
   13.2.   Программа отмены ввода/вывода                   304
 
   13.2.1.   Контекст программы отмены ввода/вывода        305
 
   13.2.2.   Драйверы,  которые   не   нуждаются   в
 
             программе отмены ввода/вывода                 306
 
   13.2.3.   Программа не  зависящей  от  устройства
 
             отмены ввода/вывода                           307
 
   13.2.4.   Зависимые   от   устройства   программы
 
             отмены ввода/вывода                           308
 
   13.3.   Программы регистрации ошибок                    308
 

   ПЕРЕЧЕНЬ ССЫЛОЧНЫХ ДОКУМЕНТОВ                           312
 
 
   00152-01 97 07-02
 
 
                            - 12К -
 
                        00152-01 97 07-1
 
 
       ВВОДА/ВЫВОДА И РЕГИСТРАЦИИ ОШИБОК                   297
 
 
   13.1.   Программы инициализации                         297
 
   13.1.1.   Инициализация   во    время    загрузки
 
             драйвера                                      298
 
   13.1.2.   Инициализация во  время  восстановления
 
             после сбоя питания                            300
 
   13.1.3.   Контекст инициализации                        301
 
   13.2.   Программа отмены ввода/вывода                   304
 
   13.2.1.   Контекст программы отмены ввода/вывода        305
 
   13.2.2.   Драйверы,  которые   не   нуждаются   в
 
             программе отмены ввода/вывода                 306
 
   13.2.3.   Программа не  зависящей  от  устройства
 
             отмены ввода/вывода                           307
 
   13.2.4.   Зависимые   от   устройства   программы
 
             отмены ввода/вывода                           308
 
   13.3.   Программы регистрации ошибок                    308
 
 
   ПЕРЕЧЕНЬ ССЫЛОЧНЫХ ДОКУМЕНТОВ                           312
 
   ПЕРЕЧЕНЬ ССЫЛОЧНЫХ ДОКУМЕНТОВ                          312К
   

   00152-01 97 07-02
 
 
                            - 13 -
 
                        00152-01 97 07-1
 
 
                1. ВВЕДЕНИЕ В ДРАЙВЕРЫ УСТРОЙСТВ
 
 
 
 
        Справочный материал по разработке драйверов  устройств
 
   содержит информацию, необходимую для  написания  драйверов,
 
   выполняемых под управлением операционной системы МОС  ВП  и
 
   для загрузки этих драйверов в операционную систему. Исполь-
 
   зование внутренних исполнительных интерфейсов, отличающихся
 
   от рассмотренных в данном документе, не рекомендуется.
 
 
        Первые пять разделов являются вводными в драйверы уст-
 
   ройств системы МОС ВП и в те  аспекты  процессора  вычисли-
 
   тельного комплекса СМ1700 и системы МОС ВП, которые сущест-
 
   венны для драйверов:
 
 
        - раздел 1  вводит  основные  концепции,  связанные  с
 
   драйверами системы МОС ВП;
 
 
        - в разделе 2 рассматривается пример драйвера построч-
 
   ной печати, поддерживающего передачу данных;
 
 
        - в разделе  3  обсуждаются  механизмы  синхронизации:
 
   уровни  приоритета  прерываний,  некоторые  вспомогательные
 
   процессы ответвления (форк-процессы) и их очереди  ожидания
 
   ресурсов;
 
 
        - в  разделе  4  обсуждаются  соглашения,  принятые  в
 
   интерфейсе общей шины относительно передач по прямому  дос-
 
   тупу к памяти (пдп);
 
 
        - раздел 5 предоставляет обзор обработки  ввода/вывода
 
   и обсуждение взаимодействия между  драйверами  устройств  и
 
   МОС ВП.
 
 
 
                            - 14 -
 
                        00152-01 97 07-1
 
 
        Последующие разделы первой части  отвечают  на  вопрос
 
   как написать драйвер. В них показан образец подхода к напи-
 
   санию программы драйвера устройства:
 
 
        - раздел 6 содержит шаблон для написания драйвера уст-
 
   ройства;
 
 
        - раздел 7 детализирует макрокоманды, которые  исполь-
 
   зуются драйвером при создании необходимых таблиц;
 
 
        - раздел 8 содержит рассмотрение написания стандартных
 
   программ для выбора функций драйвера;
 
 
        - в разделе 9  рассматривается  написание  стандартной
 
   программы для старта ввода/вывода;
 
 
        - раздел 10 содержит  соглашения  в  интерфейсе  общей
 
   шины по части программы начала ввода/вывода;
 
 
        - в разделе 11  расссматривается  написание  программы
 
   обслуживания прерываний;
 
 
        - в разделе 12 рассматривается  написание  стандартной
 
   программы завершения  ввода/вывода  и  обработки  тайм-аута
 
   устройства;
 
 
        - в разделе 13 рассматривается  написание  стандартных
 
   программ инициализации  контроллера  и  устройства,  отмены
 
   ввода/вывода и программ регистрации ошибок;
 
 
        - раздел 14 описывает загрузку драйвера в систему;
 
 
        - в разделе 15 рассматривается средство XDELTA  (инст-
 
   румент отладки), которое вы можете использовать при отладке
 
   драйвера устройства.
 
 
                            - 15 -
 
                        00152-01 97 07-1
 
 
        Вторая часть документа содержит приложения:
 
 
        - приложение  1   детально   описывает   базу   данных
 
   ввода/вывода. Оно является важным приложением для  програм-
 
   миста драйвера устройства;
 
 
        - приложение 2 описывает макросы МОС ВП, которые можно
 
   использовать в драйверах;
 
 
        - приложение 3 рассматривает стандартные программы мос
 
   вп, которые могут вызываться драйверами устройств;
 
 
        - приложение 4 описывает какие точки входа может иметь
 
   драйвер;
 
 
        - приложение 5 содержит образец драйвера для устройст-
 
   ва преобразования сигнала из аналоговой формы в цифровую;
 
 
        - приложение 6 основные термины;
 
 
        - перечень терминов в конце второй  части  руководства
 
   определяет термины, относящиеся к вводу/выводу и драйверу.
 
 
        - приложение 7 перечень принятых сокращений.
 
 
        В данном документе обращение к программам может  зада-
 
   ваться тремя различными способами:
 
 
        1) фраза "выдать  запрос  на  системное  обслуживание"
         
   предполагает использование инструкции CALL;
 
 
        2) фраза "вызвать программу" предполагает  использова-
 
   ние инструкций JSB или BSB;
 
 
        3) фраза "передать управление к" предполагает  исполь-
 
   зование инструкций BRB, BRW или JMP.
 
 
                            - 16 -
 
                        00152-01 97 07-1
 
 
        В данном документе используются следующие сокращения:
 
 
   сокращение                    значение
 
   <ВК>              сокращение от одного до шести  символов
 
                    указывает на то, что  нажимается клавиша
 
                    на терминале, например <ВК>.
 
   <CTRL/X>          выражение <CTRL/X> означает,что необхо-
 
                    димо  нажать клавишу CTRL с одновременно
 
                    нажатой другой клавишей,например, CTRL/C,
 
                    CTRL/Y,CTRL/O.
 
   $TYPE MYFILE.DAT  последовательность вертикально располо-
 
          .         Женных пробелов или точек означает,  что
 
          .         Либо не все данные, которые система долж-
 
          .         На вывести в ответ на конкретную команду,
 
                    показаны, или не все данные, которые дол-
 
                    жен ввести пользователь, показаны.
 
   FILE-SPEC,...     Горизольтально расположенные точки  ука-
 
                    зывают, что могут  быть  введены дополни-
 
                    тельные параметры, значения или данные.
 
   [LOGICAL-NAME]    квадратные скобки указывают, что, заклю-
 
                    ченный в них фрагмент не обязателен ( но
 
                    квадратные  скобки  обязательны  в  син-
 
                    таксисе  имени  каталога  в спецификации
 
                    файла  или  синтаксисе спецификации под-
 
                    строки в операторе присвоения).
 
 
   
        1.1. Общие сведения
 
 
 
        Чтобы понять, как драйверы используются  системой  MOC 
 
   ВП, необходимо ознакомиться со следующими  основными  поня-
 
 
 
                            - 17 -
 
                        00152-01 97 07-1
 
 
   тиями:
 
 
        - асинхронная природа драйвера устройства;
 
 
        - форк-процессы;
 
 
        - контекст процесса и контекст прерывания;
 
 
        - зависимость от устройства и  независимость  от  уст-
 
   ройства;
 
 
        - база данных ввода/вывода;
 
 
        - механизмы синхронизации.
 
 
        В разделе определены несколько терминов, которые  опи-
 
   сывают аппаратную конфигурацию:
 
 
        - заднепанельное (генмонтажное) соединение -  внутрен-
 
   няя  шина  процессора,  которая  используется  общей  шиной
 
   (через соответствующие адаптеры) для  связи  с  оперативной
 
   памятью и центральным процессором;
 
 
        - адаптер общей шины - интерфейсное  устройство  между
 
   генмонтажным соединением и общей шиной; адаптеры общей шины
 
   могут быть устройствами с прямым и  косвенным  вектором.  В
 
   случае прямого вектора адаптера общей шины, прерывания уст-
 
   ройств от общей шины вызывают прямое прерывание процессора,
 
   который выполняет переход на вектора страницы два (или три)
 
   блока управления  системы  (SCB).  При  косвенных  векторах
 
   адаптера общей шины прерывания устройств общей  шины  вызы-
 
   вают прерывание в адаптере и обслуживаются программой  обс-
 
   луживания прерываний адаптера общей шины. В разделах 3 и  4
 
   эти адаптеры описываются более детально;
 
 
 
                            - 18 -
 
                        00152-01 97 07-1
 
 
        - диспетчер прерываний  -  совокупность  аппаратных  и
 
   программных средств,  которые  направляют  прерывания  уст-
 
   ройств общей шины к соответствующей программе  обслуживания
 
   прерываний драйвера;
 
 
        - физический адрес - физическая память, которая  адре-
 
   суется адаптерами общей шины через генмонтажное соединение.
 
 
 
        1.2. Компоненты драйвера устройства
 
 
 
        Модуль драйвера устройства состоит из следующих  прог-
 
   рамм и таблиц:
 
 
        - программа или программы предобработки  в/в,  которые
 
   проверяют специфические для устройства  параметры  запросов
 
   ввода/вывода, формат данных, выделяют  системные  буферы  и
 
   блокируют страницы в памяти;
 
 
        - стартовая программа ввода/вывода, которая  активизи-
 
   рует устройство;
 
 
        - программа обслуживания прерываний, которая  обслужи-
 
   вает прерывания от устройства;
 
 
        - программа восстановления ошибок,  которая  повторяет
 
   операции ввода/вывода и выполняет другую работу при появле-
 
   нии ошибок;
 
 
        - программа  регистрации  ошибок,  которая  записывает
 
   содержимое регистров устройства и  другие  данные  в  буфер
 
   ошибок системы;
 
 
        - программа отмены  ввода/вывода,  которая  прекращает
 
 
 
                            - 19 -
 
                        00152-01 97 07-1
 
 
   дальнейшую обработку запроса ввода/вывода;
 
 
        - программа инициализации, которая подготавливает уст-
 
   ройство или контроллер к работе  при  выполнении  начальной
 
   загрузки или во время восстановления после сбоя питания;
 
 
        - прологовая таблица драйвера, которая описывает драй-
 
   вер и тип устройства  для  процедуры  МОС  ВП,  загружающей
 
   драйверы в систему;
 
 
        - диспетчерская  таблица  драйвера,  которая  содержит
 
   адреса точек входа в стандартные программы драйвера и запи-
 
   сывает размер буфера диагностики и буфера регистрации  оши-
 
   бок в соответствии с типом устройства;
 
 
        - таблица выбора функций, которая содержит все  допус-
 
   тимые коды функций для устройства и указывает адреса  прог-
 
   рамм предобработки ввода/вывода, связанных с каждой  допус-
 
   тимой функцией.
 
 
        Порядок различных  программ  и  таблиц  внутри  модуля
 
   драйвера может быть произвольным.
 
 
 
        1.3. Асинхронная природа драйвера устройства
 
 
 
        Используя таблицы драйвера и другую информацию, обслу-
 
   живаемую драйвером и операционной системой, система опреде-
 
   ляет, какие из программ следует активизировать и когда  они
 
   должны быть активизированы. Например, когда  пользовательс-
 
   кий процесс вызывает программу системного обслуживания QIO,
 
   она вызывает различные программы драйвера, для предобработ-
 
   ки запроса ввода/вывода. Аналогично, если  пользовательский
 
 
 
                            - 20 -
 
                        00152-01 97 07-1
 
 
   процесс  вызывает  программу  системного  обслуживания  для
 
   отмены ввода/вывода в канале, программа системного обслужи-
 
   вания активизирует программу отмены ввода/вывода в  драйве-
 
   ре.
 
 
        Драйвер устройства не выполняется от начала до  конца.
 
   Система вызывает  программы  драйвера,  приостанавливает  и
 
   возобновляет их; центральный процессор прерывает и повторно
 
   активизирует программы драйвера. Из-за такой  прерывистости
 
   выполнения  программ  драйвера,  на  МОС   ВП   возлагается
 
   ответственность за синхронизацию выполнения различных прог-
 
   рамм драйвера и синхронизацию выполнения всех  драйверов  в
 
   системе. Операционная система МОС ВП синхронизирует  выпол-
 
   нение драйверов, используя форк-процессы, уровни приоритета
 
   прерываний, форк-очереди и очереди ожидания ресурсов.
 
 
 
        1.4. Форк-процессы
 
 
 
        Форк-процесс  является  процессом,  который  создается
 
   динамически и  имеет  минимальный  контекст.  Форк-процессы
 
   выполняются полностью внутри пространства  системных  адре-
 
   сов.  Операционная  система  МОС  ВП  создает  и  планирует
 
   форк-процесс путем построения специального  блока  управле-
 
   ния,  называемого  форк-блоком,  включения  этого  блока  в
 
   форк-очередь и запроса программного прерывания. Диспетчери-
 
   зация форк-очередей и форк-процессов рассматривается в под-
 
   разделе I.8.
 
 
        Форк-процесс драйвера имеет следующий контекст:
 
 
        1) три общих регистра;
 
 
 
                            - 21 -
 
                        00152-01 97 07-1
 
 
        2) счетчик команд (PC);
 
 
        3)  блок  управления   устройством   в   базе   данных
 
   ввода/вывода, который описывает устройство назначения  зап-
 
   роса ввода/вывода.
 
 
        Блок управления устройством содержит  также  форк-блок
 
   драйвера. В подразделе I.7 рассматривается блок  управления
 
   устройством  и  другие  блоки  управления  в  базе   данных
 
   ввода/вывода.
 
 
        Как и другие процессы, форк-процессы могут быть приос-
 
   тановлены и прерваны. Мос вп помещает форк-процесс драйвера
 
   в состояние ожидания, когда этот процесс запрашивает недос-
 
   тупные ресурсы, например, канал данных контроллера. Процес-
 
   сор прерывает форк-процесс, когда процессор принимает  зап-
 
   рос на прерывание с более высоким уровнем приоритета.
 
 
        Форк-процессы драйвера выполняются на повышенных прио-
 
   ритетных уровнях прерываний, чтобы уменьшить число прерыва-
 
   ний. Форк-процесс может поднять уровень приоритета  до  31,
 
   чтобы заблокировать  все  остальные  прерывания,  если  это
 
   необходимо.
 
 
        Система автоматически сохраняет  содержимое  регистров
 
   прерываемого форк-процесса и восстанавливает их  содержимое
 
   после того, как процесс активизируется вновь.  Операционная
 
   система не выгружает,  поскольку  форк-блок  и  все  данные
 
   относящиеся к форк-процессу размещаются в системной памяти,
 
   не разделенной на страницы.
 
 
 
 
 
 
 
                            - 22 -
 
                        00152-01 97 07-1
 
 
        1.5. Контекст процесса и контекст прерывания
 
 
 
        Так как драйвер устройства состоит из набора программ,
 
   которые активизируются с помощью МОС ВП, в большинстве слу-
 
   чаев операционная система определяет  контекст,  в  котором
 
   выполняются эти программы. В  качестве  примера  рассмотрим
 
   запрос на запись, который выполняется без ошибки:
 
 
        - пользовательский  процесс,  выполняющийся  в  режиме
 
   пользователя,  вызывает  системную  программу  обслуживания
 
   очереди запросов ввода/вывода (QIO) для операции записи;
 
 
        - системная программа  обслуживания  очереди  запросов
 
   ввода/вывода (QIO) получает управление в контексте процесса
 
   пользователя, но в режиме ядра;
 
 
        - системная программа использует таблицу выбора  функ-
 
   ций драйвера для вызова соответствующей программы предобра-
 
   ботки. Эти программы, называемые  программами  FDT,  выпол-
 
   няются в полном контексте процесса в режиме ядра;
 
 
        - когда предобработка завершается,  программа  МОС  ВП
 
   создает форк-процесс  для  выполнения  стартовой  программы
 
   ввода/вывода (из состава программ драйвера) в режиме ядра;
 
 
        - стартовая  программарта  ввода/вывода   активизирует
 
   устройство и приостанавливает себя. В  этой  точке  МОС  ВП
 
   приостанавливает форк-процесс, выполняющий стартовую  прог-
 
   рамму ввода/вывода, и сохраняет контекст,  необходимый  для
 
   возобновления  стартовой  программы  ввода/вывода  с  точки
 
   приостанова;
 
 
 
 
 
                            - 23 -
 
                        00152-01 97 07-1
 
 
        - когда  устройство  завершает  передачу  данных,  оно
 
   выдает прерывание. Прерывание заставляет систему  активизи-
 
   ровать программу обслуживания прерываний драйвера;
 
 
        - обработку прерывания от устройства  выполняет  прог-
 
   рамма обслуживания прерывания. Затем эта  программа  возоб-
 
   новляет стартовую программу ввода/вывода в контексте;
 
 
        - стартовая  программа  ввода/вывода  вновь   получает
 
   управление в контексте прерывания, но  почти  сразу  выдает
 
   запрос в операционную систему на преобразование своего кон-
 
   текста к контексту  форк-процесса.  На  этом  заканчивается
 
   обработка прерывания;
 
 
        - при возобновлении работы в  контексте  форк-процесса
 
   стартовая программа  ввода/вывода  выполняет  специфическое
 
   для устройства завершение ввода/вывода и передает  управле-
 
   ние системе для дополнительной постобработки ввода/вывода;
 
 
        - постобработка ввода/вывода в системе МОС ВП происхо-
 
   дит на уровне  приоритета  программного  прерывания,  после
 
   чего формируется асинхронное  прерывание  системы  (AST)  в
 
   режиме ядра для  пользовательского  процесса,  запросившего
 
   ввод/вывод;
 
 
        - когда предоставляется возможность выполнения  AST  в
 
   режиме ядра, программа AST работает в полном контексте про-
 
   цесса в режиме ядра, чтобы доставить данные и  состояние  в
 
   процесс. Если исходный запрос задает AST  пользовательского
 
   режима, AST режима ядра устанавливает его в очередь;
 
 
        - когда управление получает пользовательский  процесс,
 
   пользовательская программа AST выполняется  в  полном  кон-
 
 
                            - 24 -
 
                        00152-01 97 07-1
 
 
   тексте процесса в режиме пользователя.
 
 
        Большинство программ драйвера выполняются в  контексте
 
   форк-процесса. Существенно, тем  не  менее,  что  различные
 
   программы драйвера не пытаются превысить  ограничения  кон-
 
   текста, в котором они выполняются.
 
 
 
        1.6. Зависимость     от     устройства     и
 
             независимость от устройства
 
 
 
        Подход к вводу/выводу в МОС ВП состоит в том, что сис-
 
   тема выполняет возможно  большую  часть  обработки  запроса
 
   ввода/вывода, а драйверы должны ограничиваться только  спе-
 
   цифическими для устройств аспектами обработки ввода/вывода.
 
   Чтобы обеспечить такой подход, операционная система МОС  ВП
 
   предоставляет в распоряжение драйверов следующие средства:
 
 
        - системная программа  обслуживания  очереди  запросов
 
   ввода/вывода  (QIO)   занимается   предобработкой   запроса
 
   ввода/вывода путем выполнения тех функций и проверок, кото-
 
   рые являются общими для всех устройств; например, она  про-
 
   веряет аргументы в запросе ввода/вывода, которые не являют-
 
   ся специфическими для устройства.  Этот  тип  предобработки
 
   называется независимой от устройства предобработкой;
 
 
        - операционная система МОС ВП включает некоторое коли-
 
   чество программ, которые могут  вызываться  драйверами  для
 
   выполнения  предобработки  ввода/вывода,  распределения   и
 
   перераспределения ресурсов и для  синхронизации  выполнения
 
   драйвера;
 
 
 
 
 
                            - 25 -
 
                        00152-01 97 07-1
 
 
        - постобработка ввода/вывода в МОС ВП выполняет  неза-
 
   висимую  от  устройств  постобработку  для  всех   запросов
 
   ввода/вывода.
 
 
        Таким образом, драйверы могут оставить независимую  от
 
   устройств обработку  ввода/вывода  операционной  системе  и
 
   сосредоточиться на зависимых от устройства  аспектах,  т.е.
 
   Тех аспектах, которые изменяются от одного типа  устройства
 
   к другому. Кроме того, драйверы  могут  посылать  вызовы  в
 
   систему МОС ВП для выполнения  многих  функций,  являющихся
 
   специфическими для устройств, но общими для нескольких уст-
 
   ройств.
 
 
 
        1.7. База данных ввода/вывода
 
 
 
        Так как драйвер  и  операционная  система  кооперируют
 
   свои усилия для обработки запроса ввода/вывода, они  должны
 
   иметь  общую  базу   данных   ввода/вывода.   База   данных
 
   ввода/вывода в МОС ВП состоит из трех основных частей:
 
 
        - таблиц драйверов, которые позволяют  системе  загру-
 
   жать драйверы, проверять функции устройств и вызывать драй-
 
   веры в их точках входа;
 
 
        - блоков управления, которые описывают каждый  адаптер
 
   шины, каждый  тип  устройства,  каждое  устройство,  каждый
 
   контроллер и каждый логический путь (канал) от  процесса  к
 
   устройству;
 
 
        - пакеты запросов ввода/вывода, в которых определяются
 
   отдельные запросы на ввод/вывод.
 
 
 
 
                            - 26 -
 
                        00152-01 97 07-1
 
 
        В каждом драйвере определяются три  таблицы,  перечис-
 
   ленные в подразделе  1.2.  В  приложении  1  документа  [3]
 
   детально рассматриваются  каждый  из  блоков  управления  и
 
   пакет запросов ввода/вывода.
 
 
        На рис.1 рассматриваются некоторые  взаимосвязи  между
 
   программами ввода/вывода МОС ВП, базой данных  ввода/вывода
 
   и драйвером устройства.
 
 
 
 
 
 
 
 
 
 
 
 
                            - 27 -
 
                        00152-01 97 07-1
 
 
                База данных ввода/вывода
 
   *******************   ****************    **************
   * Блок управления *   * Пакет        *    * CCB        *
   * процесса        *   * запросов     *    * описывает  *
   * описывает       *<--* ввода/вывода *----* логический *
   * запрашивающий   *   * описывает    *    * путь к     *
   * процесс         *   * запросы      *    * устройству *
   *******************   * ввода/вывода *    **************
                         ****************              I
                                 I                     I
                                 -------------------   I
   *****************                               I   I
   *               *                               I   I
   *               *                               I   I
   *****************     ****************    *****************
   * Драйверная    *     * DDB для типа *    * UCB описывает *
   * программа FDT *<--  * устройства   *<---* устройство    *
   *****************  I  ****************    *****************
   *               *  I          I                     I
   *               *  I          I                     I
   *****************  I          I                     I
   * Драйверная    *  I          I                     I
   * программа     *  I  ******************            I
   * старта        *  ---* DDT определяет *            I
   * ввода/вывода  *<----* местоположение *            I
   *               *     * драйвера       *            I
   *****************     ******************            I
   *               *                                   I
   *               *                                   I
   *****************                                   I
   * Драйверная    *                                   I
   * программа     *<---          ----------------------
   * обслуживания  *   I          I
   * прерываний    *   I          I
   -----------------   I          I
   *               *   I  ******************
   *               *   ---* CRB            *
   *               *      * синхронизирует *
   *****************      * контроллер     *
   * Драйверная    *      ******************
   * программа     *          I   I
   * инициализации *<----------   I
   * контроллера   *              I
   *****************              I
   *               *      *****************    *************
   *               *      * IDB           *    * ADP       *
   *****************      * описывает     *--->* описывает *
                          * контроллер    *    * UBA       *
                          *****************    *************
                                  I
                                  I
                          ***********************
                          * Регистры устройства *
                          ***********************
 
                              Рис.1
 
 
 
 
                            - 28 -
 
                        00152-01 97 07-1
 
 
        1.7.1. Блоки   управления   в   базе    данных
 
               ввода/вывода
 
 
 
        Блоки управления в базе данных ввода/вывода  описывают
 
   периферийную аппаратуру и используются системой МОС ВП  для
 
   синхронизации доступа к устройствам. МОС ВП  создает  блоки
 
   управления при запуске системы или при загрузке  в  систему
 
   драйвера, написанного пользователем. Драйверы обращаются  к
 
   некоторым или ко  всем  управляющим  блокам,  перечисленным
 
   ниже:
 
 
        - блок данных устройства (DDB);
 
        - блок управления устройством (UCB);
 
        - блок запроса канала (CRB);
 
        - диспетчерский блок прерываний (IDB);
 
        - блок управления адаптером (ADP);
 
        - блок управления каналом (CCB).
 
 
 
        1.7.1.1. Блок данных устройства
 
 
 
        Блок данных устройства содержит информацию, общую  для
 
   всех устройств одного типа, подсоединенных к тому-же  конт-
 
   роллеру. В нем записано общее имя устройства в соединении с
 
   определителем контроллера, имя драйвера  и  местонахождение
 
   драйвера для этих устройств. Блок данных устройства  содер-
 
   жит так же указатель на первый блок управления  устройством
 
   из всех устройств, присоединенных к данному контроллеру.
 
 
 
 
 
 
 
 
 
                            - 29 -
 
                        00152-01 97 07-1
 
 
        1.7.1.2. Блок управления устройством
 
 
 
        Операционная система определяет блоки управления  уст-
 
   ройством для каждого устройства, присоединенного к системе.
 
   Блок управления определяет характеристики и текущее состоя-
 
   ние  отдельного  устройства.  Кроме   того,   он   содержит
 
   форк-блок,  используемый  драйвером,  и  заголовок   списка
 
   (LISTHEAD)  для   очереди   пакетов   запросов,   ожидающих
 
   ввода/вывода  на  данном  устройстве.  Поскольку   драйверы
 
   выполняются как форк-процессы, которые создаются для каждой
 
   операции ввода/вывода на каком-то устройстве, рассматривае-
 
   мые блоки управления  являются  основными  элементами  базы
 
   данных ввода/вывода. Когда драйвер  приостанавливается  или
 
   прерывается, форк-блок UCB сохраняет контекст драйвера.
 
 
 
        1.7.1.3. Блок запроса канала
 
 
 
        Операционная система создает блок запроса  канала  для
 
   каждого контроллера. Блок запроса канала определяет текущее
 
   состояние контроллера и перечисляет  устройства,  ожидающие
 
   канал данных контроллера.  Кроме  того,  он  содержит  код,
 
   который направляет прерывание устройства к программе обслу-
 
   живания прерываний, драйвера данного устройства.
 
 
 
        1.7.1.4. Блок диспетчеризации прерываний
 
 
 
        Система создает диспетчерский блок прерываний для каж-
 
   дого контроллера. Блок прерываний перечисляет все устройст-
 
   ва, связанные с контроллером, и указывает на UCB того  уст-
 
   ройства, которое  обслуживается  контроллером  в  настоящее
 
 
                            - 30 -
 
                        00152-01 97 07-1
 
 
   время. Кроме того, в блоке диспетчеризации прерывания  есть
 
   указатели на регистры устройства и адаптер общей  шины  для
 
   данного контроллера.
 
 
 
        1.7.1.5. Блок управления адаптером
 
 
 
        Блок управления адаптером определяет характеристики  и
 
   текущее состояние  адаптера  общей  шины.  Блок  управления
 
   адаптером для общей шины содержит  информацию  о  состоянии
 
   очередей и битовые  карты  распределения,  необходимые  для
 
   распределения ресурсов адаптера. Мос вп предоставляет прог-
 
   раммы, которые могут вызываться драйверами для установления
 
   интерфейса с их адаптерами общей шины.
 
 
 
        1.7.1.6. Блок управления каналом
 
 
 
        Канал является логической связью между процессом и UCB
 
   определенного устройства. Блок управления каналом описывает
 
   эту  связь.  Каждый  процесс  владеет  несколькими  блоками
 
   управления каналом. Когда в ходе выполнения процесса  вызы-
 
   вается системная программа назначения  канала  ввода/вывода
 
   (ASSIGN), система заносит описание назначенного  устройства
 
   в блок управления каналом. В отличие  от  структур  данных,
 
   упоминавшихся ранее, блок управления каналом не размещается
 
   в несстраничном системном пространстве: он располагается  в
 
   области управления процессом (пространство P1).
 
 
 
 
 
 
 
 
 
 
                            - 31 -
 
                        00152-01 97 07-1
 
 
        1.7.2. Пакеты запросов ввода/вывода
 
 
 
        Когда  процесс  запрашивает  ввод/вывод,  операционная
 
   система конструирует пакет данных, называемый пакетом  зап-
 
   роса   ввода/вывода   (IRP),   который   описывает   запрос
 
   ввода/вывода в стандартной форме.
 
 
        Пакет запроса ввода/вывода содержит  поля,  в  которые
 
   система и драйверные программы  предобработки  ввода/вывода
 
   могут писать информацию, такую как зависящие от  устройства
 
   параметры, заданные в обращении (вызове) к системной  прог-
 
   рамме обслуживания очереди запросов ввода/вывода  (QIO).  В
 
   дальнейшем система отсылает пакет запроса к стартовой прог-
 
   рамме ввода/вывода драйвера.  Драйверная  программа  старта
 
   ввода/вывода использует этот пакет как источник для детали-
 
   зации операции, которая должна быть выполнена. Пакет  вклю-
 
   чает адреса буферов, указатель  на  устройство  назначения,
 
   код функции ввода/вывода и прочие указатели на базу  данных
 
   ввода/вывода.
 
 
 
        1.8. Синхронизация
 
 
 
        Операционная система МОС ВП  использует  аппаратные  и
 
   программные уровни приоритета прерываний (IPL) и  связанные
 
   с ними прерывания, форк-очереди, очереди ожидания  ресурсов
 
   для синхронизации выполнения всех драйверов внутри  системы
 
   и для синхронизации выполнения  различных  программ  внутри
 
   драйвера.
 
 
 
 
 
 
 
                            - 32 -
 
                        00152-01 97 07-1
 
 
        1.8.1. Уровни приоритета прерываний
 
 
 
        Процессор определяет 32 уровня  приоритета  прерываний
 
   (от 0 до 31). Уровни приоритета со старшими номерами резер-
 
   вируются для аппаратных прерываний, например, прерываний от
 
   устройств. Операционная система использует уровни  прерыва-
 
   ний с младшими номерами. Старшие IPL всегда  имеют  преиму-
 
   щество перед младшими. В документе [6] описывается  исполь-
 
   зование IPL процессором . Следующие IPL  представляют  осо-
 
   бенный интерес для драйверов:
 
 
        - IPL устройств (от 20 до 23); с такими IPL выполняют-
 
   ся драйверные программы обслуживания прерываний;
 
 
        - IPL форк-процессов драйверов (от 8 до 11);  с  этими
 
   IPL выполняются драйверные форк-процессы;
 
 
        - любой доступ к системным структурам данных,  включая
 
   базу данных в/в, должен выполняться  с  приоритетом     IPL   
 
   $SYNCH, IPL;
 
 
        - IPL завершение ввода/вывода (IPL 4); МОС ВП получает
 
   управление для начала независящей от  устройства  предобра-
 
   ботки ввода/вывода с этим приоритетом;
 
 
        - IPL доставки AST (IPL 2); используется для координа-
 
   ции доставки AST к процессу пользователя; с таким приорите-
 
   том выполняется системная программа  обслуживания  запросов
 
   очереди ввода/вывода (QIO).
 
 
 
 
 
 
 
 
 
                            - 33 -
 
                        00152-01 97 07-1
 
 
        1.8.2. Прерывания от устройств
 
 
 
        Когда процессор разрешает  прерывание  от  устройства,
 
   процессор и диспетчер прерываний МОС ВП сохраняют  контекст
 
   текущего процесса. Во время прерывания  процессор  помещает
 
   счетчик команд и длинное слово состояния в стек прерываний.
 
   Кроме того, диспетчер прерываний сохраняет в стеке регистры
 
   от R0 до R5.
 
 
        Программа обслуживания прерываний, активизированная  в
 
   результате прерывания, следует соглашениям сохранения всего
 
   остального контекста прерванного процесса  следующим  обра-
 
   зом:
 
 
        - использует только регистры от R0 до R5;
 
 
        - очищает стек после использования.
 
 
        После  обслуживания  прерывания  драйверная  программа
 
   обслуживания прерывания восстанавливает из стека содержимое
 
   регистров R0-R5. Процессор восстанавливает предыдущие PC  и
 
   PSL прерванной программы,  после  чего  прерванный  процесс
 
   продолжает выполняться.
 
 
 
        1.8.3. Форк-очереди
 
 
 
        Когда  программа  обслуживания  прерывания   завершает
 
   обработку прерывания от устройства, она передает управление
 
   драйверу для завершения зависящей от  устройства  обработки
 
   запроса ввода/вывода. Когда драйвер получает управление, он
 
   работает на IPL устройства. Почти немедленно драйвер должен
 
   понизить уровень приоритета до IPL форк-процесса  драйвера.
 
 
                            - 34 -
 
                        00152-01 97 07-1
 
 
   таким образом, он не блокирует прерывания  от  других  уст-
 
   ройств. Драйвер понижает IPL, вызывая макрокоманду МОС  ВП,
 
   которая создает форк-процесс, выполняющийся на форк-IPL.
 
 
        Каждый драйверный форк-IPL имеет форк-очередь.  Макро-
 
   команда операционной системы помещает форк-блок драйвера  в
 
   форк-очередь, которая  соответствует  форк-IPL  драйвера  и
 
   выдает запрос программного прерывания для данного IPL. Ког-
 
   да  программное  прерывание   разрешается,   форк-диспетчер
 
   (программа обслуживания  прерываний  в  МОС  ВП)  извлекает
 
   форк-блоки из форк-очереди и реактивизирует драйвер в  точ-
 
   ке, следующей за вызовом макрокоманды.
 
 
 
        1.8.4. Очереди ожидания ресурсов
 
 
 
        Драйверы конкурируют за овладение следующими разделяе-
 
   мыми ресурсами:
 
 
        - центральный процессор;
 
 
        - регистры отображения (MAPPING) адаптера общей шины;
 
 
        Для устройств DMA (ПДП);
 
 
        - буферизованный путь данных адаптера общей шины;
 
 
        - канал данных контроллера, если устройство  присоеди-
 
   няется к групповому контроллеру.
 
 
        Когда форк-процесс драйвера нуждается в ресурсе, кото-
 
   рый занят, программы управления ресурсами МОС ВП  выполняют
 
   следующие действия:
 
 
 
 
 
                            - 35 -
 
                        00152-01 97 07-1
 
 
        - сохраняют контекст форк-процесса  в  форк-блоке  UCB
 
   устройства;
 
 
        - вставляют адрес форк-блока UCB  в  очередь  ожидания
 
   ресурса;
 
 
        - приостанавливают выполнение форк-процесса драйвера.
 
 
        Когда форк-процесс другого драйвера освобождает  необ-
 
   ходимый ресурс, программы управления  ресурсами  в  МОС  ВП
 
   выполняют следующие шаги  для  возобновления  форк-процесса
 
   этого драйвера:
 
 
        - извлекают следующий форк-блок  из  очереди  ожидания
 
   ресурса;
 
 
        - восстанавливают контекст форк-процесса в регистрах;
 
 
        - возобновляют приостановленный форк-процесс драйвера.
 
 
 
        1.9. Функции драйвера устройства
 
 
 
        Драйвер  устройства  в  МОС  ВП  управляет  операциями
 
   ввода/вывода периферийного устройства путем реализации сле-
 
   дующих функций:
 
 
        1) определяет периферийное  устройство  для  остальной
 
   части МОС ВП;
 
 
        2) определяет драйвер для системной процедуры, которая
 
   загружает драйвер в пространство виртуальных адресов систе-
 
   мы и создает связанные с драйвером структуры данных;
 
 
        3) подготавливает устройство и  (или)  контроллер  для
 
 
 
                            - 36 -
 
                        00152-01 97 07-1
 
 
   работы во время старта системы и при  восстановлении  после
 
   нарушения питания;
 
 
        4) выполняет  зависящую  от  устройства  предобработку
 
   ввода/вывода;
 
 
        5) транслирует  запрограммированные  запросы  операции
 
   ввода/вывода в команды, специфические для устройства;
 
 
        6) активизирует устройство;
 
 
        7)  обрабатывает  аппаратные  прерывания,  порождаемые
 
   устройством;
 
 
        8) обрабатывает состояния тайм-аута устройства;
 
 
        9) обрабатывает запросы отмены  ввода/вывода  на  уст-
 
   ройстве;
 
 
        10) сообщает об ошибках устройства программе регистра-
 
   ции ошибок;
 
 
        11) возвращает сообщение о состоянии устройства в про-
 
   цесс, который запросил операцию ввода/вывода.
 
 
        Первые две функции выполняет прологовая таблица  драй-
 
   вера, рассмотренная в  подразделе  7.I,  остальные  функции
 
   выполняются программами драйвера.
 
 
 
        1.9.1. Программы инициализации
 
 
 
        Контроллеры и устройства требуют инициализации,  когда
 
   системная процедура загрузки драйвера загружает  драйвер  в
 
   память и когда система МОС ВП восстанавливается после нару-
 
 
 
                            - 37 -
 
                        00152-01 97 07-1
 
 
   шения питания. Об'ем  и  тип  инициализации  изменяется  от
 
   одного типа устройства к другому. Подраздел  I3.I  содержит
 
   дополнительную  информацию  о  программах  инициализации  в
 
   драйверах устройств.
 
 
 
        1.9.2. Программы FDT
 
 
 
        Драйвер содержит таблицу выбора функций (FDT), которая
 
   указывает программы предобработки ввода/вывода, для  выпол-
 
   нения различных функций устройств. Системная программа обс-
 
   луживания очереди запросов  ввода/вывода  (QIO)  использует
 
   код функции, указанный в  запросе,  для  выбора  одной  или
 
   более программ FDT для выполнения. Программы FDT  выполняют
 
   такие функции, как размещение буферов, блокировку (LOCKING)
 
   страниц в памяти и проверку зависящих от  устройства  пара-
 
   метров (от PI до P6) запроса ввода/вывода.
 
 
        Драйвер содержит программы FDT, зависящие от устройст-
 
   ва. Мос  вп  предоставляет  дополнительные  программы  FDT,
 
   которые  выполняют  обработку,  общую  для  многих  функций
 
   ввода/вывода, (подраздел 8.7.). Для драйверов целесообразно
 
   использовать программы, предоставляемые операционной систе-
 
   мой, когда это возможно.
 
 
        Поскольку программы FDT вызываются системными програм-
 
   мами обслуживания запросов очереди ввод/вывода  (QIO),  они
 
   работают и работают в  полном  контексте  пользовательского
 
   процесса. В результате, программы FDT имеют доступ к  буфе-
 
   рам определенным пользователем, размещенным в  пространстве
 
   адресов процесса; эти буферы недоступны программам  драйве-
 
   ра, выполняющимся в контексте форк-процесса.
 
 
                            - 38 -
 
                        00152-01 97 07-1
 
 
        1.9.3. Стартовая программа ввода/вывода
 
 
 
        Стартовая   программа   ввода/вывода   выполняется   в
 
   форк-процессе драйвера и выполняет следующие функции, зави-
 
   сящие от устройства:
 
 
        - транслирует код функции ввода/вывода в команду, спе-
 
   цифическую для устройства;
 
 
        - передает   детали   запроса   из   пакета    запроса
 
   ввода/вывода в UCB устройства;
 
 
        - получает доступ к контроллеру, если он групповой;
 
 
        - получает необходимые ресурсы общей шины, если  пере-
 
   дачи будут выполняться по прямому доступу к памяти;
 
 
        - модифицирует  регистры  устройства  для  активизации
 
   устройства;
 
 
        - выполняет  зависящую  от  устройства   постобработку
 
   ввода/вывода после передачи данных.
 
 
        Стартовая  программа  ввода/вывода   может   оказаться
 
   вынуждена ожидать, пока контроллер или ресурсы  общей  шины
 
   станут доступными. В обоих случаях МОС ВП  приостанавливает
 
   программу и возобновляет ее, когда ресурсы освобождаются. В
 
   п. I.8.4. Рассматривается контекст, который  сохраняет  мос
 
   вп для приостановленной программы.
 
 
        После   активизации   устройства   программа    старта
 
   ввода/вывода вызывает макрокоманду операционной системы для
 
   ожидания прерывания,  которая  приостанавливает  выполнение
 
   драйвера. Драйвер остается в приостановленном состоянии  до
 
 
                            - 39 -
 
                        00152-01 97 07-1
 
 
   тех пор, пока программа  обслуживания  прерываний  драйвера
 
   обслужит прерывание и возвратит управление драйверу. В этой
 
   точке драйвер выполняет постобработку ввода/вывода, завися-
 
   щую от устройства, и затем передает управление в МОС ВП для
 
   независящей от устройства постобработки ввода/вывода.
 
 
 
        1.9.4. Программа обслуживания прерываний
 
 
 
        При прерывании от устройства МОС ВП передает  управле-
 
   ние программе обслуживания прерываний драйвера в  контексте
 
   прерывания. Программа обслуживания  прерываний  определяет,
 
   ожидалось прерывание или нет, и  выполняет  соответствующие
 
   действия. Программа  обслуживания  прерываний  возобновляет
 
   выполнение драйвера для постобработки ввода/вывода.
 
 
 
        1.9.5. Управление таймаутом устройства
 
 
 
        В результате ошибки или отключения устройства от  сис-
 
   темы возможно, что устройству не удастся завершить операцию
 
   передачи в разумный период времени. Такое  состояние  назы-
 
   вается  таймаутом  устройства.  Когда  стартовая  программа
 
   ввода/вывода вызывает макрокоманду ожидания прерывания, она
 
   указывает интервал времени, в течение  которого  устройство
 
   может завершить пересылки без таймаута, а также  имя  обра-
 
   ботчика таймаута,  который  вызывается  системой  в  случае
 
   появления таймаута. Эта информация записывается в UCB  уст-
 
   ройства.
 
 
        Раз в секунду система МОС ВП  (по  таймеру)  проверяет
 
   все устройства в системе на наличие  таймаута.  Как  только
 
 
 
                            - 40 -
 
                        00152-01 97 07-1
 
 
   обнаруживается устройство, в котором произошел таймаут, она
 
   вызывает обработчик таймаута.
 
 
 
        1.9.6. Программа отмены ввода/вывода
 
 
 
        Операционная система обеспечивает системную  программу
 
   для отмены ввода/вывода в канале, которая может  вызываться
 
   пользовательскими процессами в этих целях. Системная  прог-
 
   рамма отмены ввода/вывода в канале, в свою  очередь,  вызы-
 
   вает программу отмены ввода/вывода драйвера. Кроме того мос
 
   вп вызывает программу отмены ввода/вывода  драйвера,  когда
 
   счетчик обращений к устройству имеет нулевое значение;  что
 
   случается, когда все пользователи,  закрепившие  каналы  за
 
   данным устройством, освободили их.
 
 
 
        1.9.7. Программа регистрации ошибок
 
 
 
        Программа регистрации ошибок драйвера заполняет  буфер
 
   регистрации ошибок информацией об ошибке, например,  содер-
 
   жимым регистров во время ошибок. Мос вп предоставляет прог-
 
   рамму, которая может  вызываться  драйвером  для  выделения
 
   буфера регистрации ошибок и передачи  управления  программе
 
   дампа регистров.
 
 
 
        1.10. Пример запроса  ввода/вывода  по  общей
 
              шине
 
 
 
        Рис.2 иллюстрирует, как операционная система МОС ВП  и
 
   6;драйвер устройства  обрабатывают  запрос  пользовательского
 
   процесса на операцию  чтения  для  устройства,  обладающего
 
 
                            - 41 -
 
                        00152-01 97 07-1
 
 
   возможностью прямого доступа к памяти и подключенного через
 
   общую шину.
 
 
 
 
 
 
 
 
 
 
 
                            - 42 -
 
                        00152-01 97 07-1
 
 
 
         Обработка запроса  ввода/вывода
 
   ********************          **************
   * Пользовательский *          * Устройство *
   * процесс          *          * генерирует *
   * запрашивает в/в  *          * прерывание *
   ********************          **************
            I                           I
            I                           I
   *********************       *********************
   * Программа         *       * Драйверная прог-  *
   * обслуживания QIO  *       * рамма обслуживания*
   * проверяет  запрос *       * прерываний        *
   *********************       * восстанавливает   *
            I                  * состояние драйвера*
            I                  *********************
            I                           I
            I                           I
   **********************         *************
   * Драйверная функция *         * Драйвер   *
   * чтения проверяет   *         * собирает  *
   * запрос             *         * состояние *
   **********************         *************
            I                           I
            I                           I
     ****************            ****************
     * Операционная *            * Операционная *
     * система      *            * система      *
     * вызывает     *            * копирует     *
     * драйвер      *            * данные и     *
     ****************            * состояние    *
            I                    ****************
            I                           I
            I                           I
     **************              ****************
     * Драйвер    *              * Процесс      *
     * запускает  *              * пользователя *
     * устройство *              * считывает    *
     * и ожидает  *              * данные и     *
     * прерывания *              * состояние    *
     **************              ****************
            I
            I
     *************************
     * Операционная система  *
     * сохраняет состояние   *
     * драйвера              *
     *************************
 
                              
                           Рис.2
 
 
                            - 43 -
 
                        00152-01 97 07-1
 
 
        Обработка запроса ввода/вывода выполняется в следующей
 
   последовательности:
 
 
        1) процесс запрашивает операцию ввода/вывода.  Пользо-
 
   вательский процесс запрашивает данные с устройства одним из
 
   двух способов:
 
 
        - система  управления  данными  (СУД)  получает  вызов
 
   соответствующей функции (в результате вызывается  системная
 
   программа  обслуживания   очереди   запросов   ввода-вывода
 
   (QIO));
 
 
        - с помощью системной программы  обслуживания  очереди
 
   запросов ввода/вывода (QIO).
 
 
        Пользовательский процесс указывает устройство назначе-
 
   ния, код функции чтения и адрес буфера,  в  который  должны
 
   быть считаны данные;
 
 
        2)  операционная   система   выполняет   предобработку
 
   ввода/вывода. Системная программа обслуживания очереди зап-
 
   росов ввода/вывода (QIO) проверяет запрос  и  находит  блок
 
   управления базой  данных  ввода/вывода,  который  описывает
 
   устройство и его драйвер. Системная программа также  назна-
 
   чает и инициализирует пакет запроса  ввода/вывода,  который
 
   содержит описание  запроса  ввода/вывода,  затем  системная
 
   программа вызывает программу чтения драйвера;
 
 
        3) драйвер выполняет предобработку ввода/вывода. Прог-
 
   рамма таблицы выбора функций драйвера (FDT) проверяет  рас-
 
   пологается ли буфер пользователя  в  страницах  виртуальной
 
   памяти, которые  могут  быть  модифицированы  запрашивающим
 
   процессором, блокирует (LOCK) буферные страницы в памяти  и
 
 
                            - 44 -
 
                        00152-01 97 07-1
 
 
   добавляет детали  операции  ввода/вывода  в  пакет  запроса
 
   ввода/вывода. Программа FDT, выполняющая  чтение,  вызывает
 
   затем операционную систему, чтобы отправить  пакет  запроса
 
   ввода/вывода к драйверу;
 
 
        4) МОС ВП создает форк-процесс драйвера. Программа мос
 
   вп создает форк-процесс, в котором может выполняться  драй-
 
   вер устройства. Программа активизирует форк-процесс драйве-
 
   ра, передавая управление стартовой  программе  ввода/вывода
 
   драйвера;
 
 
        5) драйвер  подготавливает  адаптер  общей  шины.  Для
 
   передачи по прямому доступу к памяти форк-процесс  драйвера
 
   вызывает программы МОС ВП,  которые  управляют  аппаратурой
 
   адаптера общей шины, для отображения адресов общей  шины  в
 
   физические адреса при выполнении пересылки данных;
 
 
        6) драйвер активизирует устройство. Форк-процесс акти-
 
   визирует устройство посредством установки битов в регистрах
 
   устройства;
 
 
        7) драйвер ожидает прерывания. Программа МОС ВП сохра-
 
   няет контекст драйверного форк-процесса и освобождает  про-
 
   цессор до появления прерывания;
 
 
        8) устройство запрашивает прерывание. Когда  пересылка
 
   данных завершается, устройство запрашивает аппаратное  пре-
 
   рывание, которое вызывает передачу управления из системы  в
 
   программу обслуживания прерываний драйвера;
 
 
        9) драйвер обслуживает прерывание. Драйверная програм-
 
   ма обслуживания прерываний обрабатывает прерывание и возоб-
 
   новляет драйвер, который считывает регистры устройства  для
 
 
                            - 45 -
 
                        00152-01 97 07-1
 
 
   получения информации  состояния,  относительно  выполненной
 
   передачи данных;
 
 
        10) операционная система помещает  драйвер  в  очередь
 
   форк-процессов. Драйвер требует, чтобы процесс  был  возоб-
 
   новлен на более низком уровне приоритета программного  пре-
 
   рывания;
 
 
        11) форк-диспетчер возобновляет форк-процесс драйвера.
 
   Когда позволяет приоритет процессора, форк-диспетчер МОС ВП
 
   возобновляет драйвер как форк-процесс;
 
 
        12) драйвер завершает операцию ввода/вывода.  Драйвер-
 
   ный форк-процесс завершает зависящую от устройства обработ-
 
   ку запроса ввода/вывода и возвращает информацию о состоянии
 
   ввода/вывода в МОС ВП;
 
 
        13) МОС ВП завершает операцию ввода/вывода.  Программы
 
   МОС ВП для постобработки  ввода/вывода  копируют  состояние
 
   ввода/вывода в адресное пространство процесса и (или)  уни-
 
   версальные регистры и передают управление процессу  пользо-
 
   вателя.
 
 
        Из всех шагов обработки только четыре описывают  драй-
 
   верную    предобработку    ввода/вывода    и     драйверную
 
   форк-обработку.  Программы  ввода/вывода  системы  МОС   ВП
 
   выполняют всю обработку ввода/вывода, общую для многих зап-
 
   росов. Написание самих программ драйвера  устройства  упро-
 
   щается возможностью использования программ МОС ВП,  которые
 
   выполняют не зависящие от устройства функции.
 
 
        Рассмотренный пример несколько упрощенно трактует опе-
 
   рации обработки ввода/вывода, игнорируя такие вопросы, как:
 
 
                            - 46 -
 
                        00152-01 97 07-1
 
 
        - связь устройства с процессом, которая заключается  в
 
   назначении устройства;
 
 
        - одновременные запросы на ввод/вывод  к  одному  уст-
 
   ройству;
 
 
        - уровни приоритетов аппаратных прерываний;
 
 
        - конкуренция драйвера за разделяемые ресурсы  системы
 
   и адаптера общей шины;
 
 
        - конкуренция драйвера за групповой контроллер;
 
 
        - восстановление драйвера после  ошибок  устройства  и
 
   нарушения питания.
 
 
 
        1.11. Общая шина
 
 
 
        В СМ1700 центральный процессор соединяется  с  памятью
 
   при помощи генмонтажного соединения на задней  панели.  Это
 
   соединение связывает также адаптер общей шины с памятью и с
 
   процессором. Присоединение периферийных устройств  к  общей
 
   шине показано на рис.3, а описание самих устройств приведе-
 
   но в документе [6].
 
 
        Для активизации передач по общей шине с использованием
 
   прямого доступа к памяти, драйвер должен  сначала  получить
 
   регистры отображения (MAPPING) и, дополнительно,  буферизо-
 
   ванный путь данных.  Драйвер  вызывает  программы  МОС  ВП,
 
   которые устанавливают связь  с  адаптером  общей  шины  для
 
   получения этих ресурсов от имени драйвера.
 
 
        При прямом прохождении данных каждая передача по общей
 
 
 
                            - 47 -
 
                        00152-01 97 07-1
 
 
   шине отображается передачей  по  генмонтажному  соединению.
 
   Для каждой передачи по общей шине выполняется одна пересыл-
 
   ка по генмонтажному соединению. За каждую операцию на  ген-
 
   монтажном соединении передается одно слово или байт  данных
 
   в зависимости от устройства. Напротив, буферизованный  путь
 
   данных позволяет об'единить несколько  пересылок  по  общей
 
   шине в одну пересылку по генмонтажному соединению.
 
 
        Драйверы, выполняющие операции, отличные  от  передачи
 
   по прямому доступу, в  большинстве  случаев  не  связаны  с
 
   работой адаптера общей шины.
 
 
 
                            - 48 -
 
                        00152-01 97 07-1
 
 
                 Аппаратная конфигурация СМ1700
 
 
 
 
 
 
                       .                       .
                      / \                     / \
                     /   \                   /   \
                    /_   _\                 /_   _\
                     I   I                   I   I
                     I   I                   I   I
   --------------    I О I                   I Г I
   I Устройство I----I б I                   I е I
   --------------    I щ I                   I н I
                     I а I                   I м I
   --------------    I я I    -----------    I о I
   I Устройство I----I   I----I Адаптер I----I н I
   -------------     I Ш I    -----------    I т I  ----------
                     I и I                   I а I--I  CPU   I
   --------------    I н I                   I ж I  ----------
   I Устройство I----I а I                   I н I
   --------------    I   I                   I о I  ----------
                    \-   -/                  I е I  I Память I
                     \   /                   I   I  ----------
                      \ /                    I   I
                       .                     I   I
                                             I   I
                                             I   I
                                             I с I  ----------
                                             I о I--I Память I
                                             I е I  ----------
                                             I д I
                                             I и I
                                             I н I
                                             I е I
                                             I н I
                                             I и I
                                             I е I
                                             I   I
                                             I   I
                                             I   I
                                            \-   -/
                                             \   /
                                              \ /
                                               .
 
                              Рис.3
 
 
 
 
 
 
                            - 49 -
 
                        00152-01 97 07-1
 
 
        Вместо  написания  полного  драйвера  для  устройства,
 
   которое не выполняет передач по прямому доступу  к  памяти,
 
   разрешается соединить процесс с  вектором  прерывания  уст-
 
   ройства, чтобы программировать устройство прямо из  пользо-
 
   вательского процесса [2]. Как и когда присоединяться к век-
 
   тору прерываний, обратитесь за консультацией к  руководству
 
   пользователя по работе в реальном масштабе  времени  в  МОС
 
   ВП.
 
 
 
        1.12. Программируемый ввод/вывод и ввод/вывод
 
              с прямым доступом к памяти
 
 
 
        Устройства передают данные, используя один из  следую-
 
   щих способов:
 
 
        - программируемый ввод/вывод;
 
 
        - пересылки по прямому доступу к памяти (ПДП).
 
 
        Устройства,    которые    выполняют    программируемый
 
   ввод/вывод, передают данные в виде одиночных слов или  бай-
 
   тов, используя регистры устройства. После завершения каждой
 
   пересылки устройство оповещает центральный процессор.
 
 
        Устройства, выполняющие передачи по  прямому  доступу,
 
   не требуют внимания центрального  процессора  столь  часто.
 
   После того, как драйвер активизировал устройство, устройст-
 
   во способно передавать большое количество данных, не запра-
 
   шивая прерывания после пересылки небольшого об'ема  данных.
 
   Для выполнения передачи  устройством  прямого  доступа  его
 
   драйвер закрепляет  за  собой  буферизованный  путь  данных
 
   общей шины и регистры отображения общей шины для выполнения
 
 
                            - 50 -
 
                        00152-01 97 07-1
 
 
   операций передачи данных.
 
 
 
        1.13. Буферизированный  ввод/вывод  и  прямой
 
              ввод/вывод
 
 
 
        Драйверы выполняют передачи по вводу/выводу, используя
 
   один из двух методов:
 
 
        1) буферизованный ввод/вывод;
 
 
        2) прямой ввод/вывод.
 
 
        Первый метод позволяет буферизовать  данные  в  прост-
 
   ранстве системных адресов. После завершения передачи данные
 
   пересылаются в буфер  пользовательского  процесса.  Драйвер
 
   может обращаться к буферу в системном пространстве, исполь-
 
   зуя системные виртуальные адреса. Зачастую, драйвер исполь-
 
   зует  буферизованный  ввод/вывод  для  устройств,   которые
 
   выполняют программируеммый ввод/вывод, например,  для  уст-
 
   ройства построчной печати и считывателя перфокарт.
 
 
        Прямой ввод/вывод позволяет  поместить  данные  непос-
 
   редственно в буфер пользовательского процесса. Драйвер дол-
 
   жен заблокировать (LOCK) страницы, содержащие буфер в физи-
 
   ческой памяти и обращаться ним, используя номера страничных
 
   кадров (PAGE FRAME NUMBER - PFN). Обычно,  драйвер  исполь-
 
   зует прямой ввод/вывод и  буферизованный  путь  данных  для
 
   устройств, выполняющих передачи с прямым достуом к памяти.
 
 
        Критерием  выбора  между  буферизированным  и   прямым
 
   вводом/выводом является время,  требуемое  для  перемещения
 
   данных в буфер пользователя по сравнению со временем,  тре-
 
 
                            - 51 -
 
                        00152-01 97 07-1
 
 
   буемым для  блокировки  страниц  в  памяти.  Дополнительная
 
   информация приводится в разделе 8.
 
 
 
        1.14. Загружаемые драйверы
 
 
 
        Операционная система МОС ВП  предоставляет  процедуру,
 
   которая позволяет достаточно привилегированному пользовате-
 
   лю загружать драйверы в систему МОС ВП, находящуюся в рабо-
 
   те. Программа генерации системы SYSGEN (см.[1]),  поддержи-
 
   вает команды, которые вызывают процедуры загрузки драйвера:
 
 
        - команда LOAD загружает драйвер в систему;
 
 
        - команда CONNECT создает базу данных ввода/вывода для
 
   дополнительных устройств того же типа;
 
 
        - команда RELOAD загружает ранее загруженный драйвер.
 
 
        Процедура  загрузки  драйвера  использует  информацию,
 
   предоставляемую в команде LOAD, а также информацию,  содер-
 
   жащуюся в таблицах драйвера, чтобы выполнить загрузку драй-
 
   вера в виртуальную память и  создать  соответствующую  базу
 
   данных. Прологовая таблица драйвера,  которая  должна  быть
 
   первым сгенерированным кодом в драйверном модуле,  содержит
 
   информацию, в которой нуждается процедура загрузки. В част-
 
   ности, прологовая таблица драйвера содержит следующее:
 
 
        - адрес конца драйвера; загрузочная процедура  исполь-
 
   зует его для определения размера драйвера;
 
 
        - флажки загрузчика драйвера, которые указывают,  нуж-
 
   дается ли устройство в записях таблицы системных страниц  и
 
   может ли драйвер перезагружаться;
 
 
                            - 52 -
 
                        00152-01 97 07-1
 
 
        - размер UCB;
 
 
        - адрес вызываемой программы, если драйвер  перезагру-
 
   жается;
 
 
        - имя модуля драйвера устройства.
 
 
        Прологовая таблица драйвера сопровождается двумя спис-
 
   ками полей, которые требуют инициализации:
 
 
        - поля базы данных ввода/вывода, которые  должны  ини-
 
   циализироватся при первой загрузке драйвера;
 
 
        - поля, которые должны  быть  инициализированы  каждый
 
   раз при перезагрузке драйвера, независимо от того, перезаг-
 
   ружалась ли система.
 
 
        С помощью информации, предоставляемой прологовой  таб-
 
   лицей драйвера и двумя списками полей,  процедура  загрузки
 
   драйвера может как загрузить, так и перезагрузить драйверы,
 
   а также выполнить инициализацию базы  данных  ввода/вывода,
 
   соответствующую любой из двух ситуаций.
 
 
 
 
 
 

 
 
 
                            - 53 -
 
                        00152-01 97 07-1
 
 
          2. ОБСУЖДЕНИЕ ОЧЕРЕДИ ЗАПРОСОВ ВВОДА/ВЫВОДА
 
 
 
 
        В этом разделе описывается как обрабатывается  очередь
 
   запросов ввода/вывода. Для примера выбрано устройство пост-
 
   рочной печати.
 
 
        Процесс пользователя может запросить  выполнения  сле-
 
   дующих функций для построчной печати:
 
 
        - вывести данные на устройство построчной печати;
 
 
        - прочитать характеристики устройства построчной печа-
 
   ти;
 
 
        - изменить характеристики устройства построчной  печа-
 
   ти.
 
 
        Данный раздел рассматривает следующие аспекты обработ-
 
   ки ввода/вывода на печатающее устройство:
 
 
        - те части драйвера устройства построчной печати в МОС
 
   ВП, которые используются при обслуживании запроса записи;
 
 
        - компоненты МОС ВП, с которыми взаимодействует  драй-
 
   вер при обработке запроса записи.
 
 
        Устройство построчной печати было выбрано для обсужде-
 
   ния вследствие того, что его драйвер прост,  но,  вместе  с
 
   тем, иллюстрирует многие принципы драйверов.
 
 
        Рис.4 иллюстрирует последовательность выполнения прог-
 
   рамм МОС ВП и драйвера построчной печати при удовлетворении
 
   рассматриваемого запроса.
 
 
 
 
                            - 54 -
 
                        00152-01 97 07-1
 
 
                Функция записи построчной печати
 
   ********************
   * Проверка         *
   * правильности     *
   * QIO              *
   ********************
            I
            I
    ******************
    ******************                  ****************
    ** Подпрограмма **                  * AST в режиме *
    ** FDT          **                  * ядра         *
    ******************                  ****************
    ******************                         I
            I                                 / \
            I                                  I Контекст
            I                                  I пользователя
   ---------I----------------------------------I--------------
            I                                  I  Системный
            I                                  I  контекст
    ******************                         I
    * Представление  *                         I
    * IRP драйверу   *                         I
    ******************                         I
            I                                  I
            I                                  I
   ****************                            I
   ****************   *****************   *****************
   ** Драйвер    **   * Очередь IRP к *   * Постобработка *
   ** пишет на   **---* процессору    *---* ввода/вывода  *
   ** устройство **   *****************   *****************
   ****************            I
   ****************           / \
            I                  I
            I                  I
   ***************     ***************      **************
   * Устройство  *     ***************      * Устройство *
   * переходит в *     ** Драйвер   **      * формирует  *
   * состояние   *     ** передает  **      * прерывание *
   * занятости   *     ** состояние **      **************
   ***************     ***************            I
            I          ***************            I
            I                  I                  I
            I                 / \                 I
            I                  I                  I
      *************     ****************    ******************
     * Приостанов  *    ****************    * Система выпол- *
    *  выполнения   *   ** Обработка  **<---* няет функцию   *
     * драйвера    *    ** прерывания **    * диспетчеризации*
      *************     ****************    * прерывания     *
                        ****************   *******************
 
                              Рис.4
 
 
                            - 55 -
 
                        00152-01 97 07-1
 
 
        Двойными рамками на рис.4 отмечена  обработка,  выпол-
 
   няющаяся подпрограммами  драйвера.  Выше  пунктирной  линии
 
   показана обработка в контексте пользовательского  процесса.
 
   Ниже пунктирной линии показана обработка,  выполняющаяся  в
 
   контексте форк-процесса или в контексте прерывания.
 
 
 
        2.1. Программы   драйвера   для   реализации
 
             функции  записи  устройства  построчной
 
             печати
 
 
 
        Драйвер печатающего устройства реализует функцию запи-
 
   си, используя следующие части драйвера:
 
 
        - программу  FDT,  которая  переформатирует   заданные
 
   пользователем данные;
 
 
        - стартовую программу  ввода/вывода,  которая  заносит
 
   данные в буфер печати устройства, до тех пор пока устройст-
 
   во не перейдет в состояние занятости для вывода  на  печать
 
   содержимого буфера;
 
 
        - программу, которая изменяет содержимое регистра уст-
 
   ройства для разрешения прерывания от печатающего  устройст-
 
   ва;
 
 
        - программу обслуживания прерываний, которая  передает
 
   управление форк-процессу драйвера после аппаратного  преры-
 
   вания от печатающего устройства;
 
 
        - программу, которая передает состояние ввода/вывода в
 
   программу завершения ввода/вывода (МОС ВП).
 
 
 
 
 
                            - 56 -
 
                        00152-01 97 07-1
 
 
        2.2. Запросы         ввода/вывода         из
 
             пользовательского процесса
 
 
 
        Пользовательский процесс выводит строку на  печатающее
 
   устройство, вызывая системную программу обслуживания очере-
 
   ди запросов ввода/вывода и указывая в  вызове  код  функции
 
   записи виртуального блока следующим образом:
 
 
      $QIO_S       CHAN = CHANNEL_NUMBER,-  ,(номер канала)
 
                   FUNC = #IO$_WRITEVBLK,-
 
                   EFN  = #6,-
 
                   IOSB = STATUS_BLOCK,-    ,(блок состояния)
 
                   P1 = BUFFER_ADDRESS,-     ,(адрес буфера)
 
                   P2 = #BUFFER_SIZE,-     ,(размер буфера)
 
                   P4 = #^X30
 
   параметры P1, P2 и P4 являются параметрами,
 
   зависящими от устройства.
 
 
 
        2.3. Предобработка  ввода/вывода  с  помощью
 
             МОС ВП
 
 
 
        Системная  программа  обслуживания   очереди   запроса
 
   ввода/вывода   (QIO)   сначала   убеждается,   что   запрос
 
   ввода/вывода  составлен   корректно;   т.е.,   что   запрос
 
   ввода/вывода удовлетворяет следующим критериям:
 
 
        - ячейка номера канала (CHANNEL_NUMBER) должна  содер-
 
   жать номер канала, который используется в качестве  индекса
 
   списка каналов ввода/вывода процесса. Процесс должен  пред-
 
   варительно назначить печатающее устройство для этого канала
 
   процесса, используя системную обслуживающую программу  наз-
 
 
                            - 57 -
 
                        00152-01 97 07-1
 
 
   начения канала ввода/вывода. Во время проверки номера кана-
 
   ла  системная  программа  обслуживания   очереди   запросов
 
   ввода/вывода получает адрес таблицы выбора функций драйвера
 
   (FDT). Рис. 5 иллюстрирует цепочку указателей от индексного
 
   номера канала до адреса FDT. В  результате  просмотра  базы
 
   данных ввода/вывода по такой цепочке,  системная  программа
 
   обслуживания  очереди  запросов  ввода/вывода   определяет,
 
   какое устройство является целевым для запроса ввода/вывода;
 
 
        - FDT драйвера печатающего устройства должна содержать
 
   функцию IO$_WRITEVBLK в  качестве  правильной  функции  для
 
   данного устройства;
 
 
        - номер флажка события должен быть правильным;
 
 
        - квота запроса процесса на буферизованный  ввод/вывод
 
   должна позволить системной программе  обслуживания  запроса
 
   очереди ввода/вывода выполнить запрос буфера без превышения
 
   квот процесса;
 
 
        - процесс  должен  обладать  возможностью  доступа  по
 
   записи к ячейкам, определенным пользователем для  использо-
 
   вания в качестве блока состояния ввода/вывода.
 
 
 
 
                            - 58 -
 
                        00152-01 97 07-1
 
 
                Нахождение таблицы выбора функций
 
 
   **************
   *            *
   *   Блок     *   **************
   * управления *---*            *
   *  каналом   *   *   Блок     *   ***********
   *  (CCB)     *   * управления *---*         *
   **************   * устройством*   * Драйвер**   ***********
                    *  (UCB)     *   * ная     *---*         *
                    **************   * диспет- *   * Таблица *
                                     * черская *   * выбора  *
                                     * таблица *   * функций *
                                     *  (DDT)  *   *  (FDT)  *
                                     *         *   *         *
                                     ***********   ***********
 
                              Рис.5
 
 
 
 
        Если все эти проверки удовлетворяются, системная прог-
 
   рамма обслуживания очереди  запросов  ввода/вывода  создает
 
   пакет запроса  ввода/вывода  в  бесстраничном  пространстве
 
   системных адресов и записывает все известные детали о  зап-
 
   росе ввода/вывода в пакет запроса.
 
 
        Если    целевое    устройство,    запрашиваемое    для
 
   ввода/вывода, не имеет файловой структуры, системная  прог-
 
   рамма обслуживания очереди запросов  ввода/вывода  заменяет
 
   всякий виртуальный код функции его логическим  эквивалентом
 
   при формировании пакета запроса. Таким  образом,  для  уст-
 
   ройства построчной  печати  IO$_WRITEVBLK  транслируется  в
 
   IO$_WRITELBLK.
 
 
 
        2.4. Предобработка ввода/вывода драйвером
 
 
 
        После проверки запроса ввода/вывода системная програм-
 
   ма обслуживания  очереди  запросов  ввода/вывода  сканирует
 
   таблицу выбора функций в поисках записи, которая  связывает
 
 
                            - 59 -
 
                        00152-01 97 07-1
 
 
   код функции IO$_WRITELBLK с программой FDT. Системная прог-
 
   рамма обслуживания вызывает  программу,  которая  в  случае
 
   драйвера печатающего устройства, является программой,  спе-
 
   цифической для устройства и размещающейся в  драйвере  уст-
 
   ройства построчной печати.
 
 
        Программа FDT подтверждает, что запрашиваемый  процесс
 
   имеет доступ по чтению к  буферу,  начинающемуся  с  адреса
 
   BUFFER_ADDRESS. После этого программа FDT буферизирует дан-
 
   ные из адресного пространства процесса  в  адресное  прост-
 
   ранство системы в следующем порядке:
 
 
        - вычисляет длину требуемого буфера в системном прост-
 
   ранстве;
 
 
        - если квота счетчика байтов процесса для  буферизиро-
 
   ванного ввода/вывода (BYTCNT) позволяет, программа выделяет
 
   буфер в адресном  пространстве  системы,  запоминает  адрес
 
   буфера в пакете запроса ввода/вывода  и  уменьшает  текущую
 
   квоту счетчика байтов для данного процесса;
 
 
        - программа выполняет действие по синхронизации с воз-
 
   можными другими подпроцессами для чтения и записи полей UCB
 
   печатающего устройства. (например, если  процесс  присоеди-
 
   няет устройство печати, то  появляется  возможность  парал-
 
   лельной выдачи на устройство запросов записи как со стороны
 
   процесса, так и любого из его подпроцессов);
 
 
        - программа считывает описание текущей позиции  строки
 
   и страницы из UCB устройства;
 
 
        - программа переформатирует данные  при  пересылке  из
 
   буфера процесса в буфер системы,  добавляя  перед  и  после
 
 
                            - 60 -
 
                        00152-01 97 07-1
 
 
   данных символы управления кареткой в соответствии с  указа-
 
   нием в аргументе P4  запроса  ввода/вывода.  Форматирование
 
   включает такие функции, как замещение горизонтальной  табу-
 
   ляции множеством  пробелов  и  замещение  символов  нижнего
 
   регистра символами верхнего, если это необходимо;
 
 
        - программа перезаписывает скорректированные  значения
 
   позиций строки и страницы в UCB устройства. Эта  информация
 
   указывает, текущую позицию на  печатающейся  странице,  там
 
   где завершится вывод;
 
 
        - программа  передает  управление  программе  МОС  ВП,
 
   которая помещает пакет запроса  ввода/вывода  в  очередь  к
 
   драйверу устройства.
 
 
        Вся рассмотренная обработка ввода/вывода выполняется в
 
   контексте пользовательского процесса. Адресное пространство
 
   процесса отображается, а уровень приоритета прерывания про-
 
   цессора все еще достаточно низок, чтобы позволить  планиро-
 
   вание процесса и страничную обработку. Последующая установ-
 
   ка запроса пересылок данных в  очередь  к  драйверу  и  вся
 
   завершающая обработка выполняющаяся  драйвером,  происходит
 
   на более высоком уровне приоритета прерывания, что  синхро-
 
   низирует драйверную обработку устройства, как это  рассмот-
 
   рено в разделе 3.
 
 
 
        2.5. Помещение пакета в очередь ввода/вывода
 
             к драйверу
 
 
 
        Прежде чем поместить пакет запроса ввода/вывода в оче-
 
   редь надлежащего драйвера, программа работы с  очередями  в
 
 
 
                            - 61 -
 
                        00152-01 97 07-1
 
 
   МОС ВП повышает уровень  приоритета  прерывания  до  уровня
 
   форк-процесса драйвера  (UCB$B_FIPL),  хранящегося  в  UCB.
 
   Повышение IPL до форк-уровня синхронизирует доступ драйвера
 
   к UCB.
 
 
        Если устройство свободно, т. е.,  если  бит  занятости
 
   (UCB$V_BSY) в слове состояния ввода/вывода блока UCB  сбро-
 
   шен, МОС ВП может передать управление драйверу. Диспетчерс-
 
   кая таблица драйвера содержит точку входа в программу нача-
 
   ла ввода/вывода. Для обнаружения этой точки входа, програм-
 
   ма очереди проходит по цепочке базы данных ввода/вывода  до
 
   диспетчерской таблицы драйвера в последовательности:
 
 
        UCB-->  DDT-->  точка   входа   в   программу   старта
 
   ввода/вывода.
 
 
 
        2.6. Активизация драйвера устройства
 
 
 
        Контроллер печатаючего устройства принимает  данные  и
 
   помещает их в буфер данных устройства, пока буфер печати не
 
   будет заполнен или драйвер пришлет символ управления карет-
 
   кой. Когда произойдет одно из этих событий, печатающее уст-
 
   ройство устанавливает бит занятости в регистре управления и
 
   состояния устройства. Затем драйвер  устройства  устанавли-
 
   вает в регистре управления и состояния устройства бит  раз-
 
   решения прерывания и ожидает прерывания от устройства печа-
 
   ти. Когда печатающее устройство запрашивает аппаратное пре-
 
   рывание, драйвер может  возобновить  помещение  символов  в
 
   буфер печати.
 
 
        Программа драйвера  печатающего  устройства  выполняет
 
 
 
                            - 62 -
 
                        00152-01 97 07-1
 
 
   запись в буфер данных устройства в такой  последовательнос-
 
   ти:
 
 
        I) драйвер находит  регистры  печатающего  устройства,
 
   используя цепочку указателей, начинающуюся в UCB  устройст-
 
   ва:
 
 
        UCB--> CRB--> IDB--> адрес CSR.
 
 
        Адрес CSR (регистра  управления  и  состояния)  всегда
 
   является адресом регистра управления и состояния печатающе-
 
   го устройства, а все остальные  регистры  устройства  имеют
 
   фиксированное смещение относительно этого адреса. В отличие
 
   от многих других устройств,  таких  как  диски,  печатающее
 
   устройство не разделяет контроллер с другими  устройствами;
 
   поэтому не требуется арбитража для овладения контроллером;
 
 
        2) драйвер проверяет регистр  управления  и  состояния
 
   устройства, чтобы определить, готово ли устройство  принять
 
   символ;
 
 
        3) если устройство  готово,  драйвер  записывает  байт
 
   данных в буфер данных построчной печати и уменьшает счетчик
 
   байтов, которые еще нужно передать. После этого  он  повто-
 
   ряет шаг 2;
 
 
        4) если устройство не готово,  т.е.,  если  внутренний
 
   буфер устройства полон, драйвер повышает приоритет (IPL) до
 
   31,  чтобы  заблокировать  все  прерывания,  и  помещает  в
 
   регистр управления и состояния бит разрешения прерывания.
 
 
        После разрешения прерываний драйвер вызывает  макроко-
 
   манду ожиданий прерывания, для приостановки обработки драй-
 
 
 
                            - 63 -
 
                        00152-01 97 07-1
 
 
   вера до тех пор, пока  печатающее  устройство  не  запросит
 
   прерывание или до тайм-аута устройства.
 
 
 
        2.7. Ожидание прерывания устройства
 
 
 
        Программа прерываний  приостанавливает  драйвер  путем
 
   выполнения следующих функций:
 
 
        - сохранение контекста драйвера (R3, R4 и  адрес  сле-
 
   дующей инструкции драйвера) в UCB;
 
 
        - вычисление времени, после которого устройство перей-
 
   дет в состояние таймаута;
 
 
        - установка битов в UCB устройства для индикации того,
 
   что драйвер ожидает прерывания  от  устройства  в  пределах
 
   указанного периода времени.
 
 
        МОС ВП понижает IPL до уровня форк-процесса драйвера и
 
   передает  управление  программе  вызова  программы   старта
 
   ввода/вывода.
 
 
        Драйвер остается в приостановленном состоянии  до  тех
 
   пор, пока не появится одно из двух событий:
 
 
        - печатающее устройство запрашивает аппаратное  преры-
 
   вание;
 
 
        - МОС ВП выдает сообщение о тайм-ауте устройства, пос-
 
   кольку печатающее устройство не запросило аппаратного  пре-
 
   рывания в пределах указанного периода времени.

 
 
                            - 64 -
 
                        00152-01 97 07-1
 
 
        2.8. Обработка прерываний
 
 
 
        Когда  печатающее  устройство  запрашивает  аппаратное
 
   прерывание, диспетчер прерываний передает управление  драй-
 
   верной программе обслуживания прерываний.
 
 
        Драйверная программа обслуживания  прерывания  возвра-
 
   щает управление драйверу в следующем порядке:
 
 
        - заносит адрес UCB в R5;
 
 
        - путем проверки битов в  UCB  устройства  убеждается,
 
   что прерывание ожидалось;
 
 
        - восстанавливает сохраненные регистры (R3  и  R4)  из
 
   UCB устройства;
 
 
        - передает управление драйверной программе  по  адресу
 
   PC в UCB устройства.
 
 
        Реактивизированная программа драйвера  вызывает  прог-
 
   рамму МОС ВП  для  форк-процесса  драйвера.  МОС  ВП  снова
 
   приостанавливает  обработку  драйвера,  выполняя  следующие
 
   действия:
 
 
        - сохраняет контекст драйвера (R3, R4 и адрес PC драй-
 
   вера) в UCB устройства;
 
 
        - помещает адрес UCB в соответствующую форк-очередь.
 
 
        Приостанов  драйвера  позволяет  операционной  системе
 
   перепланировать обработку драйвера  на  более  низком  IPL.
 
   Диспетчер форк-процессов МОС ВП реактивизирует драйвер ког-
 
   да IPL понизится до форк-уровня.
 
 
                            - 65 -
 
                        00152-01 97 07-1
 
 
        После создания форк-процесса система возвращает управ-
 
   ление драйверной программе обслуживания прерываний, которая
 
   выполняет следующие действия:
 
 
        - восстанавливает регистры, сохраненные во время  пре-
 
   рывания устройства;
 
 
        - прекращает обработку.
 
 
 
        2.9. Завершение    обработки    ввода/вывода
 
             драйвером
 
 
 
        Когда диспетчер форк-процессов МОС  ВП  реактивизирует
 
   форк-процесс драйвера, программа продолжает передачу симво-
 
   лов в буфер данных  печатающего  устройства  пока  передача
 
   данных не завершится. Программа драйвера выполняет  следую-
 
   щие шаги для передачи символов:
 
 
        - из UCB определяет  число  символов,  оставшихся  для
 
   передачи;
 
 
        - пересылает символы до тех пор,  пока  устройство  не
 
   начнет новой распечатки своего буфера данных  или  пока  не
 
   будут переданы все символы;
 
 
        - когда будут переданы все символы, программа драйвера
 
   выполнит переход на программу завершения ввода/вывода.
 
 
        Затем программа драйвера для  завершения  ввода/вывода
 
   запоминает в R0 следующую информацию:
 
 
        - код состояния успешного завершения;
 
 
                            - 66 -
 
                        00152-01 97 07-1
 
 
        - число переданных байтов.
 
 
        Программа драйвера  передает  управление  МОС  ВП  для
 
   завершения обработки запроса ввода/вывода.
 
 
 
        2.10. Завершение    обработки    ввода/вывода
 
              системой
 
 
 
        Операционная   система    помещает    пакет    запроса
 
   ввода/вывода в очередь постобработки.  Если  другие  пакеты
 
   запросов ввода/вывода ожидают очереди к данному устройству,
 
   то МОС ВП выбирает этот пакет из очереди и  вызывает  драй-
 
   верную программу старта ввода/вывода для его обработки.
 
 
        Когда IPL понижается до уровня, достаточного для  пос-
 
   тобработки (IPL$_IOPOST),  процессор  удовлетворяет  запрос
 
   прерывания  на   постобработку.   Диспетчер   постобработки
 
   ввода/вывода извлекает пакет запроса ввода/вывода для печа-
 
   тающего устройства и выполняет следующие шаги:
 
 
        - увеличивает счетчик выполненных запросов процесса на
 
   буферизованный  ввод/вывод,  поскольку   текущая   операция
 
   завершается. Этот счетчик поддерживается в учетных целях;
 
 
        - освобождает  системный  буфер,  использованный   для
 
   переформатированных данных пользователя;
 
 
        - увеличивает текущее значение квоты  счетчика  байтов
 
   данного процесса.
 
 
        - устанавливает флажок события для указания того,  что
 
   операция ввода/вывода завершена;
 
 
 
 
                            - 67 -
 
                        00152-01 97 07-1
 
 
        - помещает в очередь программу AST режима ядра,  кото-
 
   рая ликвидирует пакет запроса ввода/вывода и сохранит  сос-
 
   тояние  ввода/вывода  в  пользовательском  блоке  состояния
 
   ввода/вывода.
 
 
        Пользовательский процесс проверяет  флаг  события  или
 
   вызывает системную обслуживающую программу  ожидания  флага
 
   одиночного  события  для  определения  того,  что  операция
 
   ввода/вывода завершилась.
 
 
 
 
        3. СИНХРОНИЗАЦИЯ ОБРАБОТКИ ЗАПРОСА ВВОДА/ВЫВОДА
 
 
 
 
        Операционная система МОС ВП использует  три  механизма
 
   для синхронизации обработки ввода/вывода:
 
 
        - уровни приоритетов аппаратных прерываний и программы
 
   обслуживания прерываний;
 
 
        - драйверные форк-процессы, форк-блоки и форк-очереди;
 
 
        - очереди ожидания ресурсов.
 
 
        При программировании драйвера  необходимо  просмотреть
 
   соглашения в МОС ВП, которые влияют на использование  уров-
 
   ней приоритетов прерываний и форк-процессов. Программы  мос
 
   вп, которые  предоставляют  ресурсы  драйверам,  заставляют
 
   использовать очереди ожидания ресурсов.
 
 
 
        3.1. Уровни приоритетов прерываний
 
 
 
        Процессор определяет 32 уровня аппаратных приоритетов,
 
 
 
                            - 68 -
 
                        00152-01 97 07-1
 
 
   называемых уровнями приоритетов  прерываний  (IPL).  IPL  0
 
   имеет самый низкий приоритет, а IPL  31  -  самый  высокий.
 
   Прерывания могут быть запрошены либо программными средства-
 
   ми (программные прерывания), либо  аппаратным  обеспечением
 
   (аппаратные прерывания). Система использует различные уров-
 
   ни приоритета прерываний следующим образом:
 
 
        - программа пользовательского  режима  выполняется  на
 
   IPL 0;
 
 
        - программы операционной системы и форк-процессы драй-
 
   веров запрашивают программные прерывания на уровнях от  IPL
 
   1 до IPL 15;
 
 
        - устройства генерируют аппаратные прерывания на уров-
 
   нях от IPL 16 до IPL 31.
 
 
        Процессор отвечает как на программные, так и на  аппа-
 
   ратные  прерывания  передачей  управления   соответствующей
 
   программе обслуживания прерывания.  Программа  обслуживания
 
   прерывания обрабатывает прерывание и при  окончании  работы
 
   прекращает обработку прерывания по инструкции REI.
 
 
 
        3.1.1. IPL, определяемые системой МОС ВП
 
 
 
        В табл. 1 приводится использование IPL  0-15,  опреде-
 
   ляемых системой МОС ВП.
 
 
 
 
                            - 69 -
 
                        00152-01 97 07-1
 
 
                                                     Таблица 1
                        Использование IPL
 
   -----------------------------------------------------------
       I               I
   IPL I Символическое I     Использование
       I    имя        I
   -----------------------------------------------------------
   0     --                Программы пользовательского режима.
   1     --                Зарезервирован.
   2     IPL$_ASTDEL       Программа  обслуживания  прерывания
                          по вводу в действие AST.
   3     IPL$_SCHED        Программа обслуживания   прерывания
                          планировщика.
   4     IPL$_IOPOST       Программа   обслуживания прерывания
                          постобработки.
   5     IPL$_XDELTA       Программа обслуживания   прерывания
                          XDELTA.
   6     IPL$-QUEUAST      Обработка на форк-уровне для  уста-
                          новки AST в очередь.
   8     IPL$_SYNCH        Доступ к базе данных системы и  об-
         IPL$_TIMER       Служивание  прерывания  программного
                          таймера.
   8-11  Нет               Форк-уровень для исполнения
                          драйвера.
 6;12-15 --                Зарезервированы.
 
 
 
        3.1.2. IPL, определенные для аппаратуры
 
 
 
        Уровни аппаратных прерываний используются для прерыва-
 
   ний устройств (IPL 20-23) и  для  исключительных  ситуаций,
 
   включая нарушения питания и  серьезные  ошибки,  такие  как
 
   машинный контроль. В документе [6] представляется  дополни-
 
   тельная информация об уровнях аппаратных прерываний.
 
 
 
        3.1.3. Программы обслуживания прерываний
 
 
 
        Операционная система МОС ВП использует программы  обс-
 
   луживания прерываний, которые получают управление на  расс-
 
   мотренных IPL. Такое  использование  IPL  гарантирует,  что
 
   прерывания  обрабатываются  в  соответствии  со  следующими
 
   приоритетами:
 
 
 
                            - 70 -
 
                        00152-01 97 07-1
 
 
        - прерывания от устройств (высший приоритет);
 
 
        - форк-процессы драйверов устройств;
 
 
        - постобработка ввода/вывода;
 
 
        - планирование процессов;
 
 
        - доставка AST (низший приоритет).
 
 
        Например,   МОС   ВП   завершает   обработку   запроса
 
   ввода/вывода, помещая пакет запроса в очередь постобработки
 
   ввода/вывода и запрашивая прерывания на уровне IPL  постоб-
 
   работки (IPL 4). Когда уровень приоритета  падает  ниже  4,
 
   процессор разрешает программное прерывание  путем  передачи
 
   управления     программе     обслуживания     постобработки
 
   ввода/вывода.
 
 
        Программы обслуживания прерываний работают в  контекс-
 
   те. Стеком является специальный стек,  используемый  только
 
   во время обработки прерываний - стек прерываний. Из  набора
 
   регистров обычно сохраняются только R0-R5. Программа обслу-
 
   живания прерываний должна восстановить эти регистры,  перед
 
   возвращением из прерывания.  Если  обслуживающая  программа
 
   использует какие-нибудь другие регистры, она должна  сохра-
 
   нить их содержимое перед использованием и  восстановить  их
 
   после. Использование регистров, отличающихся от  R0-R5,  не
 
   рекомендуется.
 
 
        При аппаратном прерывании система передает  управление
 
   драйверной программе обслуживания прерывания с  IPL,  уста-
 
   новленном на уровень прерывания устройства. Так  как  прог-
 
   рамма, выполняющаяся на IPL  20-23,  блокирует  большинство
 
 
                            - 71 -
 
                        00152-01 97 07-1
 
 
   других аппаратных прерываний и все программные  прерывания,
 
   программа драйвера понижает свой IPL так  быстро,  как  это
 
   возможно.
 
 
        Операционная      система      допускает      создание
 
   форк-процессов, так что драйвер может продолжать исполнение
 
   без   блокирования   прерываний   от   других    устройств.
 
   Форк-процессы обсуждаются в разделе 3.2.
 
 
 
        3.1.4. Повышение IPL
 
 
 
        Программа, работающая в режиме  ядра,  может  повысить
 
   свой IPL, чтобы заблокировать выполнение   контекста и пре-
 
   рывания. Программы МОС ВП, обслуживающие программные преры-
 
   вания, выполняют часть обработки на IPL,  превышающем  тот,
 
   на котором они получили управление.  Например,  планировщик
 
   является программой обслуживания прерывания, которая  полу-
 
   чает управление на IPL 3; повышает IPL до 7  для  чтения  и
 
   модификации  базы  данных  системы.  Драйверы  ввода/вывода
 
   повышают IPL для проверки нарушения питания, посылки  сооб-
 
   щения в почтовый ящик и для доступа к регистрам устройства.
 
   Программа драйвера не должна повышать IPL на период, превы-
 
   шающий выполнение нескольких инструкций, так как  при  этом
 
   блокируются все прерывания на более низких уровнях.
 
 
 
        3.1.5. Понижение IPL
 
 
 
        Программа обслуживания прерывания передает  управление
 
   главному потоку программы драйвера. В  этой  точке  драйвер
 
   выполняется в контексте программы обслуживания прерываний и
 
 
                            - 72 -
 
                        00152-01 97 07-1
 
 
   на IPL устройства.
 
 
        Драйвер понижает IPL до IPL  форк-процесса,  используя
 
   макрокоманду  IOFORK,  которая  создает  форк-процессы.   В
 
   результате вызова IOFORK МОС ВП выполняет следующие функции
 
   для драйвера:
 
 
        - запрашивает  UCB  устройства  для  определения   IPL
 
   форк-процесса драйвера;
 
 
        - создает драйверный форк-процесс  и  помещает  его  в
 
   очередь для выполнения на соответствующем IPL;
 
 
        - запрашивает программное прерывание на данном IPL.
 
 
        Когда поставленный  в  очередь  форк-процесс  драйвера
 
   активизируется,  он  выполняется  на   более   низком   IPL
 
   форк-процесса. В подразделе 3.2 более  детально  рассматри-
 
   вается диспетчеризация форк-процесса.
 
 
        Форк-процессы драйвера также могут изменять IPL  вызы-
 
   вая определенные макрокоманды МОС ВП. Макрокоманды рассмат-
 
   риваются в п. 3.1.11.  Обычно  драйвер  использует  их  для
 
   повышения IPL перед инициацией передач.
 
 
 
        3.1.6. Диспетчеризация прерываний устройств
 
 
 
        Периферийные  устройства  запрашивают  прерывания   на
 
   уровнях IPL 20-23. Когда устройство запрашивает  прерывание
 
   на одном из этих уровней, а  процессор  работает  на  более
 
   низком IPL, процессор выполняет следующие действия:
 
 
        - разрешает прерывание;
 
 
                            - 73 -
 
                        00152-01 97 07-1
 
 
        - передает управление программе обслуживания  прерыва-
 
   ний для данного устройства.
 
 
        Если процессор работает на более  высоком  или  равном
 
   уровне, прерывание остается в ожидании.
 
 
        Диспетчеризация прерываний устройств общей шины разли-
 
   чается в зависимости от типа адаптера общей шины и  процес-
 
   сора в аппаратной конфигурации.
 
 
        На рис. 6 изображен алгоритм диспетчеризации  прерыва-
 
   ний адаптера с косвенным вектором прерывания.
 
 
        В конфигурациях,  которые  поддерживают  прерывания  с
 
   прямым вектором,  процессор  находит  программу  прерывания
 
   устройства, используя блок управления системой (SCB).  Блок
 
   управления системой содержит две или три страницы  адресов.
 
   Первая страница перечисляет вектора  исключительных  ситуа-
 
   ций. Вторая и третья страница содержат список адресов  CRB,
 
   которые указывают на программы обслуживания прерываний  для
 
   устройств, присоединенных к общей шине и  к  необязательной
 
   второй шине, соответственно. Базовый регистр блока управле-
 
   ния системой (SCBB), один из внутренних регистров процессо-
 
   ра, указывает базу блока управления системой.
 
 
 
 
                            - 74 -
 
                        00152-01 97 07-1
 
 
         Диспетчеризация прерывания с косвенным вектором
 
                                       Прерывание
                                            I
   ************************   *******************************
   * Инструкция возврата  *   * Процессор изменяет стек на  *
   *       REI            *   * стек прерываний, если  это  *
   ************************   *       необходимо            *
            /I\               *******************************
   ************************                 I
   * Драйверная программа *   *******************************
   * обслуживания прерыва-*   * Процессор помещает PSL и PC *
   * ния получает управле-*   * прерванной программы в стек *
   * ние и или обслуживает*   *         прерываний          *
   * его, или уходит из   *   *******************************
   *    прерывания        *                 I
   ************************   *******************************
            /I\               * Управление передается прог- *
   ************************   * рамме диспетчеризации преры-*
   *   Инструкция    JSB  *   * вания для адаптера общей    *
   * адресует драйверную  *   * шины того устройства, кото- *
   * программу обслужива- *   * рое запрашивает прерывание  *
   * ния прерываний       *   *******************************
   ************************                 I
            /I\               *******************************
   ************************   *    Диспетчер  прерываний    *
   * Диспетчер прерываний *   * адаптера общей шины сохраня-*
   * передает управление  *   * ет содержимое регистров     *
   * по адресу CRB, кото- *   *          R0 - R5            *
   * рый относится к адре**   *******************************
   * су вектора прерывания*                 I
   * в ячейке по этому ад-*                 I
   * ресу содержится      *                 I
   * инструкция  JSB      *                 *
   ************************             *       *
            /I\                      *             *
   ************************       *  Диспетчер преры* *
   * Диспетчер прерываний *    * ваний  проверяет, имеет- *
   * использует адрес век-* -*   ся ли прерывание от уст-   *
   * тора в качестве ин-  * I  * ройства или ошибочные   *
   * декса таблицы адресов* I     *  условия  в  UBA  *
   *   блоков запроса     * I        *             *
   *  канала  (CRB)       * I           *       *
   ************************ I               *
            /I\             I               I
   ************************ I             Ошибка
   * Диспетчер прерываний * I               I
   * получает  адрес      * I               I
   * вектора прерывания   * I        ***************
   * устройства из регист-* I        *  Обработка  *
   * ра адаптера общей    * I        *   ошибки    *
   *     шины             * I        ***************
   ************************ I
           /I\              I Прерывание
            ----------------- от устройства
 
 
                              Рис.6
 
 
                            - 75 -
 
                        00152-01 97 07-1
 
 
   Процессор получает адрес вектора устройства, которое запрос
 
   прерывание и использует его в качестве индекса в странице
 
   2 (или в странице 3) SCB. Когда он обнаруживает адрес
 
   соответствующего CRB, процессор передает управление
 
   программе диспетчеризации прерывания в блоке запроса канала
 
   устройства.  Код диспетчеризации представляет собой
 
   инструкцию PUSHR для регистров  R0-R5, за которой следует
 
   инструкция перехода JSB в программу обслуживания прерывания
 
 
        На рис.7 изображен алгоритм диспетчеризации прерывания
 
   адаптера общей шины с прямым вектором прерывания.
 
 
        Для описания машинно-независимой части обработки  пре-
 
   рываний в последующих разделах данного руководства рассмат-
 
   ривается совокупность аппаратных и программных  средств,  с
 
   помощью которых прерывание передается от устройства к прог-
 
   раммам обслуживания прерываний, выполняющих роль диспетчера
 
   прерывания.
 
 
 
 
 
 
 
 
 
 
 
 

 
 
                            - 76 -
 
                        00152-01 97 07-1
 
 
          Диспетчеризация прерывания с прямым вектором
 
 
                            Прерывание
                                 I
                ************************************
                * Процессор изменяет стек на стек  *
                * прерываний, если это необходимо  *
                * процессор помещает PSL и PC      *
                * прерванной программы в стек      *
                * прерываний                       *
                ************************************
                                  I
                ************************************
                *  Процессор использует адрес      *
                *  вектора как индекс в таблице    *
                *  2 (3-ей) страницы блока         *
                *  управления системой (SCB) и     *
                *  вычисляет адрес программы       *
                *  диспетчеризации прерывания      *
                *  в CRB                           *
                ************************************
                                 I
                ************************************
                * Процессор передает управление    *
                * по адресу в CRB, который         *
                * соответствует адресу вектора;    *
                * этот адрес содержит инструкцию   *
                * PUSHR R0-R5, вслед за которой    *
                * находится инструкция JSB         *
                ************************************
                                  I
                ************************************
                * Выполняются следующие инструкции:*
                *    PUSH R0-R5, JSB на адрес      *
                * драйверной программы обслуживания*
                * прерывания                       *
                ************************************
                                 I
                ************************************
                * Драйверная программа обслуживания*
                * прерывания получает управление и *
                * либо обслуживает прерывание, либо*
                * уходит из него                   *
                ************************************
                                 I
                ************************************
                *         Инструкция REI           *
                ************************************
 
                              Рис.7
 
 
 
                            - 77 -
 
                        00152-01 97 07-1
 
 
        3.1.7. Передача     управления     драйверному
 
               форк-процессу
 
 
 
        Когда драйвер устройства получает от  устройства  ожи-
 
   даемое прерывание, программа обслуживания  прерывания  уст-
 
   ройства выполняется в контексте прерывания;  в  этой  точке
 
   она не выполняется в контексте  драйверного  форк-процесса.
 
   Контекст прерывания имеет следующие характеристики:
 
 
        - IPL повышается до уровня, на котором устройство зап-
 
   рашивает аппаратное прерывание;
 
 
        - стеком служит стек прерывания;
 
 
        - вершина стека содержит указатель на адрес блока дис-
 
   петчера прерываний (IDB) контроллера;  этот  блок  содержит
 
   адрес регистра управления и состояния;
 
 
        - стек содержит также сохраненное содержимое регистров
 
   R0-R5, а также PC и PSL прерванной программы.
 
 
        Прерывание происходит  либо  при  завершении  операции
 
   ввода/вывода, либо при обнаружении ошибки во время выполне-
 
   ния операции. Драйверные программы обслуживания  прерываний
 
   определяют, нужно ли обслуживать прерывание, путем проверки
 
   базы данных ввода/вывода. Если UCB устройства, владеющего в
 
   данный момент контроллером, указывает, что прерывание  ожи-
 
   дается, программа обслуживания выполняет следующие шаги для
 
   передачи    управления    драйверной    программе    начала
 
   ввода/вывода:
 
 
        - загружает адрес UCB в R5;
 
 
 
 
                            - 78 -
 
                        00152-01 97 07-1
 
 
        - восстанавливает содержимое двух регистров (R3 и  R4)
 
      форк-блока UCB;
 
 
        - передает управление сохраненному в форк-блоке PC.
 
 
        Драйвер может нуждаться в выполнении нескольких  инст-
 
   рукций в  контексте  прерывания.  Например,  драйвер  может
 
   копировать информацию о состоянии устройства  из  регистров
 
   устройства в UCB устройства. После выполнения этих инструк-
 
   ций    на     IPL     устройства,     драйвер,     создавая
 
   форк-процесс,завершает обработку ввода/вывода на более низ-
 
   ком уровне приоритета, как  это  рассмотрено  в  подразделе
 
   3.2.
 
 
 
        3.1.8. Использование IPL  во  время  обработки
 
               ввода/вывода
 
 
 
        Обработка ввода/вывода производится, главным  образом,
 
   на следующих IPL:
 
 
        - IPL$_ASTDEL (IPL 2);
 
 
        - IPL$_IOPOST (IPL 4);
 
 
        - IPL драйверной форк-обработки (IPL от 8 до II);
 
 
        - аппаратные IPL устройств (IPL от 20 до 23) ;
 
 
        - IPL$_POWER (IPL 3I) .
 
 
 
        3.1.8.1. IPL$_ASTDEL (IPL 2)
 
 
 
        IPL$-ASTDEL блокирует  выдачу  асихронного  системного
 
 
 
                            - 79 -
 
                        00152-01 97 07-1
 
 
   прерывания (AST). Когда программа системного  обслуживания,
 
   для которой было задано прерывание (TRAP)  системы,  завер-
 
   шает свою работу, она помещает AST в очередь и задает  зап-
 
   рос программного прерывания на уровне IPL$_ASTDEL. Програм-
 
   ма обслуживания прерывания по выдаче AST получает  управле-
 
   ние, когда IPL становится ниже уровня IPL$_ASTDEL. Это при-
 
   водит к выдаче AST процессу, который планируется в  текущий
 
   момент.
 
 
        Любая драйверная программа, которая назначает и  осво-
 
   бождает пространство динамического  системного  пула,  пока
 
   она выполняется в контексте процесса  (например,  программа
 
   FDT), должна выполняться на уровне  приоритета  IPL$_ASTDEL
 
   или выше. Программа распределения МОС ВП  записывает  адрес
 
   распределенной системной памяти в регистр.  Если  возникнет
 
   AST,  аварийно  завершающее  процесс,  выделенная  из  пула
 
   память будет утеряна. Чтобы заблокировать AST, предобработ-
 
   ка ввода/вывода с момента, когда системная программа обслу-
 
   живания очереди запросов на ввод/вывод назначает пакет зап-
 
   роса ввода/вывода до выполнения  последней  программы  FDT,
 
   выполняется на уровнях, не ниже IPL$_ASTDEL.
 
 
        Процесс не может подвергаться ошибкам страничной памя-
 
   ти, когда уровень превышает IPL$_ASTDEL.  Любая  программа,
 
   выполняющаяся на более высоком  уровне,  должна  обращаться
 
   только в бесстраничную область памяти или  к  блокированным
 
   страницам в виртуальной памяти. Если возникнет  ошибки  при
 
   обращении к странице на  уровне,  превышающем  IPL$_ASTDEL,
 
   появляется фатальная ошибка.
 
 
        Постобработка  ввода/вывода  выполняется  в  программе
 
 
 
                            - 80 -
 
                        00152-01 97 07-1
 
 
   обслуживания AST режима ядра, которая также выполняется  на
 
   уровне IPL$_ASTDEL. AST режима ядра, выполняющееся  в  кон-
 
   тексте процесса, ввод/вывод для которого завершен.  Записы-
 
   вает информацию о состоянии в блоки состояния ввода/вывода,
 
   копирует буферизованные входные данные в пространство  про-
 
   цесса и освобождает системные буфера.
 
 
 
        3.1.8.2. IPL$_IOPOST (IPL 4)
 
 
 
        Постобработка  ввода/вывода  включает  всю   обработку
 
   завершения  ввода/вывода,  которая  может  выполняться  без
 
   обращения к UCB устройства и, таким образом,  может  прохо-
 
   дить на IPL, более низком, чем  форк-IPL.  Чтобы  запросить
 
   постобработку  ввода/вывода,  драйверы  вызывают  программу
 
   операционной  системы,  которая  помещает  пакеты  запросов
 
   ввода/вывода в очередь на постобработку и запрашивает прог-
 
   раммное прерывание на уровне IPL$_IOPOST.
 
 
        Постобработка ввода/вывода выполняется на IPL,  превы-
 
   шающем IPL$_SCHED, так что  вся  обработка,  отложенная  по
 
   завершению ввода/вывода, завершается до того, как планиров-
 
   щик выберет для  планирования  новый  процесс.  Возможность
 
   выполнения процесса зависит от того, находится ли он в сос-
 
   тоянии ожидания завершения ввода/вывода. Так как  постобра-
 
   ботка устанавливает AST в очередь к  процессу,  планировщик
 
   может выполнить более предпочтительную перепланировку  ожи-
 
   дающего процесса с учетом AST, ожидающего этот процесс.
 
 
        Операционная    система    выполняет     постобработку
 
   ввода/вывода программой обслуживания прерывания  на  уровне
 
   IPL 4. Эта программа регулирует использование квоты процес-
 
 
                            - 81 -
 
                        00152-01 97 07-1
 
 
   са, устанавливает в очередь AST режима ядра для записи сос-
 
   тояния и данных в адресное пространство процесса и освобож-
 
   дает системную память.
 
 
 
        3.1.8.3. Драйверная форк-обработка (IPL от 8  до
 
                 11)
 
 
 
        Обработка форк-процессов драйвера производится на  IPL
 
   в границах от 8 до 11, в зависимости  от  содержимого  поля
 
   UCB$B_FILP в  UCB.  Это  поле  содержит  значение,  которое
 
   используется в качестве IPL форк-процесса данного устройст-
 
   ва. Все  программы  драйвера,  за  исключением  большинства
 
   программ FDT, выполняются на IPL драйверного  форк-процесса
 
   или более высоком уровне. Обычно  драйверные  программы  не
 
   должны читать или изменять поля в UCB до тех пор, пока  IPL
 
   не станет равным форк-уровню или превысит его.
 
 
        Для понижения IPL ниже уровня, соответствующего преры-
 
   ванию, необходимо создать форк-процесс более низкого  уров-
 
   ня.
 
 
        Все устройства, подсоединенные к одному адаптеру общей
 
   шины, совместно используют один и тот же форк-IPL, если они
 
   активно конкурируют за разделяемые ресурсы  адаптера  общей
 
   шины, такие как регистры отображения (MAP) и пути данных.
 
 
 
        3.1.8.4. Аппаратные прерывания устройств (IPL от
 
                 20 до 23)
 
 
 
        Поле UCB$B_DIPL в  UCB  устройства  содержит  значение
 
   IPL, на котором устройство запрашивает аппаратные  прерыва-
 
 
                            - 82 -
 
                        00152-01 97 07-1
 
 
   ния. Этот уровень лежит в границах от 20  до  23,  так  как
 
   прерывания устройств требуют прерывания  большинства  прог-
 
   раммных функций пользователя и операционной системы. Уровни
 
   от 20 до 23 соответствуют уровням от 4 до 7  запросов  шины
 
   (BR) на общей шине. Драйверы устройств иногда повышают  IPL
 
   до  UCB$B_DIPL  или  выше  перед  считыванием  определенных
 
   регистров устройств или перед записью в них.
 
 
 
        3.1.8.5. IPL$_POWER ( IPL 31 )
 
 
 
        IPL4_POWER - высший приоритетный уровень, который бло-
 
   кирует все остальные прерывания.  Многие  программы  опера-
 
   ционной системы и драйверы повышают уровень  до  рассматри-
 
   ваемого для выполнения последовательностей  кодов,  которые
 
   не могут допустить прерывания. Например, большинство  работ
 
   по инициализации системы выполняется на данном уровне.
 
 
        Когда драйверу необходимо выполнить последовательность
 
   инструкций без прерываний, он повышает приоритет  до  этого
 
   уровня, но драйвер не должен оставаться на нем дольше,  чем
 
   это требуется для выполнения небольшого  числа  инструкций.
 
   Наиболее общий пример повышения драйверами IPL  до  данного
 
   уровня - это проверка того, что нарушение питания не появи-
 
   лось в период между записью драйвером установочных данных в
 
   регистры устройства и тем моментом, когда драйвер запускает
 
   устройство, выполняя запись в регистр управления  устройст-
 
   ва.
 
 
 
 
 
 
 
 
 
                            - 83 -
 
                        00152-01 97 07-1
 
 
        3.1.9. Дополнительные IPL
 
 
 
        В дополнение к IPL, рассмотренным  выше,  операционная
 
   система определяет следующие:
 
 
        - IPL$_SCHED (IPL 3), никогда не используется  драйве-
 
   рами;
 
 
        - IPL$_QUEUEAST  (IPL  6),  очень  редко  используется
 
   драйверами;
 
 
        - IPL$_SYNCH и IPLS_TIMER (IPL 8);
 
 
        - IPL$_MAILBOX  (IPL  11),  очень  редко  используется
 
   драйверами.
 
 
        В целях отладки операционная система определяет  прио-
 
   ритетный уровень IPL$_XDELTA  (IPL  5),  рассматриваемый  в
 
   подпункте 3.1.9.5.
 
 
 
        3.1.9.1. IPL$_SCHED ( IPL 3 )
 
 
 
        Когда  системе  необходимо  перепланировать  процессы,
 
   программа МОС  ВП  запрашивает  программное  прерывание  на
 
   уровне IPL$_SCHED. Программа планировщика для  обслуживания
 
   прерываний получает управление на этом уровне.
 
 
        Если процесс повышает IPL до этого  уровня  или  выше,
 
   планировщик не может перепланировать процессы. Процесс про-
 
   должает выполняться, пока не появится прерывание  на  более
 
   высоком уровне или процесс не понизит IPL до  уровня,  ниже
 
   IPL$_SCHED.
 
 
 
 
                            - 84 -
 
                        00152-01 97 07-1
 
 
        3.1.9.2. IPL$_QUEUEAST ( IPL 6 )
 
 
 
        IPL$_QUEUEAST является уровнем  форк-процессов.  Прог-
 
   рамма обслуживания прерывания для данного  уровня  является
 
   форк-диспетчером, который извлекает из очереди форк-блоки и
 
   передает управление форк-процессам, требующим выполнения на
 
   данном уровне.
 
 
        Для  помещения  AST   в   очередь,   драйвер   создает
 
   форк-процесс на IPL$_QUEUEAST. Когда  форк-диспетчер  пере-
 
   дает управление форк-процессу, процесс может  повысить  IPL
 
   до IPL$_QUEUEAST и поместить AST в очередь.
 
 
        Драйвер, который по какой-то причине желает иметь дос-
 
   туп  к  системной  базе   данных,   также   может   создать
 
   форк-процесс  на  IPL$_QUEUEAST.  Форк-диспетчер   передает
 
   управление драйверу на этом уровне, а драйвер  затем  повы-
 
   шает приоритетный уровень до IPL$_SYNCH (нонфорковый  IPL),
 
   чтобы получить доступ к системной базе данных.
 
 
 
        3.1.9.3. IPL$_SYNCH и IPL$_TIMER ( IPL 8 )
 
 
 
        IPL$_SYNCH является  уровнем  синхронизации  системной
 
   базы данных. Когда подпрограмма  операционной  системы  или
 
   драйвер нуждаются в изменении или чтении динамической части
 
   системной базы  данных,  программа  всегда  исполняется  на
 
   IPL$_SYNCH, для уверенности, что база данных не будет изме-
 
   нена  какой-либо  программой  обслуживания  прерывания  или
 
   каким-либо действием процесса.
 
 
        Программа обслуживания прерываний для очереди  таймера
 
 
 
                            - 85 -
 
                        00152-01 97 07-1
 
 
   воспринимает прерывания, запрошенные на уровне  IPL$_TIMER,
 
   который является уровнем, равным IPL 8. Программа  обслужи-
 
   вания аппаратных прерываний от часов запрашивает  программ-
 
   ное прерывание таймера на этом уровне, когда  выполняющийся
 
   процесс исчерпал свой квант времени на процессор или  когда
 
   этого требует первый  элемент  очереди  таймера.  Программа
 
   обслуживания таймера изымает из очереди таймера первый эле-
 
   мент и выполняет соответствующие действия.
 
 
 
        3.1.9.4. IPL$_MAILBOX ( IPL 11 )
 
 
 
        Когда программа операционной системы или драйвера осу-
 
   ществляет запись в почтовый ящик, приоритетный уровень дол-
 
   жен быть равен IPL$_MAILBOX, чтобы предохранить пользовате-
 
   лей от модификации ошибочных данных или от чтения  неверных
 
   данных другими считывающими программами.
 
 
        Рассматриваемый уровень приоритета является высшим для
 
   форк-процессов; драйверы имеют возможность поднять  IPL  до
 
   этого уровня и выполнить запись в почтовый ящик.
 
 
 
        3.1.9.5. IPL$_XDELTA (IPL 5 )
 
 
 
        Остановить систему для отладочных работ, можно с  кон-
 
   сольного терминала и запросить прерывание на данном  уровне
 
   (программное). Процессор должен работать  на  уровне,  ниже
 
   IPL 5, чтобы прерывание имело эффект. Отладочная  программа
 
   XDELTA рассматривается в разделе 15.
 
 
 
 
 
 
 
                            - 86 -
 
                        00152-01 97 07-1
 
 
        3.1.10. Обзор использования IPL
 
 
 
        Рис.8 иллюстрирует поток IPL во время обработки запро-
 
   са ввода/вывода.
 
 
        Пользовательская программа, выполняющаяся на уровне 0,
 
   вызывает системную программу обслуживания очереди  запросов
 
   ввода/вывода. Обработка ввода/вывода системной программы  и
 
   программами FDT  происходит,  главным  образом,  на  уровне
 
   IPL$_ASTDEL. Программа FDT изредка повышает IPL  до  уровня
 
   форк-процесса драйвера для чтения или модификации UCB  уст-
 
   ройства.
 
 
        Программа   старта   ввода/вывода   выполняется    как
 
   форк-процесс на форк-уровне, но может повысить свой уровень
 
   приоритета  до  уровня   прерывания   устройства   или   до
 
   IPL$_POWER на короткий  период  времени.  После  того,  как
 
   драйверный форк-процесс  активизирует  устройство,  драйвер
 
   вызывает программу операционной системы, которая  сохраняет
 
   форк-контекст   драйвера,    приостанавливает    драйверную
 
   форк-обработку и устанавливает IPL на прежний уровень.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
                            - 87 -
 
                        00152-01 97 07-1
 
 
        Поток IPL во время обработки запроса ввода/вывода
 
 
                *****************     **********************
                * Запустить     *-----* Сохранить          *
                * устройство    *     * драйверный контекст*
                *****************     **********************
                              I                  I
                             / \                 I
   IPL$_POWER                 I                  I
   ---------------------------I------------------I---------- 
   UCB$B_DIPL                 I                  I
   ---------------------------I------------------I----------
                              I                  I
                 ************************        I
                 * Исходная установка   *        I
                 * регистров устройства *        I
                 ************************        I
                              I                  I
                             / \                 I
                              I                  I
   *************       **************            I
   * Изменение *       *   Начать   *            I
   * и чтение  *       * ввод/вывод *            I
   *   UCB     *       *            *            I
   *************       **************            I
       I    I                 I                  I
      / \   I                / \                 I
       I    I                 I                  I
   UCB$B_FILP                 I                  I
   ----I----I-----------------I------------------I----------
       I    I                 I                  I
       I    I                 I                  I
   *****************          I                  I
   * Программа FDT *          I                  I
   *****************          I                  I
       I    I                 I                  I
       I   / \                I                  I
       I    I                 I                  I
   ****************     *************            I
   *  Программа   *     *           *            I
   * обслуживания *-----* Программа *            I
   *   QIO        *     *   FDT     *            I
   ****************     *************            I
         I                                       I
        / \                                      I
         I                                       I
   IPL$_ASTDEL                                   I
   ------I---------------------------------------I----------
         I                                       I
         I                                       I
   ****************                     ********************
   * Пользователь *                     * Продолжение      *
   *  выдает      *                     * пользовательской *
   *   QIO        *                     *   программы      *
   ****************                     ********************
 
                              Рис.8
 
 
 
                            - 88 -
 
                        00152-01 97 07-1
 
 
        Рис.9 иллюстрирует завершение запроса ввода/вывода  от
 
   точки прерывания устройства до доставки AST  пользовательс-
 
   кой программе. Устройство прерывает по своему уровню (IPL в
 
   пределах от 20 до 23). Операционная система передает управ-
 
   ление  соответствующей  драйверной  программе  обслуживания
 
   прерывания. Обслуживающаяся программа реактивизирует  драй-
 
   верный форк-процесс на уровне приоритета,  все  еще  равном
 
   IPL устройства.
 
 
        Форк-процесс кратко проверяет или сохраняет содержимое
 
   регистров устройства, но вскоре просит операционную систему
 
   поместить форк-блок, описывающий его контекст,  в  одну  из
 
   форк-очередей на драйверном форк-IPL (от 8  до  11).  Когда
 
   драйверный  форк-процесс   получает   управление   на   IPL
 
   форк-процесса, процесс анализирует успешное выполнение опе-
 
   рации ввода/вывода и записывают состояние в R0 и R1. Затем,
 
   все еще находясь на том же форк-уровне, операционная систе-
 
   ма помещает пакет запроса ввода/вывода в очередь  постобра-
 
   ботки и запускает следующий запрос ввода/вывода.
 
 
        Программа   постообработки   ввода/вывода   регулирует
 
   использование квоты процесса и освобождает системные буфера
 
   для функций записи на уровне IPL$_IOPOST. Программа постоб-
 
   работки вызывает также другую программу операционной систе-
 
   мы, которая повышает уровень приоритета до IPL$_SYNCH, что-
 
   бы поместить в очередь AST режима ядра к процессу,  который
 
   выдал исходный запрос QIO. Программа AST режима ядра выпол-
 
   няется на уровне IPL$_ASTDEL и ставит в  очередь  программу
 
   AST режима ядра, выполняющуюся на уровне IPL 0.
 
 
 
 
 
 
                            - 89 -
 
                        00152-01 97 07-1
 
 
        Поток IPL во время завершения запроса ввода/вывода
 
 
       ***********************************
       * Устройство формирует прерывание *
       ***********************************
                     I
                     I
       ***********************************
       * Драйвер  анализирует прерывание *
       ***********************************
   UCB$SB_DIPL       I
   ------------------I--------------------------------------
                     I
                     I
       **********************************
       *  Драйвер возвращает состояние  *
       **********************************
                     I
                     I
       ***************************        **************
       * Операционная система    *        *  Начать    *
       * устанавливает в очередь *        * следующий  *
       * почту   ввода/вывода    * -------* ввод/вывод *
       ***************************        **************
   UCB$S_FILP        I
   ------------------I--------------------------------------
                     I
                     I
         **************************
         * Привести в порядок QIO *
         * установить в очередь   *
         * AST режима ядра  для   *
         * данного процесса       *
         **************************
   IPL$_IOPOST       I
   ------------------I--------------------------------------
   IPL$_ASTDEL       I
                     I
          **********************
          * Выдать AST режима  *
          * ядра в процесс     *
          **********************
                     I
   ---------------------------------------------------------
   0                 I
                     I
     ************************************
     * Выдать AST режима пользователя   *
     * (если таковое имеется) в процесс *
     ************************************
 
                              Рис.9
 
 
 
                            - 90 -
 
                        00152-01 97 07-1
 
 
        Постобработка  ввода/вывода  продолжается  на   уровне
 
   IPL$_IOPOST, пока все записи  в  очереди  постобработки  не
 
   будут обслужены.
 
 
 
        3.1.11. Изменение IPL в драйверной программе
 
 
 
        Уровень приоритета прерывания, на котором  выполняется
 
   программа драйвера, изменяется в результате одного из  сле-
 
   дующих событий:
 
 
        - драйвер  вызывает  программу  операционной  системы,
 
   которая повышает или понижает IPL;
 
 
        - драйвер содержит макрокоманду  операционной  системы
 
   для запроса явного изменения уровня приоритета.
 
 
        Драйвер может использовать следующие макрокоманды  для
 
   изменения приоритетного уровня:
 
 
        - SETIPL ;
 
 
        - DSBINT ;
 
 
        - ENBINT ;
 
 
        - SOFTINT.
 
 
 
        3.1.11.1. Макрокоманда      установки      уровня
 
                  приоритета прерывания
 
 
 
        Макрокоманда  установки  уравня  приритета  прерывания
 
   SETIPL пересылает указанный IPL в регистр IPL процессора.
 
 
 
 
 
                            - 91 -
 
                        00152-01 97 07-1
 
 
        Формат команды:
 
 
        SETFIPL [IPL]
 
 
   IPL    - уровень  приоритета  прерывания.  При   отсутствии
 
            аргумента макрокоманда пересылает  величину  3I  в
 
            регистр IPL. Установка  уровня  3I  блокирует  все
 
            прерывания.
 
 
 
        3.1.11.2. Макрокоманда запрета прерываний
 
 
 
        Макрокоманда запрета прерываний DSBINT сохраняет теку-
 
   щее значение уровня  приоритета  в  указанном  приемнике  и
 
   пересылает указанный IPL в процессорный регистр IPL. Макро-
 
   команда вызывается процедурами для повышения уровня IPL.
 
 
        Формат команды:
 
 
        DSBINT [IPL][,DST]
 
 
   IPL    - уровень приоритета прерывания. Макрокоманда сохра-
 
            няет значение текущего уровня приоритета в вершине
 
            стека (по умолчанию) или в указанном приемнике,  и
 
            пересылает указанное значение IPL в  регистр  IPL.
 
            Если приоритетный уровень не указывается, макроко-
 
            манда пересылает в регистр IPL процессора величину
 
            3I; это приводит K блокированию всех прерываний.
 
 
   DST    - ячейка, в которой должно  быть  сохранено  текущее
 
            значение уровня приоритета. Если этот аргумент  не
 
            указывается, текущее  значение  уровня  приоритета
 
            сохраняется по умолчанию на вершине стека.
 
 
 
 
                            - 92 -
 
                        00152-01 97 07-1
 
 
        3.1.11.3. Макрокоманда разрешения прерываний
 
 
 
        Макрокоманда разрешения прерываний ENBINT восстанавли-
 
   вает значение уровня приоритетав регистре  IPL  процессора.
 
   Процедуры вызывают эту макрокоманду  для  понижения  уровня
 
   приоритета до ранее сохраненного  уровня.  Если  прерывание
 
   ожидается на промежуточном  уровне  (т.е.  На  уровне  ниже
 
   текущего, но выше указанного), то восстановление IPL приво-
 
   дит к немедленному прерыванию текущей процедуры.
 
 
        Формат команды:
 
 
        ENBINT [SRC]
 
 
   SRC    - ячейка, содержащая IPL, который должна быть перес-
 
            лана. Если аргумент не  указывается,  макрокоманда
 
            пересылает значение уровня  приоритета  в  регистр
 
            IPL из вершины стека.
 
 
 
        3.1.11.4. Макрокоманда программного прерывания
 
 
 
        Макрокоманда программного прерывания  SOFTINT  пересы-
 
   лает указанный уровень приоритета  в  процессорный  регистр
 
   запроса программного прерывания. Если процессор работает на
 
   низком уровне (например, на уровне IPL 0),  и  обнаруживает
 
   запрос программного прерывания на более высоком уровне  (от
 
   I до I5), процессор немедленно передает управление програм-
 
   ме  обслуживания  прерывания  соответвующего  приоритетного
 
   уровня. Если процессор работает на  уровне  указанного  IPL
 
   или выше, процессор не передает управление программе обслу-
 
   живания программного прерывания до тех  пор,  пока  текущий
 
 
 
                            - 93 -
 
                        00152-01 97 07-1
 
 
   приоритетный уровень не упадет ниже указанного.
 
 
        Формат команды:
 
 
        SOFTINT IPL
 
 
   IPL    - уровень приоритета прерывания, на котором запраши-
 
            вается программное прерывание.
 
 
 
        3.2. Форк-блоки и форк-диспетчеризация
 
 
 
        Программы драйвера  устройства,  которые  активизируют
 
   устройство и завершают операцию ввода/вывода после прерыва-
 
   ния устройства, выполняются за относительно короткие интер-
 
   валы времени. Выполнение может быть приостановлено для ожи-
 
   дании прерывания устройства или разделяемых ресурсов. Чтобы
 
   обеспечить  быстрое  переключение  контекста,  операционная
 
   система заставляет программы драйвера  выполнятся  в  мини-
 
   мальном контексте форк-процесса, состоящем из UCB устройст-
 
   ва, называемого форк-блоком, и нескольких регистров.
 
 
        Форк-процессы создаются в одной из двух ситуаций:
 
 
        - при   завершении   предобработки   пакета    запроса
 
   ввода/вывода   программа   операционной   системы   создает
 
   форк-процесс для  выполнения  драйверной  программы  начала
 
   ввода/вывода. Если драйвер уже занят, программа  операцион-
 
   ной системы устанавливает в очередь к драйверу пакет запро-
 
   са ввода/вывода для последующей обработки ;
 
 
        - драйверная программа  обслуживания  прерывания,  или
 
   драйверная программа постобработки создают форк-процесс для
 
   выполнения   зависящей    от    устройства    постобработки
 
 
                            - 94 -
 
                        00152-01 97 07-1
 
 
   ввода/выводA.
 
 
        Когда  система  создает  драйверный  форк-процесс  для
 
   выполнения программы начала ввода/вывода,  вновь  созданный
 
   процесс может выполняться немедленно, так как пакет запроса
 
   ввода/вывода был предварительно обработан системным  обслу-
 
   живанием очереди запросов вввода/вывода и  программами  FDT
 
   драйвера, и устройство свободно.
 
 
        Когда драйверная программа обслуживания прерывания или
 
   программа драйверной  постобработки  создает  форк-процесс,
 
   это приводит к понижению IPL, на котором выполняется  прог-
 
   рамма драйвера. Программа облуживания прерывания или  прог-
 
   рамма старта ввода/вывода вызывает макрокоманду  операцион-
 
   ной системы IOFORK. Макрокоманда сохраняет контекст,  необ-
 
   ходимый для исполнения драйвера как форк-процесса, помещает
 
   драйверный форк-блок UCB в форк-очередь на IPL  драйвера  и
 
   запрашивает прерывание для этого уровня.
 
 
 
        3.2.1. Программа обслуживания  прерываний  для
 
               форк-диспетчеризации
 
 
 
        Одна программа обслуживания прерываний управляет  дис-
 
   петчеризацией всех форк-процессов. Когда  процессор  разре-
 
   шает прерывание на  форк-уровне,  форк-диспетчер  сохраняет
 
   регистры R0-R5 в стеке и обрабатывает форк-очередь, Kоторая
 
   соответствует IPL прерывания. Для этого форк диспетчер дос-
 
   тает  запись  из  форк-очереди,  восстанавливает   контекст
 
   форк-процесса,     и     перезапускает     приостановленный
 
   форк-процесс.  Когда  форк-процесс  завершается,  диспетчер
 
   снова получает управление, изымает следующую  запись,  если
 
 
                            - 95 -
 
                        00152-01 97 07-1
 
 
   она   имеется,   из   очереди,   восстанавливает   контекст
 
   форк-процесса и реактивизирует этот процесс. Эта последова-
 
   тельность повторяется, пока форк-очередь не опустеет. Когда
 
   очередь пуста,  форк-диспетчер  восстанавливает  содержимое
 
   регистров R0-R5 из стека и уходит из прерывания по инструк-
 
   ции REI.
 
 
        Рис.10. Иллюстрирует структуру форк-очереди.
 
 
        Вновь активизированный драйверный форк-процесс  выпол-
 
   няется при следующих ограничениях:
 
 
        - не может обращаться к адресному пространству процес-
 
   са, инициировавшего запрос ввода/вывода;
 
 
        - может свободно использовать только регистры R0-R5  и
 
   должен сохранять эти регистры после использования.  Исполь-
 
   зование регистров отличных от R0-R5 настоятельно  не  реко-
 
   мендуется;
 
 
        - должен привести в порядок стек после  использования;
 
   стек  должен  находиться  в   исходном   состоянии,   когда
 
   форк-процесс  передает  управление  программе  операционной
 
   системы;
 
 
        - должен выполняться на приоритетном уровне между  IPL
 
   форк-процесса драйвера и IPL$_POWER  и  не  должен  снижать
 
   уровень ниже форк-уровня данного драйвера,  за  исключением
 
   случаев создания форк-процесса более низкмо IPL;
 
 
        - при  передаче  управление  форк-диспетчеру,  уровень
 
   приоритета  должен  быть  таким  же,   каким   был,   когда
 
   форк-процесс был активизирован. Драйвер возвращает управле-
 
 
                            - 96 -
 
                        00152-01 97 07-1
 
 
   ние форк-диспетчеру путем вызова макрокоманды ожидания пре-
 
   рывания или макрокоманды завершения запроса.
   

                     Структура форк-очереди
 
 
         ******************
   IPL15 * Зарезервирован *
         ******************      *****************
   IPL14 * Зарезервирован        *    IPL11      *  ********
         ******************   ---*  Заголовок    *--* Форк-*
   IPL13 * Зарезервирован *   I  * форк-очередей *  * блок *->
         ******************   I  *****************  ********
   IPL12 * Зарезервирован *   I
         ******************   I  *****************
   IPL11 * Форк-уровень   *----  *    IPL10      *
         ******************      * Заголовок     *
   IPL10 * Форк-уровень   *------* форк-очередей *
         ******************      *****************
   IPL 9 * Форк-уровень   *---------------
         ******************              I
   IPL 8 * Форк-уровень   *-----         I
         ******************    I         I
   IPL 7 * Файмер         *    I *****************
         ******************    I *    IPL9       *
   IPL 6 * Форк-уровень   *--  I * Заголовок     *
         ****************** I  I * форк-очередей *
   IPL 5 * XDELTA         * I  I *****************
         ****************** I  I
         * Посылка почты  * I  I *****************
         * (POSTING)      * I  I *    IPL8       *  *Ф******
   IPL 4 * ввода/вывода   * I  --* Заголовок     *--* Форк-*->
         I***************** *    * форк*очередей *  * блок *
         * Планирование   * I    *****************  ********
   IPL 3 * процесса       * I
         ****************** I    *****************  ********
   IPL 2 * Доставка  AST  * I    *    IPL6       *  *      *
         ****************** I    * Заголовок     *--* Форк-*->
   IPL 1 * Зарезервирован * -----* форк-очередей *  * блок *
         ******************      *****************  ********
         * Исполнение     *
   IPL 0 * процесса       *
         ******************
 
                             Рис.10
 
 
 
 
 
        3.3. Очереди ожидания ресуров
 
 
 
        Обработка запроса ввода/вывода часто требует разделяе-
 
   мых ресурсов, таких как память и регистры отображения адап-
 
 
 
                            - 97 -
 
                        00152-01 97 07-1
 
 
   тера общей шины. Системная программа  обслуживания  очереди
 
   запросов ввода/вывода и драйверные  форк-процессы  вызывают
 
   программы операционной системы для захвата  и  освобождения
      
   этих  ресурсов.  Так  как  ресурсы  ограничены,   обработка
 
   ввода/вывода может быть задержана до тех пор,  пока  недос-
 
   тупные ресурсы не освободятся другими процессами или  драй-
 
   верами. Таким образом, синхронизация доступа к этим  ресур-
 
   сам может иметь существенное влияние на  обработку  запроса
 
   ввода/вывода.
 
 
        Например,  системная  программа  обслуживания  очереди
 
   запросов ввода/вывода вызывает программу операционной  сис-
 
   темы для резервирования  бесстраничного  системного  прост-
 
   ранства для пакета запроса ввода/вывода. Если бесстраничный
 
   пул пуст, программа вызывает другую программу  операционной
 
   системы для сохранения контекста процесса и изменения  сос-
 
   тояния процесса на режим ожидания ресурса (называемый также
 
   разнородным ожиданием или  МWAIT).  В  результате  ожидания
 
   процесс является кандидатом на выгрузку  из  памяти.  Когда
 
   бесстраничный пул становится доступным, планировщик  переп-
 
   ланирует процесс.
 
 
        Во время выполнения процесса драйверных форк-процессов
 
   на повышенных приоритетных уровнях, контекст драйвера очень
 
   мал. В любои момент драйвер может  получить  всю  детальную
 
   информацию о запросе ввода/вывода, обратившись к базе  дан-
 
   ных ввода/вывода. Драйверу необходим только в  адрес  блока
 
   управления устройством, который является ключом к остальной
 
   базе данных. Поэтому программы операционной системы,  кото-
 
   рые управляют ресурсами, такими  как  регистры  отображения
 
   адаптера общей шины,  используют  драйверные  форк-блоки  и
 
 
                            - 98 -
 
                        00152-01 97 07-1
 
 
   очереди ожидания ресурсов для сохранения минимального драй-
 
   верного контекста. Каждая запись в очереди состоит из  сле-
 
   дующих элементов:
 
 
        - адрес UCB, который является также  содержимым  R5  в
 
   форк-процессе  драйвера;  UCB  содержит  также   драйверный
 
   форк-блок;
 
 
        - R3 и, обычно, R4 из форк-процесса;
 
 
        - PC для ожидающего форк-процесса.
 
 
        Когда ожидаемые ресурсы становятся  доступными,  прог-
 
   рамма, управляющая ресурсами, выполняет следующие действия:
 
 
        - восстанавливает адрес UCB в R5;
 
 
        - восстанавливает сохраненные регистры R3 и R4;
 
 
        - разрешает пользование ресурсами;
 
 
        - передает управление по адресу возврата в драйвер  из
 
   сохраненного PC.
 
 
        Программа операционной системы, управляющая  отдельным
 
   ресурсом, помещает  драйвер  в  состояние  ожидания,  когда
 
   драйвер запрашивает недоступный ресурс, драйверы  находятся
 
   в неведении о приостановах  и  последующих  возобновлениях.
 
   Драйверы не должны ничего  оставлять  в  стеке,  когда  они
 
   вызывают  программу,  способную  приостановить   выполнение
 
   драйвера.
 
 
 
 
 
 
 
 
 
                            - 99 -
 
                        00152-01 97 07-1
 
 
        3.3.1. Конкуренция за канал данных контроллера
 
 
 
        Канал данных контроллера является механизмом синхрони-
 
   зации операционной системы, который гарантирует для группо-
 
   вого контроллера, что в данный  момент  времени  контроллер
 
   занят  лишь  одним  устройством  из  всех   присоединенных.
 
   Форк-процесс драйвера устройства может читать и  записывать
 
   регистры устройства, когда оно владеет каналом данных конт-
 
   роллера.
 
 
        Устройства, которые  разделяют  групповой  контроллер,
 
   такие как дисковое,  владеют  каналом  данных  контроллера,
 
   лишь когда программа операционной  системы  назначит  канал
 
   драйверному форк-процессу  этого  устройства.  Единственное
 
   устройство присоединенное к контроллеру всегда владеет  его
 
   каналом данных. Поэтому, если операционная система передает
 
   управление программе старта ввода/вывода  такого  драйвера,
 
   он может  немедленно  адресовать  регистры  устройства  без
 
   предварительного получения канала данных контроллера.
 
 
        Устройство построчной печати имеет выделенный (на одно
 
   устройство) контроллер, присоединенный к общей шине.  Когда
 
   операционная система обнаруживает, что устройство  свободно
 
   и создает драйверный форк-процесс для устройства построчной
 
   печати, чтобы записать данные  в  буфер  данных  построчной
 
   печати, гарантируется,  что  канал  данных  контроллера  не
 
   занят. Поскольку канал данных не  занят,  программа  старта
 
   ввода/вывода на устройстве выполняет следующую простую пос-
 
   ледовательность:
 
 
        1) определяет из UCB устройства виртуальный адрес дан-
 
 
 
                            - 100 -
 
                        00152-01 97 07-1
 
 
   ных, которые должны быть записаны, и число байтов для пере-
 
   дачи;
 
 
        2) определяет адрес регистра  управления  и  состояния
 
   устройства (виртуальный) из блока диспетчеризации  прерыва-
 
   ния;
 
 
        3) вычисляет адрес буферного регистра  данных  печати,
 
   прибавляя постоянное смещение к адресу CSR;
 
 
        4) записывает побайтно данные в буферный регистр  дан-
 
   ных печати, пока все данные не будут записаны.
 
 
        В отличие  от  зтого,  устройство  группового  канала,
 
   должно конкурировать за канал данных контроллера с  другими
 
   устройствами, присоединенными к этому контроллеру.
 
 
        Контроллер СМ5408 может управлять устройствами в коли-
 
   честве до 8 штук.  Форк-процесс  драйвера  должен  получить
 
   управление каналом данных контроллера перед запуском опера-
 
   ции ввода/вывода на устройстве, связанном с форк-процессом.
 
   Программа начала  ввода/вывода  драйвера  диска  использует
 
   такую последовательность для запуска операции поиска:
 
 
        - программа старта ввода/вывода запрашивает канал дан-
 
   ных контроллера, вызывая программу арбитража канала из  мос
 
   вп;
 
 
        - программа операционной  системы  просматривает  поле
 
   маски CRB, проверяя доступность канала данных контроллера;
 
 
        - если канал  доступен,  программа  присваивает  канал
 
   данных форк-процессу драйвера и передает  в  процесс  адрес
 
   CSR устройства;
 
 
                            - 101 -
 
                        00152-01 97 07-1
 
 
        - если канал  занят,  программа  операционной  системы
 
   сохраняет форк-контекст драйвера в форк-блоке UCB  и  поме-
 
   щает адрес форк-блока  в  очередь  ожидания  канала  данных
 
   контроллера;
 
 
        - когда драйверный форк-процесс возобновляет  выполне-
 
   ние, процесс  обладает  каналом  контроллера.  Форк-процесс
 
   может менять содержимое регистров устройства для его  акти-
 
   визации ;
 
 
        - после этого драйверная программа начала ввода/вывода
 
   запрашивает  операционную  систему  приостанова  драйверной
 
   обработки в ожидании прерывания или тайм-аута и  освобожде-
 
   ния канала;
 
 
        - программа  операционной  системы  для   освобождения
 
   канала назначает  владельцем  канала  следующий  драйверный
 
   форк-процесс из очереди ожидания  канала,  загружает  адрес
 
   регистра управления и состояния в общий регистр и реактиви-
 
   зирует приостановленный форк-процесс;
 
 
        - реактивизированный форк-процесс продолжает  исполне-
 
   ние так, как если бы канал был доступен ему сразу.
 
 
        Программы операционной системы  для  арбитража  канала
 
   отслеживают доступность канала с помощью поля флажков блока
 
   запроса канала. Драйверный форк-процесс обязан  запрашивать
 
   и освобождать канал данных контроллера,  обращаясь  к  этим
 
   программам. Если канал доступен драйверу, то драйвер  может
 
   читать и модифицировать содержимое регистров устройства.
 
 
 
 
 
 
 
                            - 102 -
 
                        00152-01 97 07-1
 
 
                     4. АДАПТЕР ОБЩЕЙ ШИНЫ
 
 
 
 
        Адаптер общей шины связывает общую шину  с  внутренней
 
   шиной процессора. Адаптер выполняет следующей функции:
 
 
        - осуществляет  арбитраж   прерываний   от   устройств
 
   ввода/вывода /УВВ/ общей шины по приоритетам;
 
 
        - передает прерывания от устройств общей шины  процес-
 
   сору;
 
 
        - позволяет  драйверам  получить  доступ  к  регистрам
 
   внешних устройств общей шины, используя системные виртуаль-
 
   ные адреса;
 
 
        - преобразует I8-разрядные адреса общей шины  в  физи-
 
   ческие адреса оперативной памяти;
 
 
        - обеспечивает путь передачи данных в произвольно упо-
 
   рядоченные физические страницы;
 
 
        - обеспечивает буферизованные пути передачи  данных  в
 
   ячейки памяти с последовательно увеличивающимся  физическим
 
   адресам;
 
 
        - формирует адреса в границах байта для тех увв, кото-
 
   рые оперируют адресами в границах слова.
 
 
        Адаптер общей шины и внутренняя шина  процессора  дают
 
   возможность составлять драйверы устройств ввода/вывода  для
 
   выполнения обмена данными без специального  знания  деталей
 
   построения  аппаратных  средств.  Для  обеспечения  деталей
 
   функционирования адаптера совместно с внутренним  интерфей-
 
 
 
                            - 103 -
 
                        00152-01 97 07-1
 
 
   сом в системе МОС ВП имеются специальные подпрограммы, поэ-
 
   тому при  написании  драйверов  увв  не  обязательно  знать
 
   интерфейсные алгоритмы и протоколы.
 
 
        Важной обязанностью драйверов  устройств  общей  шины,
 
   которые активно конкурируют за разделяемые ресурсы адаптера
 
   общей шины, является то, что все они выполняются на тех  же
 
   уровнях IPL. Соглашения по IPL синхронизирует доступ к дан-
 
   ных адаптера общей шины.
 
 
        В основном драйверы устройств используют адаптер общей
 
   шины для следующих целей:
 
 
        - чтения и запись содержимого регистров  внешних  уст-
 
   ройств;
 
 
        - преобразования адресов общей шины в физические адре-
 
   са памяти и наоборот для выполнения обмена данными по  пря-
 
   мому доступу в память;
 
 
        - передачи буферизованных данных.
 
 
        Драйверам тех устройств, которые не выполняют передачи
 
   данных по прямому доступу, не обязательно знать  о  наличии
 
   адаптера общей шины. В  этом  случае  адаптер  обеспечивает
 
   доступ  к  регистрам  внешних  устройств,  используя  схему
 
   преобразования адресов, которая  "невидима"  для  драйвера.
 
   Однако, драйверы, которые обеспечивают передачи по  прямому
 
   доступу к памяти  должны  вызывать  специальные  программы,
 
   операционной системы, которые и осуществляют  соответствую-
 
   щее преобразование адресов.
 
 
 
 
 
 
                            - 104 -
 
                        00152-01 97 07-1
 
 
        4.1. Чтение и запись в регистры устройств
 
 
 
        Каждый контроллер ввода/вывода или устройство, подклю-
 
   ченное к общей шине, имеет  набор  регистров  управления  и
 
   состояния и регистров данных. Эти регистры имеют адреса  из
 
   сферы физического адресного пространства, называемой адрес-
 
   ным пространством общей шины. Драйверы получают  информацию
 
   о состоянии устройств и инициализируют их  путем  чтения  и
 
   записи информации  в  соответствующие  регистры  этих  уст-
 
   ройств.
 
 
        Драйвер может работать с  адресами  внешних  устройств
 
   точно также, как и со всеми другими виртуальными  адресами.
 
   Драйвер может читать и писать данные  в  регистр  УВВ,  как
 
   если бы этот регистр был  ячейкой  памяти.  Драйвер  должен
 
   выполнить ограничения при выполнении  команд,  описанных  в
 
   подразделе 6.2. Адаптер общей  шины  выполняет  фактическое
 
   преобразование виртуального адреса  на  адрес  общей  шины,
 
   который и соответствует данному регистру УВВ.
 
 
        Чтобы драйвер  контроллера,  к  которому  подключается
 
   несколько устройств, получил доступ к регистрам устройства,
 
   он должен сначала  получить  доступ  к  каналу  контроллера
 
   (п.3.3.1).
 
 
 
        4.2. Преобразование  адресов  общей  шины  в
 
             физические  для  передач   по   прямому
 
             доступу в память
 
 
 
        Адресное пространство общей шины  включает  256  кбайт
 
   памяти, из которых  8  кбайт  резервируются  для  регистров
 
 
                            - 105 -
 
                        00152-01 97 07-1
 
 
   внешних устройств. При работе по прямому доступу устройства
 
   ввода/вывода читают и пишут данные из и  в  ячейки  памяти,
 
   используя 18-разрядный адрес общей шины. Адаптер общей шины
 
   преобразует этот  18-разрядный  адрес  в  физический  адрес
 
   памяти. Это преобразование позволяет операционной  системе,
 
   драйверам ввода/вывода и устройствам ввода/вывода обращать-
 
   ся в одно и то же физическое адресное пространство.
 
 
        Адаптер общей шины имеет 496 регистров отображения для
 
   преобразования адресов общей шины в физические адреса. Каж-
 
   дый регистр из этих 496 представляет одну страницу в адрес-
 
   ном пространстве общей шины. Содержимое регистра  отображе-
 
   ния указывает номер  физической  страницы,  соответствующий
 
   адресу общей шины, который представляет  регистр  отображе-
 
   ние.
 
 
        Для обеспечения нормальной работы при выполнении пере-
 
   дач  по  прямому  доступу  программы  операционной  системы
 
   заполняет столько регистров отображения, сколько необходимо
 
   для передачи по прямому доступу к памяти. После этого  уст-
 
   ройство, выполняющее передачи по прямому  доступу  передает
 
   адрес общей шины. Адаптер общей шины, получив  этот  адрес,
 
   преобразует его в физический адрес памяти,  используя  сле-
 
   дующую информацию:
 
 
        - 9-разрядное поле адреса страницы общей шины /разряды
 
   с 9 по 17 адреса общей шины/ определяет регистр  преобразо-
 
   вания адаптера общей шины;
 
 
        - поле номера физической страницы, содержащееся в дан-
 
   ном регистре преобразования, образует старшую  часть  физи-
 
   ческого адреса памяти;
 
 
                            - 106 -
 
                        00152-01 97 07-1
 
 
        - разряды со 2-го по 8-й адреса общей шины непосредст-
 
   венно образуют разряды с 0-го  по  6-й  физического  адреса
 
   памяти.
 
 
        Получившийся в результате физический адрес памяти ука-
 
   зывает на ячейку длиной в двойное слово /длинное слово/,  к
 
   которой и производилось обращение. Адаптер общей шины опре-
 
   деляет байт внутри данного двойного  слова,  используя  два
 
   самых младших разряда адреса общей шины.
 
 
        На рис.11  показана  процедура  преобразования  адреса
 
   общей шины в физический адрес памяти.
 
 
 
 
   Преобразование адреса общей шины в физический адрес памяти
 
 
             18-разрядный адрес общей шины
        *******************************************
        * Номер регистра * Смещение двойного *    *
     ---* преобразования *     слова         *    *
     I  *******************************************
     I                             I
     I ******************          I
     I * Регистры       *          I
     I * преобразования *          ---------------------
     I * адаптера       *                              I
     I * общая          *                              I
     I * шина           *   32-разрядный регистр       I
     I *                *     преобразования           I
     I ******************   ************************   I
     I *                *---*   * Адрес физической *   I
     --*                *   *   *    страницы      *   I
       ******************   ************************   I
       *                *            I                 I
       *                *            I                 I
       *                *            I                 I
       *                *       ******************************
       *                *       *     Адрес       * Смещение *
       *                *       *    физической   * двойного *
       ******************       *    страницы     * слова    *
                                ******************************
                                    Физический адрес
 
                             Рис.11
 
 
                            - 107 -
 
                        00152-01 97 07-1
 
 
        Каждый регистр отображения адаптера общей шины  содер-
 
   жит разряд, называемый битом достоверности регистра отобра-
 
   жения. Адаптер общей шины проверяет этот  бит  каждый  раз,
 
   когда он обращается к соответствующему  регистру  отображе-
 
   ния. Если этот бит не установлен,  то  адаптер  общей  шины
 
   прекращает данное обращение. Нулевое состояние  этого  бита
 
   делает  недостоверным  содержимое  данного  регистра,  т.е.
 
   Отображения в физический адрес запрещено, и попытка сделать
 
   обращение при этом вызовет прерывание текущей работы.
 
 
 
        4.2.1. Пути  передачи  данных  адаптера  общей
 
               шины
 
 
 
        Для устройств общей шины, выполняющих передачи по пря-
 
   мому доступу к памяти, адаптер общей шины пересылает данные
 
   используя один или несколько путей /режимов/ передачи  дан-
 
   ных. Один из этих режимов, называемый режимом прямой  пере-
 
   дачи /DIRECT DATA PATH - DDP/, позволяет передавать  данные
 
   по произвольно  упорядоченным  физическим  адресам.  Прямой
 
   путь данных отображает каждую передачу общей шины в переда-
 
   чу по внутренней шине процессора. Таким образом, одно слово
 
   или байт данных передаются за одну операцию внутреней  шины
 
   процессора.
 
 
        Другие режимы передачи данных, называемые буферизован-
 
   ными путями данных /BUFFERED DATA PATH  -  BDP/,  позволяют
 
   осуществлять более быструю передачу данных, по прямою  пути
 
   данных. Буферизованные пути данных несколько передач  общей
 
   шины преобразуют в одну передачу по внутренней шине процес-
 
   сора.
 
 
 
                            - 108 -
 
                        00152-01 97 07-1
 
 
        Для реализации режимов передач данных  с  буферизацией
 
   аппаратура адаптеров построена так, что буферизация  данных
 
   возможна только при обращении к последовательно увеличиваю-
 
   щимся адресам. Благодаря специальному режиму работы,  адап-
 
   теры общей шины могут также обращаться к произвольным  дан-
 
   ным, выравненным в границах двойного слова. Для этого драй-
 
   веры должны удовлетворять следующим двум правилам:
 
 
        - при передачи данных через буферизованные пути данных
 
   должен осуществляться только с последовательно  увеличиваю-
 
   щимися адресами;
 
 
        - при обращении к данным, выравненным по границе длин-
 
   ного слова, должен быть установлен бит разрешения доступа к
 
   длиному слову /LONGWORD ACCESS ENABLE - LWAE/.
 
 
        Когда внешнее устройство общей шины начинает  передачу
 
   по прямому доступу к памяти, помещае адрес на  общую  шину,
 
   отображение адаптера  не  только  осуществляет  отображение
 
   адреса, но и содержит номер  пути  данных.  Каждый  регистр
 
   отображения адаптера общей шины содержит поле, которое опи-
 
   сывает режим передачи. Наличие в этом  поле  нуля  означает
 
   прямой путь данных, другие пути - буферизованные пути  дан-
 
   ных.
 
 
        Передача данных по прямому доступу осушествляется сле-
 
   дующим образом:
 
 
        1) устройство передает адрес на общую шину;
 
 
        2) адаптер общей шины определяет регистр  отображения,
 
   который соответствует адресу;
 
 
                            - 109 -
 
                        00152-01 97 07-1
 
 
        3) адаптер общей шины проверяет, установлен ли в  дан-
 
   ном регистре бит достоверности;
 
 
        4) адаптер общей шины преобразует адрес шины  в  номер
 
   физической страницы;
 
 
        5) адаптер определяет по  регистру  отображения  номер
 
   пути данных, который должен быть использован для передачи;
 
 
        6) в зависимости от пути данных,  функцие  общей  шины
 
   преобразуется в функцию внутренней шины  процессора,  путем
 
   считывания управляющих линий общей шины;
 
 
        7) в зависимости от типа операции, указанной на  общей
 
   шине /DATI, DATIP, DATO  или  DATOB/,  адаптер  общей  шины
 
   запускает соответствующцю операцию общей шины и  внутренней
 
   шины процессора для передачи данных к или от  данного  уст-
 
   ройства.
 
 
 
        4.2.1.1. Режим прямой передачи
 
 
 
        Прямой путь данных так  как  для  каждой  передачи  по
 
   общей шине в этом режиме используется соответствующая пере-
 
   дача по внутренней шине процессора, в один и тот же  период
 
   времени может производится передача с несколькими устройст-
 
   вами общей шине. При одновременном поступлении запросов  на
 
   передачу данных для  устройств  адаптер  выполняет  функцию
 
   арбитража. Драйвер устройства не  оказывает  на  выполнение
 
   этой функции никакого влияния.
 
 
        Режим прямой путь данных медленнее, чем с буферизован-
 
   ные пути данных, так как одной посылке данных по общей шине
 
 
 
                            - 110 -
 
                        00152-01 97 07-1
 
 
   соответствует одна посылка по внутренней  шине  процессора.
 
   Следовательно прямой путь данных не может выполнять переда-
 
   чи слова данных по нечетному физическому адресу.  Программа
 
   FDT для устройств прямого доступа должна проверить находят-
 
   ся ли передаваемые данные на границе слова.
 
 
        УстройствA общей шины,  используют  обмен  по  прямому
 
   пути данных для того, чтобы выполнить следующие функции:
 
 
        - выполнить  последовательность  DATIP-DATO/DATOB  для
 
   внутренней шины процессора;
 
 
        - передавать данные по произвольно упорядоченным адре-
 
   сам в место последовательно увеличивающимися адресами;
 
 
        - чередовать функций чтения и записи.
 
 
        Прямой путь данных наиболее прост  для  программирова-
 
   ния. В этом режиме может быть  запущено  одновременно  нес-
 
   колько пересылок, а драйверу не нужно назначать номер  пути
 
   данных. После загрузки регистров отображения  драйвер  ини-
 
   циализирует передачу, установливая соответствующие  разряды
 
   регистров управления устройства.  Последовательность  прог-
 
   раммирования в этом режиме следующая:
 
 
        1) определить набор регистров отображения;
 
 
        2) загрузить регистры отображения номерами  физических
 
   страниц  и  номером  пути  данных  (/0  для  режима  прямой
 
   передачи/);
 
 
        3) установить разряд достоверности в  каждом  регистре
 
   отображение из выделенного набора,  при  этом  в  регистре,
 
   следующем за последним регистром отображение в данном набо-
 
 
                            - 111 -
 
                        00152-01 97 07-1
 
 
   ре, разряд достоверности должен быть очищен;
 
 
        4) загрузить начальный адрес передачи данных  в  соот-
 
   ветствующий регистр устройства;
 
 
        5) загрузить число  передаваемых  слов  или  байтов  в
 
   соответствующий регистр устройства;
 
 
        6) инициализировать передачу  данных  путем  установки
 
   соответствующих разрядов регистра управления  данного  уст-
 
   ройства.
 
 
        Первые  три  шага   выполнит   операционная   система.
 
   Форк-процесс драйвера просто вызывает программы МОС ВП  для
 
   выделения и загрузки регистров отображения.
 
 
 
        4.2.1.2. Буферизованные пути данных
 
 
 
        В отличие от прямого пути данных  буферизованные  пути
 
   данных осуществляет передачу данных более эффектно. За счет
 
   разделения передач между общей  шиной  и  внутренней  шиной
 
   процессора. В этом режиме в буфере адаптера может  накапли-
 
   ваться несколько слов данных при операциях чтения или запи-
 
   си, т.е. в этом режиме одной передаче данных по  внутренней
 
   шине может соответствовать несколько передач по общей шине.
 
 
        Преимущество этого режима заключается в следующим:
 
 
        - быстрая передача данных блоков  по  прямому  доступу
 
   памяти по последовательно увеличивающимся адресам;
 
 
        - передача блоков слов, которые начинаются и кончаются
 
   на нечетных адресах памяти /т.е. На границах байтов/; заме-
 
 
                            - 112 -
 
                        00152-01 97 07-1
 
 
   тим при этом, что в этом случае передача данных будет  про-
 
   ходить более медленно, так как для  передачи  одного  слова
 
   адаптеру потребуется выполнить несколько передач;
 
 
        - передача 32-разрядных данных из  произвольных  физи-
 
   ческих адресов, выравненных по границе двойного слова.
 
 
        Буферизованный  путь  данных  не  может  быть  активен
 
   более, чем с одним устройством в каждый данный момент  вре-
 
   мени. Когда форк-процесс драйвера готовится к передаче дан-
 
   ных по буферизованному пути данных, он запрашивает  свобод-
 
   ный номер пути данных и набор регистров отображения.  Соот-
 
   ветствующие  программы  ввода/вывода  операционной  системы
 
   записывает номер выделенного пути данных в каждый из назна-
 
   ченных регистров отображения.
 
 
        Режим передачи по буферизованному  пути  данных  имеет
 
   следующие ограничения:
 
 
        - все адреса блоке передачи должны быть последователь-
 
   но увеличивающимися адресами;
 
 
        - все передачи внутри блока должны быть одного и  того
 
   же типа (DATI или DATO/DATOB).
 
 
        Буферизованный путь данных накапливает данные,  посту-
 
   пающие с общей шины, в буфере (кроме режима передачи в гра-
 
   ницах длинного слова). Затем адаптер  общей  шины  передает
 
   содержимое этого буфера по соответствующим физическим адре-
 
   сам в течение одного цикла передачи по внутренней шине про-
 
   цессора. Процедура записи информации, поступающей из  общей
 
   шины, состоит из следующих действий:
 
 
 
 
                            - 113 -
 
                        00152-01 97 07-1
 
 
        1) устройство общей шины передает одно слово данных  в
 
   буферизованный путь данных;
 
 
        2) переданное слово данных запоминается в буфере адап-
 
   тера и цикл передачи по общей шине на этом завершается;
 
 
        3) устанавливается признак, указывающий, что буфер  не
 
   пустой и содержит данные, годные для записи в память;
 
 
        4) повторяются первые три действия до  тех  пор,  пока
 
   буфер не заполнится;
 
 
        5) после передачи последнего байта или последнего сло-
 
   ва в буфер данных адаптер зафиксирует завершение цикла сбо-
 
   ра данных;
 
 
        6)  буферизованный  путь  данных  запрошивает  функцию
 
   записи внутренней шины процессора  для  записи  содержимого
 
   буфера в оперативную память;
 
 
        7) когда передача  содержимого  буфера  по  внутренней
 
   шине процессора завершится буферизованный путь данных, очи-
 
   щается признак заполняемости буфера, и с этого момента счи-
 
   тается, что буфер не содержит данных для записи в память.
 
 
        Процедура чтения информации из памяти для ее  дальней-
 
   шей передачи на общую шину зависит от типа адаптеров  общей
 
   шины. Некоторые  типы  адаптеров  могут  выполнять  функцию
 
   предварительного чтения информации, другие - нет.  Драйверы
 
   работают  одинаково  с  разными  адаптерами.  Разнотипность
 
   адаптеров может сказаться только  на  системной  производи-
 
   тельности.
 
 
 
                            - 114 -
 
                        00152-01 97 07-1
 
 
        Далее мы рассмотрим операцию чтения  с  учетом  и  без
 
   учета функции предварительной выборки.
 
 
        Предварительно выборка информации осуществляет  запол-
 
   нение буфера автоматически после того, как  его  содержимое
 
   передано на общую шину. Эта функция повышает быстродействие
 
   операции чтения информации из памяти в общую шину. Последо-
 
   вательность шагов, выполняемая при этой операции следующая:
 
 
        1) устройство общей шины начинает выполнение  операции
 
   чтения;
 
 
        2) буферизованный путь данных проверяет,  содержит  ли
 
   буфер достоверные данные, предназначенные для  передачи  на
 
   шину;
 
 
        3) если таковых нет,  то  буферизованный  путь  данных
 
   инициирует  операцию  чтения  из  памяти,  чтобы  заполнить
 
   буфер. Пока  производится  заполнение  буфера,  адаптер  не
 
   начинает передачу данных на общую шину;
 
 
        4) затем производится передача запрашиваемых байтов на
 
   общую шину. Байты данных, которые не были переданы, остают-
 
   ся в буфере;
 
 
        5) для указания того, что в буфере находится достовер-
 
   ные данные для передачи на  шину,  устанавливается  признак
 
   "буфер не пустой";
 
 
        6) после того, как будет передано последнее слово дан-
 
   ных из буфера, признак "буфер  не  пустой"  очищается,  тем
 
   самым указывая, что буфер теперь  не  содержит  данных  для
 
   передачи;
 
 
 
                            - 115 -
 
                        00152-01 97 07-1
 
 
        7) буферизованный путь данных инициирует операцию чте-
 
   ния для предварительной  выборки  информации  из  памяти  в
 
   буфер;
 
 
        8) после  заполнения  буфера  опять  будет  установлен
 
   признак "буфер не пустой" для  указания,  что  буфер  снова
 
   содержит данные для передачи.
 
 
        Выполнение функции предварительной выборки может  при-
 
   вести к тому, что будет сделана попытка обратиться к  стра-
 
   нице физической памяти, которая имеет  больший  номер,  чем
 
   это указано в последнем регистре отображения.  Чтобы  избе-
 
   жать обращения в запрещенную область памяти, программы опе-
 
   рационной системы МОС ВП, которые ведают выделением  набора
 
   регистров отображения и  их  заполнением,  всегда  выделяют
 
   один дополнителный регистр отображения  и  устанавливают  в
 
   нем бит достоверности в  нулевое  состояние  перед  началом
 
   запуска операции чтения, тем  самым  указывая,  что  данные
 
   этой страницы не предназначены для передачи. Когда  адаптер
 
   во время предварительного  выборки  замечает,  что  регистр
 
   отображения содержит нулевой бит достоверности, то он прос-
 
   то прекращает эту  операцию  без  каких-либо  сообщений  об
 
   ошибке.
 
 
        Последовательность действий операции чтения без  пред-
 
   варительного чтения следующая:
 
 
        1) устройство общей шины инициализирует операцию  чте-
 
   ния;
 
 
        2) получив запрос с шины, адаптер проверяет,  содержит
 
   ли буфер информацию, предназначенную для передачи;
 
 
 
                            - 116 -
 
                        00152-01 97 07-1
 
 
        3) если буфер пустой, то производится чтение  информа-
 
   ции из памяти и заполнение буфера. Пока производится запол-
 
   нение буфера, адаптер не начинает передачу данных на  общую
 
   шину;
 
 
        4) производится передача запрошенных байтов  на  общую
 
   шину. Байты данных, которые не были  переданы,  остаются  в
 
   буфере.
 
 
 
        4.2.1.3. Передача данных со смещением на байт
 
 
 
        Некоторые устройства общей шины ограничены возможности
 
   передачи слов по адресам общей шины, выравненны по  границе
 
   слова. Буферизованные пути данных позволяет передавать бло-
 
   ки данных в память по адресам, которые  начинаются  и  кон-
 
   чаются по нечетным адресам. На такой режим передачи  указы-
 
   вает аппаратуре соответствующий разряд в регистре отображе-
 
   ния, который называется разрядом передачи со  смещением  на
 
   байт. Если этот разряд установлен, то аппаратура  инкремен-
 
   тирует физические адреса. Перед началом  передачи  подпрог-
 
   раммы системы МОС  ВП,  загружающие  регистры  отображения,
 
   определяют, в границах каких адресов  будет  осуществляться
 
   передача, и в зависимости от этого  устанавливают  или  нет
 
   этот разряд.
 
 
 
        4.2.1.4. Очистка буферизованных путей данных
 
 
 
        При выполнении  функции  предварительного  выборки  из
 
   памяти может быть считано данных больше, чем требуется уст-
 
   ройству. Кроме того, при операции записи после ее  заверше-
 
 
 
                            - 117 -
 
                        00152-01 97 07-1
 
 
   ния в буфере могут остаться данные. Для полного  завершения
 
   передачи драйвер должен очистить путь данных.
 
 
        Очистка данных гарантирует, что оставшиеся  информация
 
   не будет доступна  пользователю,  который  будет  следующим
 
   владеть этими путем данных. Процедура  очистки  выполняется
 
   путем вызова стандартных программ системы МОС  ВП,  которые
 
   выполняют две функции:
 
 
        - указывают аппаратуре адаптера  очистить  буфер.  При
 
   этом при операции чтения  адаптер  просто  очищает  признак
 
   "буфер не пустой", а при операции записи  адаптер  передает
 
   данные, оставшиеся в буфере,  в  память,  а  затем  очищает
 
   признак;
 
 
        - уведомляет драйвер о любой ошибке, которая  произой-
 
   дет во время очистки.
 
 
        Путь данных должен быть очищен до  того,  как  драйвер
 
   освободит регистры отображения или регистр  буферизованного
 
   пути данных.
 
 
 
        4.2.1.5. Режим произвольного доступа в  границах
 
                 32-разрядного длиного слова
 
 
 
        Другой метод передачи данных через буферизованный путь
 
   данных является режим произвольного доступа к  32-разрядным
 
   данным, выравненным по границе длиного  слова.  Этот  режим
 
   позволяет использовать буферизованный путь данных для  чте-
 
   ния данных из памяти или их записи память в границах длино-
 
   го слова по произвольным адресам.
 
 
 
 
                            - 118 -
 
                        00152-01 97 07-1
 
 
        Чтобы режим произвольного доступа  работал  правильно,
 
   буферизованный путь данных не  должны  повторно  адресовать
 
   одно и то же длиное слово. Например,  устройству  на  шине,
 
   которое должно получить одно длиное слово, в  процессе  его
 
   ожидания будут посылаться одни и те же данные.
 
 
        Для передачи данных  в  режиме  произвольного  доступа
 
   драйвер, устанавливает бит  разрешение  доступа  к  длиному
 
   слову (VECSV_LWAE) в блоке запроса канала (CRB) перед  заг-
 
   рузкой регистров отображения. После этого устройство  общей
 
   шины может выполнить операцию чтения  /DATI/  или  операцию
 
   записи /DATO/.
 
 
        При операции чтения выполняется  следующая  последова-
 
   тельность:
 
 
        1) драйвер инициализирует операцию чтения на устройст-
 
   ве общей шины;
 
 
        2) адаптер очищает признак "буфер не пустой"  в  соот-
 
   ветствующем буферизованном путь данных;
 
 
        3) адаптер запрашивает операцию чтения  информации  из
 
   физической памяти;
 
 
        4) адаптер запоминает  прочитанное  из  памяти  длиное
 
   слово в буфере и устанавливает признак "буфер не пустой";
 
 
        5) адаптер запускает  два  цикла  операции  чтения  на
 
   общей шине, чтобы передать два слова данных.
 
 
        При операции записи выполняется  следующая  последова-
 
   тельность:
 
 
 
 
                            - 119 -
 
                        00152-01 97 07-1
 
 
        1) драйвер инициализирует операцию записи на устройст-
 
   ве общей шины;
 
 
        2) адаптер очищает признак "буфер не пустой"  в  соот-
 
   ветствующем номере буферизованном пути данных;
 
 
        3) адаптер запускает  два  цикла  операции  записи  на
 
   общей шине, чтобы получить два слова данных  с  этого  уст-
 
   ройства;
 
 
        4) адаптер запоминает прочитанное за два цикла из шины
 
   длиное слово в путях данных с буферизацией и  устанавливает
 
   признак "буфер не пустой";
 
 
        5) адаптер запускает операцию записи  внутреннем  шины
 
   процессора;
 
 
        6) когда операция записи завершится,  адаптер  очищает
 
   признак "буфер не пустой".
 
 
 
        4.3. Адаптер    интерфейса    общей     шины
 
             вычислительного комплекса СМ1700
 
 
 
        Адаптер общей шины в процессоре вычислительного  комп-
 
   лекса СМ1700 имеет следующие аппаратные характеристики:
 
 
        - один прямой путь данных с обработкой передач со сме-
 
   щением на байт;
 
 
        - не имеет буферизованных путей данных;
 
 
        - внутренняя шина процессора  использует  24-разрядный
 
   физический адрес;
 
 
 
 
                            - 120 -
 
                        00152-01 97 07-1
 
 
        - 512 регистров отображения. Операционная система  мос
 
   вп использует из них только 496 регистров;
 
 
        - выполняет функцию обработки  прерывания  по  прямому
 
   вектору.
 
 
        На рис.12 показан формат регистра  преобразования  для
 
   адаптера общей шины вычислительного комплекса СМ1700.  Этот
 
   адаптер не использует регистр путей данных;  он  существует
 
   только для последующих разработок СМ1700  и  содержит  одни
 
   нули. Адаптер СМ1700 игнорирует любые данные, записанные  в
 
   этот регистр.
 
             Регистр отображения адаптера общей шины
 
 
 
   31   26 25       22 20              14                    0
   -----------------------------------------------------------
   I I   I  I  I     I  I               I    Номер           I
   I I   I  I  I MBZ I  I Не определены IФизической страницы I
   -----------------------------------------------------------
    I     I   I
   / \   / \ / \
    I     I   I
    I     I   I
    I     I   ----- Разряд смещения на байт;
    I     --------- Разряд разрешения доступа к длинному слову
    I
    --------------- Разряд достоверности.
 
 
                             Рис.12
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
                            - 121 -
 
                        00152-01 97 07-1
 
 
                5. ОБЗОР ОБРАБОТКИ ВВОДА/ВЫВОДА
 
 
 
 
        Обработка ввода/вывода  под  управлением  операционной
 
   системы происходит в трех основных фазах:
 
 
        - предобработка запроса ввода/вывода;
 
 
        - активизация устройства и последующая обработка  пре-
 
   рывания устройства;
 
 
        - постобработка ввода/выводA.
 
 
        Когда пользовательский процесс запрашивает ввод/вывод,
 
   управление  получает  системная  служба  очереди   запросов
 
   ввода/вывода. Системная служба  координирует  предобработку
 
   запроса ввода/вывода. Последняя драйверная  программа  FDT,
 
   вызванная системной службой очереди запросов  ввода/вывода,
 
   обращается к программе операционной системы,  которая  соз-
 
   дает  драйверный  форк-процесс  для  выполнения  драйверной
 
   программы начала  ввода/вывода;  она  является  программой,
 
   которая активизирует устройство. Когда передача  завершает-
 
   ся, устройство запрашивает прерывание, которое  приводит  к
 
   выполнению драйверной  программы  обслуживания  прерывания.
 
   Программа обслуживает  прерывание  и  запрашивает  создание
 
   форк-процесса драйвера для  выполнения  зависящей  от  уст-
 
   ройства постобработки ввода/вывода. После этого  драйверный
 
   форк-процесс передает управление системе для выполнения  не
 
   зависящей от устройства постобработки ввода/вывода. Иллюст-
 
   рирует последовательность событий.
 
 
        Последовательность выполнения драйвера:
 
 
 
 
                            - 122 -
 
                        00152-01 97 07-1
 
 
        1) контекст пользовательского процесса стек  пользова-
 
   теля:
 
 
        - пользовательский процесс выдает запрос QIO;
 
 
        2) контекст  пользовательского  процесса  стек  режима
 
   ядра:
 
 
        - системная   служба    очереди    запросов    очереди
 
   ввода/вывода выполняет не зависящую от устройства предобра-
 
   ботку ввода/вывода;
 
 
        - системная служба очереди запросов ввода/вывода вызы-
 
   вает драйверную программу FDT (или программы) для  выполне-
 
   ния зависящей от устройства предобработки;
 
 
        - последняя программа FDT  вызывает  программу  опера-
 
   ционной   системы   для   установки   в   очередь   запроса
 
   ввода/вывода и для создания драйверного форк-процесса;
 
 
        3) контекст форк-процесса стек прерывания:
 
 
        - будучи активизирован, драйверный форк-процесс испол-
 
   няет программу начала ввода/вывода;
 
 
        - программа начала ввода/вывода  получает  необходимые
 
   ресурсы (например, канала контроллера, регистров  отображе-
 
   ния UBA) и активизирует устройство;
 
 
        - программа начала  ввода/вывода  выдает  макрокоманду
 
   ожидания    прерывания    которая    сохраняет     контекст
 
   форк-процесса   и   приостанавливает    программу    начала
 
   ввода/вывода;
 
 
 
 
 
                            - 123 -
 
                        00152-01 97 07-1
 
 
        4) появляется прерывание, это запрашиваемое  устройст-
 
   вом. Контекст прерывания. Стек прерывания:
 
 
        - диспетчер прерывания активизирует программу обслужи-
 
   вания прерывания;
 
 
        - драйверная программа обслуживания прерывания обраба-
 
   тывает прерывание и передает управление драйверу  на  инст-
 
   рукцию, следующую за вызовом ожидания прерывания;
 
 
        - драйвер вызывает IOFORK, чтобы быть  перепланирован-
 
   ным на форк-IPL как форк-процесс;
 
 
        5) контекст форк-процесса. Стек прерывания:
 
 
        - будучи  перепланированным  в  форк-процесс,  драйвер
 
   выполняет остальную  часть  драйверной  программы,  которая
 
   выполняет зависящее от устройства завершение ввода/вывода;
 
 
        - после этого драйвер вызывает программу  операционной
 
   системы для выполнения не зависящей от устройства обработки
 
   по завершению ввода/вывода;
 
 
        6) контекст прерывания. Стек прерывания:
 
 
        - операционная система устанавливает AST режима ядра в
 
   очередь к  процессу,  который  первоначально  выдал  запрос
 
   ввода/вывода;
 
 
        7) контекст пользовательского  процесса.  Стек  режима
 
   ядра:
 
 
        - будучи запущенной, программа AST режима ядра  выпол-
 
   няется в контексте пользователя, выполняя чтение  данных  в
 
   пользовательский буфер  для  буферизованного  ввода/вывода,
 
 
                            - 124 -
 
                        00152-01 97 07-1
 
 
   передает конечное состояние и, если  требуется,  устанавли-
 
   вает в очередь AST пользовательского режима и  (или)  уста-
 
   навливает флажок события;
 
 
        8) Kонтекст пользовательского процесса. Стек пользова-
 
   теля:
 
 
        - выполнение AST пользовательского режима.
 
 
 
        5.1. Предобработка запроса ввода/вывода
 
 
 
        Системная служба очереди запросов ввода/вывода  выпол-
 
   няет  не  зависящую  от  устройства  предобработку  запроса
 
   ввода/вывода и вызывает драйверные программы FDT для выпол-
 
   нения предобработки, записывает  от  устройства.  Системная
 
   служба очереди запросов ввода/вывода выполняет предобработ-
 
   ку запроса ввода/вывода следующим образом:
 
 
        - проверяет, что запрашивающий процесс имеет назначен-
 
   ный для него канал ввода/вывода к целевому устройству;
 
 
        - определяет местоположение драйвера устройства в базе
 
   данных ввода/вывода;
 
 
        - проверяет достоверность кода функции ввода/вывода;
 
 
        - проверяет квоты процесса на запрос ввода/вывода;
 
 
        - утверждает блок состояния ввода/вывода;
 
 
        - выделяет    и    подгатавливает    пакет     запроса
 
   ввода/вывода;
 
 
        - вызывает драйверные программы FDT выполнения завися-
 
 
 
                            - 125 -
 
                        00152-01 97 07-1
 
 
   щей от устройства предобработки.
 
 
 
        5.1.1. Назначение канала ввода/вывода процессу
 
 
 
        Программа предобработки  запроса  ввода/вывода  прове-
 
   ряет,  указывается   ли   в   запросе   достоверный   канал
 
   ввода/вывода процесса. Номер канала  ввода/вывода  процесса
 
   является записью в поддерживаемой системной таблице процес-
 
   са, которая указывает путь от процесса к периферийному уст-
 
   ройству.
 
 
        Далее она идентифицирует целевое  устройство,  вызывая
 
   системную службу назначения канала ввода/вывода.  Системная
 
   служба назначения канала ввода/вывода  выполняет  следующие
 
   функции:
 
 
        - находит неиспользованную запись  в  таблице  каналов
 
   ввода/вывода процесса;
 
 
        - создает указатель на устройство в этой записи табли-
 
   цы для канала;
 
 
        - передает индексный номер канала в программу.
 
 
        Когда программа выдает запрос ввода/вывода,  системная
 
   программа обслуживания очереди запросов ввода/вывода прове-
 
   ряет, что указанный номер канала соединяется с  устройством
 
   и находит часть базы данных ввода/вывода, которая описывает
 
   устройство. Рис.13 иллюстрирует последовательность  опреде-
 
   ления целевого устройства.
 
 
 
 
 
 
 
                            - 126 -
 
                        00152-01 97 07-1
 
 
                 Определение целевого устройства
 
 
 
          Блоки
          управления
          каналом
          процесса (CCB)
          *************
          *           *
          *           *
          *           *
          *************
          *           *
          *           *
          *           *
          *************
          *           *
          *           *
          *           *
          *************
   Номер  *           *
   канала *           *        ***************
          *************        *             *
          * CCB$L_UCB *--------*             *
          *************        *             *
          *           *        * Блок        *
          *           *        * управления  *
          *************        * устройством *
          *           *        *   (UCB)     *
          *           *        *             *
          *           *        *             *
          *************        *             *
          *           *        *             *
          *           *        *             *
          *           *        ***************
 
 
                             Рис.13
 
 
 
        5.1.2. Нахождение драйвера устройства  в  базе
 
               данных ввода/вывода
 
 
 
        Используя информацию  UCB,  драйвер  может  обнаружить
 
   другие структуры данных ввода/вывода, относящиеся к данному
 
   устройству, включая:
 
 
        - блок запроса канала;
 
 
 
 
 
                            - 127 -
 
                        00152-01 97 07-1
 
 
        - блок диспетчеризации прерываний;
 
 
        - блок данных устройства.
 
 
        Блок запроса канала (CRB) и блок управления каналом  -
 
   совершенно отдельные структуры данных. Иногда полезно расс-
 
   матривать блок запроса канала как блок запроса контроллера,
 
   так как он описывает аппаратный контроллер. Блок управления
 
   каналом, с другой стороны,  описывает  логический  путь  от
 
   процесса до соответствующего блока управления устройством.
 
 
 
        5.1.2.1. Блок управления устройством (UCB)
 
 
 
        Номер  канала  процесса  косвенно  указывает  на  блок
 
   управления устройством для целевого устройства. Блок управ-
 
   ления устройством содержит первый указатель из цепочки ука-
 
   зателей на базу данных ввода/вывода. Эта цепочка указателей
 
   приводит к адресам драйверных таблиц и драйверных программ,
 
   которые управляют целевым устройством.
 
 
        Блок управления устройством,  описывающий  устройство,
 
   существует для каждого устройства в системе. Блок  управле-
 
   ния устройством  указывает  текущее  состояние  устройства,
 
   определяя следующую информацию:
 
 
        - является ли устройство активным;
 
 
        - какой из запросов ввода/вывода обрабатывается;
 
 
        - где размещаются буферы передачи.
 
 
        Так как драйверы выполняются как  форк-процессы  и  не
 
   могут использовать адресное пространство процесса для  хра-
 
 
 
                            - 128 -
 
                        00152-01 97 07-1
 
 
   нения дополнительного контекста,  для  временного  хранения
 
   данных во время обработки ввода/вывода драйверы  используют
 
   блоки управления устройствами. В разделе 7 поясняется,  как
 
   можно  зарезервировать  дополнительное  пространство  блока
 
   управления устройством для хранения данных или  драйверного
 
   контекста, зависящего от устройства.
 
 
        Блок управления устройством  также  содержит  контекст
 
   драйверного  форк-процесса,  когда  программы  ввода/вывода
 
   операционной системы приостанавливают форк-процесс в ожида-
 
   нии асинхронного события, такого как прерывание устройства.
 
 
 
        5.1.2.2. Блок запроса канала
 
 
 
        Все UCB устройств, присоединенных к  отдельному  конт-
 
   роллеру, содержат указатель на единый блок запроса  канала,
 
   который содержит следующую информацию:
 
 
        - код передачи управления драйверной программе  обслу-
 
   живания прерывания;
 
 
        - адреса драйверных программ инициализации  устройства
 
   и контроллера;
 
 
        - указатель  на  блок  диспетчеризации  прерывания,  в
 
   котором содержится дальнейшее описание контроллера.
 
 
        Контроллеры могут быть групповыми и выделенными. Выде-
 
   ленный контроллер имеет только одно устройство.  Операцион-
 
   ная система не использует блок запроса канала для синхрони-
 
   зации операций ввода/вывода на выделенном контроллере.  Тем
 
   не менее, блок запроса канала присутствует  и  используется
 
 
 
                            - 129 -
 
                        00152-01 97 07-1
 
 
   драйверами и операционной системой.
 
 
        Для арбитража ожидающих групповой контроллер  запросов
 
   операционная система использует специальное  поле  в  блоке
 
   запроса  канала.  Когда   система   разрешает   драйверному
 
   форк-процессу завладеть каналом данных группового  контрол-
 
   лера, форк-процесс инициирует операцию ввода/вывода на уст-
 
   ройстве, присоединенных к контроллеру.
 
 
        Блоки UCB для устройств, присоединенных  к  групповому
 
   контроллеру, содержат указатели на один и тот же блок  зап-
 
   роса канала. Это позволяет операционной  системе  управлять
 
   каналом. Данных контроллера. Рис.14 иллюстрирует  структуры
 
   данных, требуемые для описания трех устройств на  групповом
 
   контроллере.
 
 
        Структура данных для трех устройств на одном
 
                        контроллере
 
 
   *******      *******     *******
   * UCB *      * UCB *     * UCB *
   *******      *******     *******
      I            I           I
      I            I           I
      I         *******        I
      ----------* CRB *<--------
                *******
 
                             Рис.14
 
 
 
 
        5.1.2.3. Блок диспетчеризации прерывания (IDB)
 
 
 
        Блок запроса канала указывает также на блок  диспетче-
 
   ризации прерывания. База  данных  прерывания  содержит  три
 
   необходимых адреса структуры данных:
 
 
 
 
                            - 130 -
 
                        00152-01 97 07-1
 
 
        - адрес блока управления устройством  для  устройства,
 
   которое в настоящее время владеет каналом данных контролле-
 
   ра (если таковое устройство имеется);
 
 
        - адрес регистра команд и состояния (CSR); он является
 
   ключом для доступа к регистрам устройства;
 
 
        - адрес блока управления адаптером (ADR),  описывающий
 
   адаптер общей шины, к которому присоединен контроллер.
 
 
 
        5.1.2.4. Блок данных устройства (DDB)
 
 
 
        Все  UCB,  описывающие  устройства,  присоединенные  к
 
   одному контроллеру, содержат указателли на один блок данных
 
   устройства (DDB). Блок данных устройства содержит следующие
 
   поля, которые идентифицируют устройство и его драйвер:
 
 
        - характерное имя устройства/контроллера;
 
 
        - имя драйвера устройства,  получаемое  из  прологовой
 
   таблицы драйвера, см. раздел 7 и раздел 1 документа [3]  по
 
   использованию имени драйвера.
 
 
        Рис.15 иллюстрирует отношения между структурами данных
 
   ввода/вывода однотипных устройств,  подсоединенных  к  двум
 
   контроллерам.
 
 
        Устройства обоих контроллеров разделяют одни и  те  же
 
   драйверные программы.
 
 
 
 
 
 
 
 
 
 
                            - 131 -
 
                        00152-01 97 07-1
 
 
         База данных ввода/вывода для двух контроллеров
 
 
                *******
                * IDB *
                *******
                   I
                  / \
                   I
                   I
                *******
      --------->* CRB *<------
      I         *******      I
      I                      I
   *******                *******
   * UCB *                * UCB *
   *******                *******
      I                      I
      I                      I
      I         *******      I
      I         *     *<------    **************
      ----------* DDT *-----------* Драйвер    *
                *     *-----------* устройства *
                *******     ----->*            *
                  I  I      I     **************
                 / \ --------
                  I
                  I
                *******
                * UCB *
                *******
                   I
                   I
                   I
                *******
                * CRB *
                *******
                   I
                   I
                   I
                *******
                * IDB *
                *******
 
                             Рис.15
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
                            - 132 -
 
                        00152-01 97 07-1
 
 
        5.1.3. Проверка     достоверности      функции
 
               ввода/вывода
 
 
 
        Используя  структуры  данных  ввода/вывода,  системная
 
   программа обслуживания очереди запросов ввода/вывода  нахо-
 
   дит адрес драйверной таблицы выбора функций, следуя цепочке
 
   указателей,  начинающейся  в  UCB  целевого   для   запроса
 
   ввода/вывода устройства:
 
 
           UCB ---> DDT ---> FDT
 
 
        Затем системная служба использует данные таблицы реше-
 
   ния функций для  анализа  функции  ввода/вывода.  Системная
 
   служба  подтверждает,  что  функция,  указанная  в  запросе
 
   ввода/вывода, является действительной функцией для  данного
 
   устройства.
 
 
 
        5.1.4. Проверка  квот  процесса  для   запроса
 
               ввода/вывода
 
 
 
        Системная  программа  обслуживания  очереди   запросов
 
   ввода/вывода проверяет,  не  вызовет  ли  подготовленный  к
 
   выполнению запрос ввода/вывода превышения квоты процесса на
 
   выполнение    запросов    прямого    или    буферизованного
 
   ввода/вывода. Если процесс остается в пределах квоты,  сис-
 
   темная  служба  позволяет  ему   продолжить   предобработку
 
   ввода/выводA.
 
 
        Если квота превышена,системная программа  обслуживания
 
   очереди запросов ввода/вывода проверяет свой флажок  ожида-
 
   ния ресурса. Если флажок сброшен, системная служба  прекра-
 
 
 
                            - 133 -
 
                        00152-01 97 07-1
 
 
   щает обслуживание запроса ввода/вывода.
 
 
        Если флажок установлен, процесс помещается в состояние
 
   ожидания до тех пор, пока он не опустится ниже определенной
 
   квоты; в этот момент системная программа $QIO  модифицирует
 
   квоты процесса в соответствии с запрошенной операцией.
 
 
 
        5.1.5. Проверка  доступа  к  блоку   состояния
 
               ввода/вывода
 
 
 
        Если в запрос ввода/вывода указан четырехсловный  блок
 
   состояния ввода/вывода для приема  информации  о  состоянии
 
   завершения ввода/вывода, системная  программа  обслуживания
 
   очереди запросов ввода/вывода определяет, имеет ли процесс,
 
   выдавший запрос, доступ по записи к ячейкам указанного бло-
 
   ка состояния. Если процесс имеет доступ по записи,  систем-
 
   ная служба заполняет это квадрослово нулями.  Если  процесс
 
   не имеет доступа  по  записи,  системная  служба  завершает
 
   обработку запроса с индикацией ошибочного состояния.
 
 
 
        5.1.6. Выделение и подготовка  пакета  запроса
 
               ввода/вывода
 
 
 
        Если проверка достоверности  запроса  ввода/вывода  до
 
   данного места выполнилось успешно, системная программа обс-
 
   луживания очереди запросов  ввода/вывода  резервирует  блок
 
   нестраничной   системной   памяти   для   хранения   пакета
 
   ввода/вывода.
 
 
        Перед выделением пакета запроса ввода/вывода системная
 
   служба повышает аппаратный  уровень  приоритета  прерывания
 
 
                            - 134 -
 
                        00152-01 97 07-1
 
 
   процессора до IPL_ASTDEL, чтобы заблокировать любую  другую
 
   асинхронную деятельность  в  процессе.  Новый  приоритетный
 
   уровень предотвращает возможное окончание процесса; оконча-
 
   ние процесса может привести к потере операционной  системой
 
   связи с системной памяью,  выделенной  для  пакета  запроса
 
   ввода/вывода.
 
 
        Системное обслуживание очереди  запросов  ввода/вывода
 
   пытается разместить  пакет  запроса  по  связанному  списку
 
   предварительно     распределенных     пакетов      запросов
 
   ввода/вывода. Если таких пакетов не существует, эта  служба
 
   вызывает другую  программу  операционной  системы,  которая
 
   выделяет пакет запроса ввода/вывода  в  нестраничном  пуле.
 
   Эта программа синхронизируется с остальной  системой  таким
 
   образом, что она может зарезервировать необходимую память.
 
 
        Системная  программа  обслуживания  очереди   запросов
 
   ввода/вывода продолжает предобработку ввода/вывода, внося в
 
   пакет следующую информацию, описывающую запрос:
 
 
        - размер в байтах пакета запроса ввода/вывода;
 
 
        - поле типа, идентифицирующее блок как  пакет  запроса
 
   ввода/вывода;
 
 
        - режим   доступа   процесса    во    время    запроса
 
   ввода/вывода;
 
 
        - идентификатор запрашивающего процесса;
 
 
        - адрес программы AST и ее параметр, если  это  указы-
 
   вается в запросе ввода/вывода;
 
 
 
 
 
                            - 135 -
 
                        00152-01 97 07-1
 
 
        - адрес блока управления (если устройство имеет файло-
 
   вую структуру),  который  описывает  физическое  размещение
 
   части файла (блок управления окном);
 
 
        - адрес UCB целевого устройства;
 
 
        / код функции ввода-вывода; функции чтения или  записи
 
   виртуального блока заменяются их логическими  эквивалентами
 
   перед сохранением кода;
 
 
        - номер флажка события, который должен быть установлен
 
   при завершении обработки запроса ввода/вывода;
 
 
        - базовый программный приоритет запрашивающего процес-
 
   са;
 
 
        - адрес блока состояния ввода/вывода, если это  указы-
 
   вается в запросе ввода/вывода;
 
 
        - индексный номер канала ввода/вывода процесса;
 
 
        / флажок, индицирующий,  к  какому  типу  ввода-вывода
 
   (буферизованному или прямому) относится функция, определен-
 
   ная в запросе;
 
 
        - флажок, указывающий, является ли запрос ввода/вывода
 
   запросом на ввод;
 
 
        - флажок, указывающий, имеет ли процесс привилегии для
 
   выполнения    функций    логического    или     физического
 
   ввода/вывода;
 
 
        - флажок,    указывающий,    является    ли    функция
 
   ввода/вывода физической функцией;
 
 
 
 
                            - 136 -
 
                        00152-01 97 07-1
 
 
        - адрес и размер  диагностического  буфера  и  флажок,
 
   указывающий, что буфер существует, если такие данные указа-
 
   ны в запросе ввода/вывода;
 
 
        - если в запросе  ввода/вывода  указывается  программа
 
   AST, записывается флажок, указывающий, что  квота  процесса
 
   на использование AST была скорректирована.
 
 
        Запись этих полей в пакет запроса ввода/вывода  выпол-
 
   няется программой системного обслуживания очереди  запросов
 
   ввода/вывода по той причине, что эти поля содержат не зави-
 
   сящую от устройства информацию. Драйверные или общие  прог-
 
   раммы FDT операционной системы должны заносить в пакет зап-
 
   роса ту часть данных, которая зависит от устройства.
 
 
        В  документе  [3]  приводится  формат  пакета  запроса
 
   ввода/вывода.
 
 
 
        5.1.7. Обработка FDT
 
 
 
        Драйверная таблица выбора функций управляет  зависящей
 
   от устройства предобработкой запроса  ввода/вывода.  Рис.16
 
   иллюстрирует формат таблицы выбора функций.
 
 
 
 
 
                            - 137 -
 
                        00152-01 97 07-1
 
 
                Драйверная таблица выбора функций
 
 
 
                    **************************
                   /* действительные функции *
   2 длинных слова< * -  -  -  -  -  -  -  - *
                   \* ввода/вывода           *
                    **************************
                   /* функции                *
   2 длинных слова< * -  -  -  -  -  -  -  - *
                   \* буферизованного в/в    *
                    **************************
                   /*     64-разрядная       *
                  / * -  -  -  -  -  -  -  - *
   3 длинных слова  *        маска           *
                  \ * -  -  -  -  -  -  -  - *
                   \*    адрес программы     *
                    **************************
                   /*     64-разрядная       *
                  / * -  -  -  -  -  -  -  - *
   3 длинных слова  *        маска           *
                  \ * -  -  -  -  -  -  -  - *
                   \*    адрес программы     *
                    **************************
                    *                        *
                    *            .           *
                    *                        *
                    *            .           *
                    *                        *
                    *            .           *
                    *                        *
                    *            .           *
                    *                        *
 
                             Рис.16
 
 
 
        Код функции ввода/вывода, указанный в запросе, являет-
 
   ся 16-разрядной величиной, состоящей из двух полей:
 
 
        - 6-битный код функции ввода/вывода (биты 0-5);
 
 
        - 10-битный  модификатор  функции  ввода/вывода  (биты
 
   6-15).
 
 
        6-разрядное поле кода функции позволяет определить  64
 
   различных  кода  функции  вводA/вывода  для  каждого   типа
 
   устройствA. В разделе 7 рассмотрено, как  можно  определить
 
   эти коды функции.
 
 
                            - 138 -
 
                        00152-01 97 07-1
 
 
        Каждый драйвер определяет до 64 различных кодов  функ-
 
   ции ввода/вывода, первые две записи таблицы выбора  функций
 
   содержат по два длинных слова по  64  бита  каждая;  первая
 
   запись является битовой маской  всех  действительных  кодов
 
   функции ввода/вывода для устройства. Каждый  бит  представ-
 
   ляет отдельный код функции. Вторая запись является  битовой
 
   маской тех действительных кодов, которые являются функциями
 
   для буферизованного ввода/вывода. Системная программа ослу-
 
   живания очереди запросов ввода/вывода использует обе  бито-
 
   вые маски для определения действительности кода  функции  и
 
   должна ли операция  ввода/вывода  быть  буферизованной  или
 
   прямой.
 
 
        Остальные записи таблицы  выбора  функций  состоят  из
 
   трех длинных слов каждая. Два первых длинных слова образуют
 
   битовую маску кодов функций  ввода/вывода.  Третье  длинное
 
   слово    является    адресом    программы     предобработки
 
   ввода/вывода, которая должна быть  вызвана  для  тех  кодов
 
   функций ввода/вывода, для которых установлены биты  в  двух
 
   первых длинных словах данной записи.
 
 
        Системная  программа  обслуживания  очереди   запросов
 
   ввода/вывода использует значение шести младших  битов  кода
 
   функции для определения, какой из разрядов  следует  прове-
 
   рять в каждой битовой маске FDT. Таким  образом,  если  код
 
   функции имеет значение 22, системная служба проверяет  23-й
 
   разряд (имеет номер 22) каждой битовой маски.
 
 
        Некоторые программы предобработки,  которые  обеспечи-
 
   вают не зависящее от устройства обслуживание, входят в сос-
 
   тав операционно системы. В разделе  8  рассматриваются  эти
 
 
 
                            - 139 -
 
                        00152-01 97 07-1
 
 
   программы. Другая часть программ содержится  в  драйвере  и
 
   выполняет обслуживание, зависящее от устройства.
 
 
        Системная  программа  обслуживания  очереди   запросов
 
   ввода/вывода использует записи из трех длинных слов в  таб-
 
   лице выбора функций для вызова  программ  предобработки  из
 
   драйвера или системы следующим образом:
 
 
        - если в записи FDT  установлен  бит,  соответствующий
 
   значению кода  функции,  системная  программа  обслуживания
 
   очереди запросов вызывает относящуюся к нему программу пре-
 
   добработки, адрес которой находится в длинном  слове,  сле-
 
   дующим за битовой маской;
 
 
        - если бит, соответствующий коду функции ввода/вывода,
 
   не установлен,  системная  программа  обслуживания  очереди
 
   запросов ввода/вывода продвигается к битовой маске  следую-
 
   щей записи FDT повторяет предыдущий шаг;
 
 
        - когда программа предобработки  завершает  свою  дея-
 
   тельность, она либо возвращает управление системной службе,
 
   либо передает управление  программе  операционной  системы,
 
   которая устанавливает пакет запроса ввода/вывода в  очередь
 
   или оканчивает запрос;
 
 
        - если управление получает системная программа  обслу-
 
   живания очереди запросов  ввода/вывода,  программа  продви-
 
   гается на следующую запись FDT и повторяет первый шаг;
 
 
        - если вся предобработка функции ввода/вывода заверше-
 
   на, программа предобработки  не  возвращается  в  системную
 
   программу обслуживания очереди запросов ввода/вывода. Вмес-
 
   то этого, программа FDT передает управление другой програм-
 
 
                            - 140 -
 
                        00152-01 97 07-1
 
 
   ме  операционной  системы,  которая  устанавливает   запрос
 
   ввода/вывода  в  очередь  к  драйверной  программе   начала
 
   ввода/вывода или к программе операционной системы,  которая
 
   завершает или прекращает обслуживание запроса.
 
 
        Программы FDT, используемые в предобработке,  как  это
 
   показано на рис.17,  должны  заканчивать  просмотр  таблицы
 
   выбора функций системной  программой  обслуживания  очереди
 
   запросов ввода/вывода.
 

 
 
                            - 141 -
 
                        00152-01 97 07-1
 
 
            Программы FDT и преодработка ввода/вывода
 
                               *
                             *   *
   ****************       * Установ-*         ****************
   *QIO определяет*    *лен ли соответ-*  нет *Завершение за-*
   *значение кода *--*ствующий бит маске *----*проса и возв- *
   *функции       *    * действительных*      *рат к пользо- *
   ****************       * функций *         * вателю       *
                             *   *            ****************
                               *
                               I да
                     *************************
                     * Проверка для буферизо-*
                     * ванного ввода/вывода  *
                     *************************
                               I<-------------------
                               I<----------------  I
                     ***********************    I  I
                     * Перейти к следующей *    I  I
                     * записи              *    I  I
                     ***********************    I  I
                               I                I  I
                               *                I  I
                             *   *              I  I
   **************         * Установ-*           I  I
   * Вызов под- * Да   *лен ли соответ-*   Нет  I  I
   * программы  *<---*  ствующий бит в   *-------  I
   **************      *    записи     *           I
           I              *   FDT   *              I
           I                 *   *                 I
           I                   *                   I
   ********************************                I
   *Подпрограмма выполняет предоб-*                I
   *работку ввода/вывода и возвра-*                I
   * щает управление или делает   *                I
   * вызов для помещении пакета в *                I
   * очереди или для завершения   *                I
   * запроса                      *                I
   ********************************                I
           I возврат в QIO                         I
           I---------------------------------------I
           I-------------------------------
           I                              I
   ************************    ************************
   * Вызов программы      *    * Вызов программы      *
   * операционной системы *    * операционной системы *
   * для установки пакета *    *для окончания или пре-*
   * в очередь к драйверу *    * кращения ввода/вывода*
   ************************    ************************
 
                             Рис.17
 
 
 
 
 
 
 
 
 
                            - 142 -
 
                        00152-01 97 07-1
 
 
        Для каждого действительного  с  точки  зрения  данного
 
   устройства кода функции ввода/вывода одна запись FDT должна
 
   закончить предобработку функции.
 
 
        Программы FDT выполняются в полном контексте процесса,
 
   который  запросил  операцию  ввода/вывода.  Таким  образом,
 
   программы FDT могут получить доступ к виртуальному адресно-
 
   му пространству процесса. После завершения  всей  предобра-
 
   ботки программами  FDT,  остальная  обработка  ввода/вывода
 
   продолжается   в   ограниченном    контексте    драйверного
 
   форк-процесса или программой обслуживания прерывания.
 
 
 
        5.2. Управление деятельностью устройства
 
 
 
        Когда предобработка ввода/вывода закончена, но  опера-
 
   ция ввода/вывода еще не закончена, программа  FDT  передает
 
   управление программе  операционной  системы  для  установки
 
   пакета запроса ввода/вывода в очередь и арбитража  деятель-
 
   ности устройства. Арбитрирующая программа создает лишь один
 
   драйверный форк-процесс (в любом  промежутке  времени)  для
 
   каждого устройства системы. Один форк-процесс  обрабатывает
 
   один пакет запроса ввода/вывода.
 
 
 
        5.2.1. Создание  форк-процесса  драйвера   для
 
               начала ввода/вывода
 
 
 
        Программа  установки  в   очередь   пакетов   запросов
 
   ввода/вывода   определяет,   существует    ли    драйверный
 
   форк-процесс для целевого устройства следующим образом:
 
 
 
 
 
                            - 143 -
 
                        00152-01 97 07-1
 
 
        - если устройство свободно, для  этого  устройства  не
 
   существует драйверного форк-процесса; в этом  случае  прог-
 
   рамма установки пакетов в очередь немедленно создает  драй-
 
   верный  форк-процесс  для   выполнения   программы   начала
 
   ввода/вывода и передает ей управление;
 
 
        - если устройство занято,  для  этого  устройства  уже
 
   существует драйверный форк-процесс. В этом случае программа
 
   помещает пакет запроса ввода/вывода в очередь пакетов  зап-
 
   росов ввода/вывода, ожидающих устройство.  Программа  уста-
 
   навливает пакет в очередь в соответствии с базовым  приори-
 
   тетом инициатора запроса. Внутри каждого приоритета  пакеты
 
   размещаются в порядке обычной очереди (первым пришел - пер-
 
   вым обслужен).
 
 
        В этом  случае,  к  моменту,  когда  программа  начала
 
   ввода/вывода получает  управление  для  выбора  из  очереди
 
   пакета, контекст исходного пользовательского процесса более
 
   не является доступным. Драйвер должен работать в  редуциро-
 
   ванном контексте драйверного форк-процесса.  Так  как  кон-
 
   текст процесса,  инициировавшего  запрос  ввода/вывода,  не
 
   обеспечивается    для    драйверной    программы     начала
 
   ввода/вывода,  программа  операционной  системы  ,  которая
 
   устанавливает в очередь пакет запроса ввода/вывода,  всегда
 
   инициирует драйверную программу начала ввода/вывода в  кон-
 
   тексте,  который  соответствует  форк-процессу.  Драйверный
 
   форк-процесс состоит из трех (или менее)  регистров  и  PC.
 
   Программа установки в очередь пакета  запроса  ввода/вывода
 
   устанавливает этот контекст в следующем порядке:
 
 
        1)  поднимает  приоритетный  уровень  до   драйверного
 
 
 
                            - 144 -
 
                        00152-01 97 07-1
 
 
   форк-IPL;
 
 
        2) загружает адрес пакета запроса ввода/вывода в R3;
 
 
        3) загружает адрес UCB устройства в R5;
 
 
        4) передает управление на точку входа программы начала
 
   ввода/вывода, используя инструкцию JMP.
 
 
        Новый драйверный форк-процесс,  будучи  активизирован,
 
   выполняется при следующих ограничениях:
 
 
        - не может обращаться в адресное пространство  процес-
 
   са, запросившего ввод/вывод;
 
 
        - может свободно использовать только  регистры  R0-R5;
 
   остальные регистры перед использованием должен сохранять  и
 
   восстанавливать их перед возвратом;
 
 
        - должен приводить в порядок стек после использования;
 
   стек должен находится в  своем  исходном  состоянии,  когда
 
   форк-процесс уступает управление любой программе операцион-
 
   ной системы;
 
 
        - должен выполняться  на  приоритетных  уровнях  между
 
   драйверным форк-IPL и IPLS_POWER; не должен снижать приори-
 
   тетный уровень ниже форк-уровня, за исключением случая соз-
 
   дания форк-процесса более низкого уровня.
 
 
        Каждый драйверный  форк-процесс  используется  до  тех
 
   пор, пока не появится одно из следующих событий:
 
 
        - запрещена зависящая от устройства обработка  запроса
 
   ввода/вывода;
 
 
 
 
                            - 145 -
 
                        00152-01 97 07-1
 
 
        - разделяемый ресурс, необходимый  драйверу,  недосту-
 
   пен, как это рассматпивалось в подразделе 3.3;
 
 
        - деятельность  устройства  требует  от  форк-процесса
 
   ожидания прерывания от устройства.
 
 
 
        5.2.2. Активизация   устройства   и   ожидание
 
               прерывания
 
 
 
        Программа драйвера устройства для начала  ввода/вывода
 
   проверяет   пакет   запроса,   определяя    тип    операции
 
   ввода/вывода, которую нужно выполнить, и спецификации  зап-
 
   роса. В зависимости  от  типа  устройства,  поддерживаемого
 
   драйвером, программа начала ввода/вывода выполнит некоторые
 
   или все из следующих шагов:
 
 
        - анализирует функцию ввода/вывода и передает управле-
 
   ние той драйверной программе, которая подготавливает UCB  и
 
   устройство для выполнения требуемой операции;
 
 
        - копирует    содержимое    полей    пакета    запроса
 
   ввода/вывода в UCB;
 
 
        - просматривает поля в UCB для проверки,  является  ли
 
   устройство или том, смонтированный на устройстве, достовер-
 
   ным;
 
 
        - если устройство присоединено к групповому контролле-
 
   ру, добивается канала данных контроллера;
 
 
        - если операция ввода/вывода является передачей с пря-
 
   мым доступом к памяти, получает пути данных адаптера  общей
 
   шины и загружает его регистры отображения;
 
 
                            - 146 -
 
                        00152-01 97 07-1
 
 
        - загружает все необходимые  регистры  устройства,  за
 
   исключением регистра команд и состояния CSR;
 
 
        - повышает приоритетный уровень до IPLS_POWER и  убеж-
 
   дается, что не было сбоя питания, который  мог  бы  сделать
 
   операцию ввода/вывода недостоверной;
 
 
        - загружает CSR устройства для его активизации;
 
 
        - вызывает программу операционной системы для приоста-
 
   нова драйверного форк-процесса до появления прерывания  или
 
   тайм-аута устройства.
 
 
        Пока драйвер приостановлен, сохраненный для него  кон-
 
   текст состоит из UCB. Контекст содержит следующую  информа-
 
   цию:
 
 
        - описание запроса ввода/вывода и состояния  устройст-
 
   ва;
 
 
        - содержимое R3 и R4;
 
 
        - содержимое R5, рассматриваемое как адрес UCB;
 
 
        - драйверный адрес возврата;
 
 
        - адрес обработчика тайм-аута устройства;
 
 
        - время, по истечении которого в  устройстве  появится
 
   тайм-аут.
 
 
        По соглашению, R4 часто содержит адрес регистра команд
 
   и состояния, что позволяет драйверу считывать регистры уст-
 
   ройства.  Когда  драйверный  форк-процесс  вновь   получает
 
   управление после обработки прерывания,  R5  содержит  адрес
 
 
 
                            - 147 -
 
                        00152-01 97 07-1
 
 
   UCB; он является  ключом  к  остальной  части  базы  данных
 
   ввода/вывода, которая связана с текущей операцией.
 
 
 
        5.2.3. Обработка прерывания устройства
 
 
 
        Драйверная программа  начала  ввода/вывода  инициирует
 
   передачу и вызывает программу операционной системы для ожи-
 
   дания прерывания. Когда устройство запрашивает  прерывание,
 
   диспетчер прерывания передает управление  драйверной  прог-
 
   рамме обслуживания прерывания. Драйверная программа  обслу-
 
   живания  прерывания  прогоняется  на  высоком  приоритетном
 
   уровне прерывания, так что эта  программа  способна  быстро
 
   обслужить  прерывания.  Драйверная  программа  обслуживания
 
   прерывания обычно выполняет следующую обработку:
 
 
        - для группового контроллера определяет, какое из уст-
 
   ройств сформировало запрос прерывания;
 
 
        - проверяет UCB устройства, убеждаясь, что  драйверный
 
   форк-процесс ожидает прерывания;
 
 
        - сохраняет регистры устройства;
 
 
        - реактивизирует отложенный форк-процесс.
 
 
        Реактивизированный драйверный форк-процесс в интервале
 
   выполнения нескольких инструкций работает на высоком  прио-
 
   ритетном уровне программы  обслуживания  прерывания.  Затем
 
   драйвер понижает свой приоритет выполнения для того,  чтобы
 
   не блокировать следующие  прерывания  от  других  устройств
 
   системы.
 
 
 
 
 
                            - 148 -
 
                        00152-01 97 07-1
 
 
        5.2.4. Переключение  контекста  прерывания  на
 
               контекст форк-процесса
 
 
 
        Для понижения своего приоритета драйвер вызывает прог-
 
   рамму операционной системы для  помещения  форк-процесса  в
 
   очередь (IOFORK), которая выполняет следующие действия:
 
 
        - запрещает тайм-аут, который был указан  в  программе
 
   ожидания прерывания;
 
 
        - сохраняет регистры R3 и R4 (эти регистры  необходимы
 
   для выполнения форк-процесса);
 
 
        - сохраняет адрес инструкции,  следующей  за  запросом
 
   IOFORK, в форме-блоке UCB;
 
 
        - помещает адрес форк-длока UCB из R5  в  форк-очередь
 
   для драйверного форк-уровня;
 
 
        - возвращается  к  драйверной  программе  обслуживания
 
   прерывания.
 
 
        Программа обслуживания прерывания приводит  в  порядок
 
   стек, восстанавливает содержимое регистров и покидает  пре-
 
   рывание.    Рис.18    иллюстрирует    алгоритм     создания
 
   форк-процесса после прерывания устройства.
 
 
 
 
                            - 149 -
 
                        00152-01 97 07-1
 
 
        Алгоритм создания форк-процесса после прерывания
 
 
 
                       ****************
   **************      * Драйверная   *      ***********
   * Устройство *------* программа    * JSB  *         *
   * генерирует *  REI * обслуживания *------* Драйвер *
   * прерывание *<-----* прерывания   *      *         *
   **************      ****************      ***********
                               I                  I JSB
                              / \                 I
                               I                  I
                               I                  I
                               I                  I
                               I              **********
                               I    RSB       *        *
                               ---------------* IOFORK *
                                              *        *
                                              **********
 
                           Рис.18
 
 
 
 
        5.2.5. Активизация      форк-процесса       из
 
               форк-очереди
 
 
 
        Когда нет  ожидающего  аппаратного  прерывания,  схема
 
   процессора для арбитража (на основе приоритета) программных
 
   прерываний передает управление  форк-диспетчеру  програмных
 
   прерываний.  Когда  процессор   разрешает   прерывание   на
 
   форк-IPL, форк-диспетчер обрабатывает форк-очередь, которая
 
   относится к приоритетному уровню прерывания. Для этого дис-
 
   петчер выполняет следующие действия:
 
 
        - изымает драйверный форк-блок из форк-очереди;
 
 
        - восстанавливает контекст форк-процесса;
 
 
        - передает управление форк-процессу.
 
 
        Программа  драйвера  вызывает  программы  операционной
 
   системы, которые кодируют приостанов и возобновление  драй-
 
 
                            - 150 -
 
                        00152-01 97 07-1
 
 
   верных форк-процессов. Такое  соглашение  позволяет  опера-
 
   ционной системе своевременно обслужить аппаратные  прерыва-
 
   ния устройств и возобновить  драйверный  форк-процесс,  как
 
   только запросы устройств не требуют внимания.
 
 
        Когда  данный   форк-процесс   завершает   выполнение,
 
   форк-диспетчер  извлекает  следующую  запись,  если   такая

   имеется, из форк-очереди, восстанавливает контекст ее  про-
 
   цесса и реактивизирует форк-процесс. Эта последовательность
 
   повторяется, пока форк-очередь не опустеет.  Когда  очередь
 
   пуста, форк-диспетчер  восстанавливает  регистры  R0-R5  из
 
   стека и выходит из прерывания по инструкции REI.
 
 
        Рис.19    показывает     реактивизацию     драйверного
 
   форк-процесса.
 
 
 
 
                            - 151 -
 
                        00152-01 97 07-1
 
 
             Реактивизация драйверного форк-процесса
 
 
 
   ***************
   * Устройство  *
   * генерирует  *
   * прерывание  *
   ***************
         I
         I
         I
         I
   ***************                        ******************
   * Драйвер     *                        * Появляется     *
   * обслуживает *                        * программное    *
   * прерывание  *                        * прерывание     *
   ***************                        ******************
         I                                      I
         I                                      I
         I                                      I
         I                                      I
   ****************    понижение          ******************
   * Драйверный   *  IPL  до форк-уровня  * Форк-диспетчер *
   * форк-процесс *-----------------------* вызывает       *
   ****************                       * драйвер        *
         I                                ******************
         I                                      I
         I                                      I
         I                                      I
         I                                      I
   ***************                        ******************
   * Драйвер     *                        * Драйвер        *
   * выходит из  *                        * завершает      *
   * прерывания  *                        * обработку      *
   ***************                        * запроса        *
                                          ******************
                                                I
                                                I
                                                I
                                                I
                                          ******************
                                          * Форк-диспетчер *
                                          * выходит  из    *
                                          * прерывания     *
                                          ******************
 
                             Рис.19
 
 
 
 
 
 
 
 
 
 
 
 
 
                            - 152 -
 
                        00152-01 97 07-1
 
 
        5.3. Завершение запроса ввода/вывода
 
 
 
        Реактивизированный драйверный  форк-процесс  завершает
 
   запрос ввода/вывода следующим образом:
 
 
        1) освобождает драйверные  ресурсы,  которые  являются
 
   разделяемыми, такие  как  адаптер  и  регистры  отображения
 
   общей шины, канал данных контроллера;
 
 
        2) передает состояние в системную программу ,  которая
 
   завершает ввод/вывод.
 
 
        Чтобы стартовать  постобработку  запроса  ввода/вывода
 
   или начать обработку следующего запроса из очереди  к  уст-
 
   ройству, программа завершения ввода/вывода  выполняет  сле-
 
   дующие действия:
 
 
        1) пишет состояние возврата из драйвера в пакет запро-
 
   са ввода/вывода;
 
 
        2)  помещает  обработанный   запрос   ввода/вывода   в
 
   форк-очередь  постобработки  и  запрашивает  прерывание  на
 
   уровне IPLS_IOPOST;
 
 
        3) создает новый форк-процесс  для  следующего  пакета
 
   запроса из очереди ожидания  пакетов  запроса  ввода/вывода
 
   устройства;
 
 
        4) активизирует новый драйверный форк-процесс.
 
 
 
        5.3.1. Постобработка ввода/вывода
 
 
 
        Когда приоритет процессора падает ниже  IPL  постобра-
 
 
 
                            - 153 -
 
                        00152-01 97 07-1
 
 
   ботки ввода/вывода, процессор переходит на программу обслу-
 
   живания прерываний постобработки. Эта программа  операцион-
 
   ной системы завершает не зависящую от устройства  обработку
 
   запроса ввода/вывода.
 
 
        Используя  пакет  запроса  ввода/вывода  как  источник
 
   информации, диспетчер постобработки для каждого пакета зап-
 
   роса ввода/вывода из очереди постобработки  выполняет  сле-
 
   дующее:
 
 
        1) извлекает из очереди пакет запроса ввода/вывода;
 
 
        2) если функция задает прямой ввод/вывод, корректирует
 
   использование квоты прямого ввода/вывода процесса, выдавше-
 
   го запрос и разблокирует страницы, используемые в передаче;
 
 
        3) если функция задает буферизованный ввод/вывод, кор-
 
   ректирует использование квоты буферизованного  ввода/вывода
 
   процесса, выдавшего запрос,  и,  если  выполнялась  функция
 
   записи, освобождает системные  буфера,  использовавшиеся  в
 
   передаче;
 
 
        4) устанавливает флажок события,  связанный  с  данным
 
   запросом ввода/вывода;
 
 
        5) устанавливает в очередь к  процессу  программу  AST
 
   режима ядра (к процессу, который вызвал системную программу
 
   обслуживания очереди запросов ввода/вывода).
 
 
        Установка в очередь программы AST режима  ядра  позво-
 
   ляет выполнять постобработку ввода/вывода в контексте поль-
 
   зовательского процесса, но с привилегированным режимом дос-
 
   тупа. Контекст процесса необходим для передачи  результатов
 
 
 
                            - 154 -
 
                        00152-01 97 07-1
 
 
   операции ввода/вывода  в  адресное  пространство  процесса.
 
   Программа AST режима ядра пишет следующие данные в адресное
 
   пространство процесса:
 
 
        - данные,    считанные    операцией    буферизованного
 
   ввода/вывода;
 
 
        - содержимое диагностического буфера, если это указано
 
   в запросе ввода/вывода;
 
 
        - два длинных слова состояния ввода/вывода,  если  это
 
   указано в запросе ввода/вывода.
 
 
        Если в  запросе  ввода/вывода  указана  программа  AST
 
   режима пользователя, то программа AST режима ядра  помещает
 
   AST пользовательского режима в очередь к процессору.  Когда
 
   операционная система выдает AST режима  пользователя,  сис-
 
   темная программа извлекает пакет запроса ввода/вывода. Пер-
 
   вая часть этого пакета является блоком управления AST, зап-
 
   рошенного пользователем.
 
 
 
                            - 155 -
 
                        00152-01 97 07-1
 
 
                6. ОБРАЗЕЦ ДРАЙВЕРА ВВОДА/ВЫВОДА
 
 
 
 
        Драйверы устройств состоят из следующих частей:
 
 
        - статические таблицы;
 
 
        - программы, которые используют таблицу выбора функций
 
   (FDT) драйвера устройства;
 
 
        - программы, которые запускают  операцию  ввода/вывода
 
   на устройстве и завершают ее выполнение;
 
 
        - программы, которые обрабатывают прерывания;
 
 
        - программы, которые запрашивают  выделения  регистров
 
   отображения адаптера общей шины, а также пути данных;
 
 
        - программы, инициализирующие устройства и  контролле-
 
   ры;
 
 
        - программы, которые отменяют операцию ввода/вывода;
 
 
        - программы, которые регистрируют ошибки.
 
 
        Драйверы не обязательно нуждаются во всех  программах,
 
   указываемых в образце, а также не  обязаны  следовать  тому
 
   порядку драйверных программ и  таблиц,  которого  придержи-
 
   вается данный образец. Однако, операционная система МОС  ВП
 
   наложила некоторые  ограничения  на  порядок  и  содержимое
 
   программ и таблиц драйверов.
 
 
        Рис. 20 иллюстрирует организацию драйвера  устройства.
 
   Первым элементом драйвера является прологовая таблица драй-
 
   вера. Эта таблица должна быть первым сгенерированным  кодом
 
 
 
                            - 156 -
 
                        00152-01 97 07-1
 
 
   в драйвере. Порядок остальных таблиц и программ  изменяется
 
   от драйвера к драйверу. Последним оператором в каждом драй-
 
   вере, за исключением ассемблерной  директивы  .END,  должна
 
   быть метка, указывающая конец драйвера.  Адрес  этой  метки
 
   хранится в прологовой таблице драйвера. Процедура  загрузки
 
   драйвера использует этот адрес для вычисления размера драй-
 
   вера.
 
 
        Некоторые драйверы не содержат зависящих от устройства
 
   программ FDT. Другие драйверы нуждаются лишь в  минимальных
 
   процедурах инициализации. Каждый  драйвер  обычно  содержит
 
   статические   драйверные    таблицы,    программу    начала
 
   ввода/вывода и программу обслуживания прерывания.
 
 
 
 
                            - 157 -
 
                        00152-01 97 07-1
 
 
                 Организация драйвера устройства
 
 
                    ******************
                    *   Прологовая   *
                    *    таблица     *
                    *    драйвера    *
                    ******************
                    * Диспетчерская  *
                    *    таблица     *
                    *    драйвера    *
                    ******************
                    *    Таблица     *
                    *    выбора      *
                    *    функций     *
                    ******************
                    *                *
                    *                *
                    * Программы FDT  *
                    *                *
                    *                *
                    ******************
                    *                *
                    *                *
                    *    Программы   *
                    *    управления  *
                    *   устройствами *
                    *                *
                    *                *
                    ******************
                    *   Метка конца  *
                    *    драйвера    *
                    ******************
 
                         Рис. 20
 
 
 
        6.1. Соглашения по программированию
 
 
 
        Процедура загрузки  драйвера  загружает  драйвер  уст-
 
   ройства в блок  нестраничной  системной  памяти,  положение
 
   которого выбирается программами операционной системы, пред-
 
   назначенными для  распределения  памяти.  По  этой  причине
 
   драйвер  должен  содержать  только   позиционно-независимые
 
   программы.
 
 
        Система вызывает драйвер  устройства  повторно,  чтобы
 
   обработать  запросы  ввода/вывода  и  прерывания.  Зачастую
 
 
 
                            - 158 -
 
                        00152-01 97 07-1
 
 
   драйвер не успевает окончить одну операцию ввода/вывода,  а
 
   система уже передает  управление  драйверу  для  выполнения
 
   другой операции на новом устройстве. По этой причине  прог-
 
   рамма должна быть повторно входимой.
 
 
        Правила для написания позиционно-независимых и повтор-
 
   но входимых программ следующие:
 
 
        - переходы могут выполняться только  на  относительные
 
   адреса внутри драйвера и на глобальные адреса,  перечислен-
 
   ные  в  таблице  символических  имен  операционной  системы
 
   (SYS$SYSTEM:SYS.STB);
 
 
        - статические таблицы могут содержать  только  относи-
 
   тельные (внутри драйвера) адреса и глобальные адреса;
 
 
        - драйвер не может хранить временные данные в  локаль-
 
   ных драйверных таблицах для динамического контекста драйве-
 
   ра. Вся динамическая временная память должна быть организо-
 
   вана внутри UCB, относящегося к запросу ввода/вывода, или в
 
   блоке текущего запроса ввода/вывода;
 
 
        - драйвер   должен   обращаться    к    базе    данных
 
   ввода/вывода,  загружая  адрес  структуры  данных  в  общие
 
   регистры и используя адресацию со смещением  на  соответст-
 
   вующие поля структуры данных.
 
 
        Дополнительная информация о  позиционно-независимых  и
 
   повторно входимых программах приведено в документе [7].
 
 
        Накладываются также ограничения на использование драй-
 
   верами общих регистров и стека:
 
 
 
 
 
                            - 159 -
 
                        00152-01 97 07-1
 
 
        - программы FDT могут использовать R0-R2 и R9-R11  как
 
   доступные регистры.  Программы  могут  использовать  другие
 
   регистры, сохраняя их  содержимое  перед  использованием  и
 
   восстанавлиая его перед выходом из программы FDT;
 
 
        - все остальные программы драйвера могут  использовать
 
   в качестве доступных регистры от R0 до R5. При необходимос-
 
   ти, программы могут использовать и другие регистры,  сохра-
 
   няя и восстанавливая их, но использование регистров  подоб-
 
   ным образом не рекомендуется;
 
 
        - все драйверные программы могут использовать для вре-
 
   менного хранения стек, но при условии, что они восстанавли-
 
   вают его прежнее состояние  перед  вызовом  любых  программ
 
   операционной системы или перед выполнением инструкции RSB.
 
 
 
        6.2. Ограничения использования  пространства
 
             регистров устройств ввода/вывода
 
 
 
        Программист, пишущий  драйвер  устройства  общей  шины
 
   должен придерживаться следующих ограничений на  использова-
 
   ние регистров устройств:
 
 
        - драйверы всегда  должны  хранить  в  общем  регистре
 
   адрес регистра команд и состояния в общем регистре и  обра-
 
   щаться к регистрам устройства  косвенно  через  этот  общий
 
   регистр.
 
 
        Пример.
 
 
   ; смещения регистров устройства
 
   ;
 
 
 
                            - 160 -
 
                        00152-01 97 07-1
 
 
     LP_CSR = 0                      ; смещение CSR
 
     LP_DRB = 2                      ; смещение буфера адреса
 
     .
 
     .
 
     .
 
     MOVL   UCB$L_CRB(R5),R4         ; получить адрес CRB
 
     MOVL   CRB$L_INTD+VEC$L_IDB(R4),R4 ; получить адрес
 
     .                                  ; CSR устройства
 
     .
 
     .
 
     TSTW   LP_CSR(R4)               ; подключено ли устройств
 
                                     ; печати
 
 
        Пример указывает символические  смещения  (по  словам)
 
   для каждого регистра устройства и получение доступа к ним с
 
   использованием режима адресации со смещением от R4;
 
 
        - операнды в формате с плавающей запятой, двойной точ-
 
   ности, поля, очереди и четырехсловные  операнды  не  допус-
 
   каются в адресном пространстве ввода/вывода. Не допускаются
 
   также инструкции для получения позиции, размера, длины  или
 
   базы операнда из пространства ввода/вывода. Например, драй-
 
   вер не может использовать  инструкцию  обработки  поля  для
 
   проверки бита в регистре устройства;
 
 
        - драйвер не может использовать  инструкции  обработки
 
   строк;
 
 
        - драйверы могут использоть только  те  инструкции,  в
 
   которых указывается не более одного приемника для модифика-
 
   ции или записи. Приемник должен быть последним операндом;
 
 
 
 
                            - 161 -
 
                        00152-01 97 07-1
 
 
        - регистры устройств, подсоединенных к внутренней шине
 
   (например, регистры устройства адаптера общей шины) являют-
 
   ся двухсловными. Регистры устройств, подсоединенных к общей
 
   шине ориентированы на слово. Инструкции, которые обращаются
 
   к регистрам адаптера общей шины, должны  использовать  кон-
 
   текст двойных  (длинных)  слов.  Все  инструкции  драйвера,
 
   которые воздействуют  на  регистры  устройств  общей  шины,
 
   должны использовать контекст слова, если только регистр  не
 
   имеет байтовой адресации  (пример  инструкции  для  слов  -
 
   BISW, MOVW, ADDWZ);
 
 
        - инструкция,  которая   обращается   к   пространству
 
   ввода/вывода, не должна порождать  исключительных  ситуаций
 
   или подвергаться прерыванию. Если инструкция допускает пов-
 
   торное выполнение, она  будет  повторно  считывать  регистр
 
   устройства, что вызовет нежелательные  побочные  эффекты  в
 
   устройстве или потерю данных;
 
 
        - для доступа к пространству ввода/вывода  используйте
 
   инструкции:
 
 
            ADAWI                 MCOM(B,W,L)
 
            ADD(B,W,L)2           MFPR
 
            ADD(B,W,L)3           MNEG(B,W,L)
 
            ADWC                  MOV(B,W,L)
 
            BIC(B,W,L)2           MOVA(B,W,L)
 
            BIC(B,W,L)3           MOVAQ
 
            BICPSW                MOVPSL
 
            BIS(B,W,L)2           MOVZ(BW,BL,WL)
 
            BIS(B,W,L)3           MTPR
 
            BISPSL                PROBE(R,W)
 
 
 
                            - 162 -
 
                        00152-01 97 07-1
 
 
            BISPSW                PUSHA(B,W,L)
 
            BIT(B,W,L)            PUSHAQ
 
            CASE(B,W,L)           PUSHL
 
            CHM(K,E,S,U)          SBWC
 
            CLR(B,W,L)            SUB(B,W,L)2
 
            CMP(B,W,L)            SUB(B,W,L)3
 
            CVT(BW,BL,WB,         TST(B,W,L)
 
               WL,LB,LW)          XOR(B,W,L)2
 
            DEC(B,W,L)            XOR(B,W,L)3
 
            INC(B,W,L)
 
 
 
 
        Эти инструкции не являются прерываемыми,  если  только
 
   они не используют режим косвенной адресации с автоинкремен-
 
   том или какой-либо другой косвенный режим со смещением  для
 
   указания операнда.
 
 
 
                            - 163 -
 
                        00152-01 97 07-1
 
 
        6.3. Образец драйвера МОС ВП
 
 
 
      .TITLE  TDRIVER -  образец драйвера МОС ВП
 
 
 
   ;     этот модуль содержит план драйвера:
 
   ;      - модели драйверных таблиц;
 
   ;      - программы инициализации контроллера и устройства;
 
   ;      - программы FDT;
 
   ;       - программу начала ввода/вывода;
 
   ;      - программу обслуживания прерывания;
 
   ;      - программу отмены ввода/вывода;
 
   ;      - программу дампа регистров устройства.
 
      .SBTTL определения внешних и локальных символов
 
 
   ;
 
   ;внешние символы
 
   ;
 
             $CANDEF  ;коды причины отмены
 
             $CRBDEF  ;блок запроса канала(CRB)
 
             $DCDEF   ;классы и типы устройств
 
             $DDBDEF  ;блок данных устройства(DDB)
 
             $DEVDEF  ;характеристики устройства
 
             $DYNDEF  ;типы динамических структур данных
 
             $IDBDEF  ;блок диспетчеризации прерываний(IDB)
 
             $IODEF   ;коды функций ввода/вывода
 
             $IPLDEF  ;определения аппаратных IPL
 
             $IRPDEF  ;пакет запроса ввода/вывода
 
             $PCBDEF  ;смещение PCB
 
             $PRVDEF  ;определение привилегий
 
             $SSDEF   ;системные коды состояния
 
 
 
                            - 164 -
 
                        00152-01 97 07-1
 
 
             $UCBDEF  ;блок управления устройством (UCB)
 
             $VADDEF  ;определение биртуальных адресов
 
             $VECDEF  ;блок вектора прерывания
 
   ;
 
   ; локальные символы
 
   ;
 
   ; смещения списка аргументов (АР) для зависящих от
 
   ; устройства параметров QIO
 
 
 
   Р1 = 0                   ; первый параметр QIO
 
   Р2 = 4                   ; второй параметр QIO
 
   Р3 = 8                   ; третий параметр QIO
 
   Р4 = 12                  ; четвертый параметр QIO
 
   Р5 = 16                  ; пятый параметр QIO
 
   Р6 = 20                  ; шестой параметр QIO
 
   ;
 
   ; другие константы
 
   TD_DEF_BUFSIZ  = 1024 ;размер буфера по умолчанию
 
   TD_TIMEOUT_SEC = 10   ;десятисекундный таймаут устройства
 
   TD_NUM_REGS    = 4    ;устройство имеет четыре регистра
 
   ;
 
   ; определения полей, следующих за стандартными полями UCB
 
   ;
 
           $DEFINI UCB               ;начало определений UCB
 
           .=UCB$K_LENGTH            ;позиция конца UCB
 
   $DEF  UCB$W_TD_WORD     .BLKW 1   ;шаблонное слово
 
   $DEF  UCB$W_TD_STATUS   .BLKW 1   ;CSR устройства
 
   $DEF  UCB$W_TD_WRDCNT   .BLKW 1   ;регистр счета слов
 
   $DEF  UCB$W_TD_BUFADR   .BLKW 1   ;регистр адреса буфера
 
   $DEF  UCB$W_TD_DATBUF   .BLKW 1   ;регистр буфера данных
 
 
                            - 165 -
 
                        00152-01 97 07-1
 
 
   $DEF  UCB$K_TD_UCBLEN   .BLKW 1   ;длна расширенного UCB
 
   ;
 
   ; позиции битов для зависящего от устройства поля состояния
 
   ; в UCB
 
   $VIELD  UCB,0,<-                 ;состоние устройства
 
           <BIT_ZERO,,M>,-          ;первый бит
 
           <BIT_ONE,,M>,-           ;второй бит
 
           >
 
   $DEFEND UCB                      ;конец определений UCB
 
   ;
 
   ; смещение регистров устройства относительно адреса CSR
 
   ;
 
             $DEFINI TD           ;начало определений
 
                                  ;состояния
 
   $DEF    TD_STATUS     .BLKW 1  ;регистр команд и состояния
 
   ; позиции битов регистра команд и состояния устройства
 
 
     _VIELD  TD_STS,0,<-
 
             <GO,,M>,-     ;запуск устройства
 
             <BIT1,,M>,-   ;первый бит
 
             <BIT2,,M>,-   ;второй бит
 
             <BIT3,,M>,-   ;третий бит
 
             <XBA,2,M>,-   ;биты расширения адреса
 
             <INTEN,,M>,-  ;разрешение прерываний
 
             <READY,,M>,-  ;устройство готово для команды
 
             <BIT8,,M>,-   ;восьмой бит
 
             <BIT9,,M>,-   ;девятый бит
 
             <BIT10,,M>,-  ;десятый бит
 
             <BIT11,,M>,-  ;одиннадцатый бит
 
             <,1>,-        ;не принимаемый во внимание бит
 
 
 
                            - 166 -
 
                        00152-01 97 07-1
 
 
             <ATTN,,M>,-   ;бит внимания
 
             <NEX,,M>,-    ;флажок несуществующей памяти
 
             <ERROR,,M>,-  ;ошибка или внешнее прерывание
 
         >
 
   $DEF  TD_WRDCNT  .BLKW 1  ;счетчик слов
 
   $DEF  TD_BUFADR  .BLKW 1  ;адрес буфера
 
   $DEF  TD_DATBUF  .BLKW 1  ;буфер данных
 
         $DEFEND TD          ;конец определений регистров
 
                             ;устройства.
 

 
 
                            - 167 -
 
                        00152-01 97 07-1
 
 
        .SBTTL  стандартные таблицы
 
   ; прологовая таблица драйвера
 
     DPTAB  _                           ;макрокоманда создания
 
                                        ; DPT
 
            END=TD_END,-                ;метка конца драйвера
 
            ADAPTER=UBA,-               ;тип адаптера
 
            UCBSIZE=<UCB$K_TD_UCBLEN>,- ;длина UCB
 
            NAME=TDDRIVER               ;имя драйвера
 
     DPT_STORE INIT                     ;начало загрузки
 
                                        ;таблицы инициализации
 
     DPT_STORE UCB,UCB$FIPL,B,8         ;форк-IPL устройства
 
     DPT_STORE UCB,UCB$B_DIPL,B,22      ;IPL прерывания  устр.
 
     DPT_STORE UCB,UCB$L_DEVCHAR,L,<-   ;характеристики  устр.
 
             DEV$M_IDV!-                ;  устройство ввода
 
             DEV$M_ODV>                 ;  устройство вывода
 
     DPT_STORE UCB,UCB$B_DEVCLASS,B,-   ;образец класса
 
             DC$_SCOM                   ;устройства
 
     DPT_STORE UCB,UCB$W_DEVBUFSIZ,W,-  ;размер буфера по
 
             TD_DEF_BUFSIZ              ;умолчанию
 
     DPT_STORE REINIT                   ;начало перезагрузки
 
                                        ;таблицы инициализации
 
     DPT_STORE DDB,DDB$L_DDT,D,TD$DDT   ;адрес DDТ
 
     DPT_STORE CRB,CRB$L_INTD+4,D,-     ;адрес программы об-
 
             TD INTERRUPT               ;служивания прерывания
 
     DPT_STORE CRB,-                    ;адрес программы ини-
 
             CRB$L_INTD+VEC$L_INITIAL,- ;циализации контрол-
 
             D,TD_CONTROL_INIT          ;лера
 
     DPT_STORE CRB,-                    ;адрес программы ини-
 
             CRB$L_INTD+VEC$L_UNITINIT,-;циализации устройства
 
             D,TD_UNIT_INIT
 
 
                            - 168 -
 
                        00152-01 97 07-1
 
 
     DPT_STORE END                      ;конец таблиц инициа-
 
                                        ;лизации
 
   ; диспетчерская таблица драйвера
 
     DDTAB  -                       ;макрокоманда создания
 
                                    ; DDT
 
            DEVNAM=TD,-             ;имя устройства
 
            START=TD_START,-        ;программа начала в/в
 
            FUNCTB=TD_FUNCTABLE,-   ;адрес FDT
 
            CANCEL=TD_CANCEL,-      ;программа отмены в/в
 
            REGDMP=TD_REG_DUMP      ;программа дампа регистров
 
 
 
   ; таблица выбора функций
 
   TD_FUNCTABLE:                     ;FDT для драйвера
 
             FUNCTAB ,-              ;допустимые функции в/в
 
                     <READVBLK,-     ;чтение виртуальное
 
                     READLBLK,-      ;чтение логическое
 
                     READPBLK,-      ;чтение физическое
 
                     WRITEVBLK,-     ;запись виртуальная
 
                     WRITELBLK,-     ;запись логическая
 
                     WRITEPBLK,-     ;запись физическая
 
                     SETMODE,-       ;установить режим устр.
 
                     SETCHAR>        ;установить характерис-
 
                                     ;тики устройства
 
             FUNCTAB ,               ;нет функции буфери-
 
                                     ;зованного ввода/вывода
 
            FUNCTAB +EXE$READ,-     ;программа FDT чтения для
 
                     <READVBLK,-     ;виртуального,
 
                     READLBLK,-      ;логического и
 
                     READPBLK>       ;физического чтения
 
             FUNCTAB +EXE$WRITE,-    ;программа FDT записи для
 
 
                            - 169 -
 
                        00152-01 97 07-1
 
 
                     <WRITEVBLK,-    ;виртуальной,
 
                     WRITELBLK,-     ;логической и
 
                     WRITEPBLK>      ;физической записи
 
             FUNCTAB +EXE$SETMODE,-  ;программа FDT установки
 
                     <SETCHAR,-      ;режима и характеристик
 
                     SETMODE>        ;устройства
 
 
 
                            - 170 -
 
                        00152-01 97 07-1
 
 
      .SBTTL  TD_CONTROL_INIT
 
   ;программа инициализации контроллера
 
   ;++
 
   ; TD_CONTROL_INIT, подготавливает контроллер для операций
 
   ; ввода/вывода
 
   ; функциональное описание:
 
   ;    операционная система вызывает эту программу в трех
 
   ;    случаях:
 
   ;       - при запуске системы;
 
   ;       - во время загрузки и перезагрузки драйвера;
 
   ;       - при восстановлении после сбоя питания.
 
   ; входные данные:
 
   ;    R4 - адрес CSR (регистр состояния контроллера)
 
   ;    R5 - адрес IDB (блок диспетчеризации прерывания)
 
   ;    R6 - адрес DDB (блок данных устройства)
 
   ;    R8 - адрес CRB (блок запроса канала)
 
   ; выходные данные:
 
   ;    программа должна предохранять все регистры, кроме
 
   ;    R0-R3.
 
   ; --
 
   TD_CONTROL INIT:          ;инициализация контроллера
 
                RSB          ;возвра
 
 
 
 
 
                            - 171 -
 
                        00152-01 97 07-1
 
 
        .SBTTL  TD_UNIT_INIT
 
   ;программа инициализации устройства
 
   ;++
 
   ; TD_UNIT_INIT, подготавливает устройство для операций
 
   ; ввода/вывода
 
   ; функциональное описание:
 
   ; операционнаая система вызывает эту программу после вызова
 
   ; программы инициализации контроллера:
 
   ;      - при запуске системы;
 
   ;      - во время загрузки драйвера;
 
   ;      - при восстановлении после сбоя питания.
 
   ; входные данные:
 
   ;    R4 - адрес CSR (регистр состояния контроллера)
 
   ;    R5 - адрес UCB (блок управления устройством)
 
   ; выходные данные:
 
   ;    программа должна сохранять все регистры,
 
   ;    кроме R0-R3.
 
   ; -- 
 
   TD_UNIT_INIT:                   ;инициализация устройства
 
             BISW  #UCB$M_ONLINE,  ;подключить устройство
 
                   UCB$W_STS(R5)   ;к системе
 
             RSB                   ;возврат
 

 
 
                            - 172 -
 
                        00152-01 97 07-1
 
 
        .SBTTL  TD_ROUTINE
 
   ;образец программы FDT
 
   ; ++
 
   ; TD_FDT_ROUTINE, образец программы FDT
 
   ; функциональное описание:
 
   ;    поставляется пользователем
 
   ; входные данные:
 
   ;    R0-R2  - рабочие регистры
 
   ;    R3     - адрес IRP (пакет запроса ввода/вывода)
 
   ;    R4     - адрес PCB (блок управления процессом)
 
   ;    R5     - адрес UCB (блок управления устройством)
 
   ;    R6     - адрес CCB (блок управления каналом)
 
   ;    R7     - номер бита кода функции ввода/вывода
 
   ;    R8     - адрес входа таблицы FDT для этой программы
 
   ;    R9-R11 - рабочие регистры
 
   ;    АР     - адрес первого функционально-зависимого
 
                 параметра QIO
 
   ;
 
   ; выходные данные:
 
   ;    программа должна сохранять все регистры, кроме
 
   ; R0-R2 и R9-R11.
 
   ; --
 
   TD_FDT_ROUTINE:          ; образец программы FDT
 
               RSB          ; возврат
 
 
 
                            - 173 -
 
                        00152-01 97 07-1
 
 
       .SBTTL  TD_START
 
   ;программа начала ввода/вывода
 
   ; ++
 
   ; TD_START - начать передачу, прием или операцию установки
 
   ; режима
 
   ; функциональное описание:
 
   ;    поставляется пользователем
 
   ; входные данные:
 
   ;    R3  -  адрес IRP (пакет запроса ввода/вывода)
 
   ;    R5  -  адрес UCB (блок управления устройством)
 
   ; выходные данные:
 
   ;    R0  -  первое двойное слово состояния ввода/вывода:
 
   ;           содержит код состояния и число переданных
 
   ;           байтов
 
   ;    R1  -  второе двойное слово состояниия ввода/вывода:
 
   ;           зависит от устройства
 
   ;    программа должна сохранять все регистры, кроме
 
   ;    R0-R2 и R4.
 
   ; --
 
   TD_START:               ; обработка пакета запроса
 
                           ; ввода/вывода
 
             WFIKPCH TD_TIMEOUT,#TD_TIMEOUT_SEC
 
   ; после успешного завершения передачи возвратить число
 
   ; переданных байтов и код состояния, соответствующий
 
   ; успешному выполнению.
 
           IOFORK
 
           INSV   UCB$W_BCNT(R5),#16,- ;загрузить число байтов
 
                 #16,R0                ;(переданных)
 
                                       ;в старшее слово R0.
 
           MOVW   #SS$_NORMAL,R0      ;загрузить код успешного
 
 
                            - 174 -
 
                        00152-01 97 07-1
 
 
                                      ;завершения в R0
 
   ; вызвать программу постобработки ввода/вывода.
 
   COMPLETE_I0:                    ;драйверная обработка
 
                                   ;закончена.
 
           REQCOM                  ;завершить ввод/вывод.
 
   ; обработка таймаута устройства; возврат кода состояния
 
   ; ошибки.
 
   TD_TIMEOUT:                     ;обработка таймаута
 
           SETIPL  UCB$B_FIPL(R5)  ;понизить до форк-IPL
 
                                   ;драйвера
 
           MOVZML  #SS$_TIMEOUT,R0 ;переслать состояние ошибки
 
           BR8     COMPLETE 10     ;вызвать постобработку
 
                                   ;ввода/вывода

 
 
 
                            - 175 -
 
                        00152-01 97 07-1
 
 
        .SBTTL  TD_INTERRUPT
 
   ;программа обслуживания прерывания
 
   ; ++
 
   ; TD_INTERRUPT, анализирует прерывания, обрабатывает
 
   ; ожидаемые прерывания
 
   ; функциональное описание:
 
   ; данная программа предусматривает один из двух вариантов:
 
   ;    - драйвер предназначен для контроллера
 
   ;      с одним устройством, а программа инициализации
 
   ;      устройства сохранила адрес UCB в IDB
 
   ;    - драйверная программа начала ввода/вывода завладела
 
   ;      каналом контроллера с помощью макрокоманды REQPCHANL
 
   ;      и затем использовала макрокоманду WFIKPCH для
 
   ;      сохранения канала на время ожидания прерывания.
 
   ; входные данные:
 
   ;    0 (SP)  - указатель на адрес IDB (блок диспетчеризации
 
   ;              прерываний)
 
   ;    4 (SP)  - сохраненный R0
 
   ;    8 (SP)  - сохраненный RI
 
   ;   12 (SP)  - сохраненный R2
 
   ;   16 (SP)  - сохраненный R3
 
   ;   20 (SP)  - сохраненный R4
 
   ;   24 (SP)  - сохраненный R5
 
   ;   28 (SP)  - сохраненное PSL (длинное слово состояния
 
   ;                               программы)
 
   ;   32 (SP)  - сохраненный PC
 
   ;    IDB содержит адрес CSR и адрес UCB.
 
   ; выходные данные:
 
   ;    программа должна сохранить все регистры, кроме R0-R5.
 
   ; --
 
 
                            - 176 -
 
                        00152-01 97 07-1
 
 
   TD_INTERRUPT:                   ;обслужить прерывание
 
                                   ;устройства.
 
           MOVL  @(SP)+,R4         ;получить адрес IDB и
 
                                   ;извлечь из стека ука-
 
                                   ;затель.
 
           MOVL  IDB$L_OWNER(R4),R5 ;получить адрес UCB вла-
 
                                   ;дельца устройства.
 
           MOVL  IDB$L_CSR(R4),R4  ;получить адрес CSR
 
           BBCC  #UCB$V_INT,-      ;если устройство
 
                 UCB$W_STS(R5),-   ;не ожидает прерывания,
 
                 UNSOL_INTERRUPT   ;отвергнуть его.
 
   ; прерывание является запланированным. Сохранить
 
   ; содержимое регистров устройства в UCB.
 
           MOVW  TD_STATUS(R4),-      ;сохранить CSR
 
                 UCB$W TD STATUS(R5)
 
           MOVW  TD_WRDCNT(R4),-      ;сохранить регистр
 
                 UCB$W_TD_WRDCNT(R5)  ;счетчика слов.
 
           MOVW  TD_WUFADR(R4),-      ;сохранить регистр
 
                 UCBSW_TD_BUFADR(R5)  ;адреса буфера.
 
           MOVW  TD_DATBUF(R4),-      ;сохранить буферный
 
                 UCB$W_TD_DATBUF(R5)  ;регистр данных.
 
   ; передать управление основной программе драйвера.
 
   RESTORE_DRIVER:                    ;перейти на основную
 
                                      ;прог. Драйвера.
 
           MOVL   UCB$L_FR3(R5),R3    ;восстановить R3 драйве-
 
                                      ;ра (используя MOVQ для
 
                                      ;восстанов. R3-R4).
 
           JSB    @UCB$L_FPC(R5)      ;вызвать драйвер по ад-
 
                                      ;ресу ожидания прерыва-
 
                                      ;ния.
 
 
                            - 177 -
 
                        00152-01 97 07-1
 
 
   ; отвергнуть незапланированное прерывание.
 
   UNSOL_INTERRUPT:
 
 
 
         POPR  #^M<R0,R1,R2,R3,R4,R5> ;восстановить R0-R5.
 
         REI                          ;возврат из прерывания.
 
 
 
 
                            - 178 -
 
                        00152-01 97 07-1
 
 
         .SBTTL  TD_CANCEL
 
   ; программа отмены ввода/вывода
 
   ;++
 
   ; TD_CANCEL, отменяет обрабатываемую операцию ввода/вывода
 
   ; функциональное описание:
 
   ; данная программа вызывает IOC$CANCELIO для установки
 
   ; бйта отмены в слове состояния UCB, если:
 
   ;   - устройство занято;
 
   ;   - идентификатор процесса IRP совпадает с индикатором
 
   ;   отменяемого процессора;
 
   ;   - KAнал IRP совпадает с каналом, в котором производится
 
   ;   если IOC$CANCELIO устанавливает бит отмены, то данная
 
   ; программа драйвера выполняет зависящее от устройства
 
   ; действие по отмене ввода/вывода.
 
   ; входные данные:
 
   ;   R2  - индексный номер канала
 
   ;   R3  - адрес текущего IRP (пакет запроса ввода/вывода)
 
   ;   R4  - адрес рсв (блока управления процессом) для про-
 
   ;         цесса, отменяющего ввод/вывод.
 
   ;   R5  - адрес UCB (блок управления устройством)
 
   ;   R8  - код причины отмены, один из следующих:
 
   ;         CAN$C_CANCEL,  если отмена выполняется
 
                            системными программами
 
   ;                        $CANCEL или $DALLOC
 
   ;         CAN$C_DASSGN,  если отмена выполняется
 
                            системной программой
 
   ;                        $DASSGN
 
   ; выходные данные:
 
   ;   программа должна сохранять все регистры кроме R0-R3.
 
   ;   программа может установить бит UCB$M_CANCEL в UCB$W_STS
 
 
                            - 179 -
 
                        00152-01 97 07-1
 
 
   ;--
 
   TD_CANCEL:                      ;отменить операцию ввода/
 
                                   ;вывода.
 
           JSB  G^IOC$CANCELIO     ;установить бит отмены,
 
                                   ;если нужно
 
           BBC  #UCB$V_CANCEL,-    ;если бит отмены не
 
                UCB$W_STS(R5)10$   ;установлен, то возврат
 
   ; далее выполняются зависящие от устройства операции отмены
 
   ; наконец, возврат.
 
   10$:     RSB                    ;возврат
 

 
 
 
                            - 180 -
 
                        00152-01 97 07-1
 
 
        .SBTTL  TD_REG_DUMP
 
   ; программа дампа регистров
 
   ;++
 
   ; TD_REG_DUMP, выполнить дамп содержимого регистра
 
   ; устройства в буфер
 
   ; функциональное описание:
 
   ;   записывает количество регистров устройства и их текущее
 
   ;   содержимое в буфер диагностики ошибки или буфер
 
   ;   регистрации ошибок;
 
   ; входные данные:
 
   ;   R0  - адрес выходного буфера (буфера вывода)
 
   ;   R4  - адрес CSR (регистр состояния контроллера)
 
   ;   R5  - адрес UCB (блока управления устройством)
 
   ; выходные данные:
 
   ;   программа должна сохранить все регистры, кроме
 
   ;   R1-R3.
 
   ;   выходной буфер содержит текущее содержимое регистров ус
 
   ;   ройства. R0 содержит адрес следующего пустого двойного
 
   ;   слова в буфере вывода.
 
 
   TD_REG_DUMP:
 
        MOVZBL  #TD_NUM_REGS(R0)+    ;сохранить к-во регистров
 
        MOVZWL  UCB$W_TD_STATUS(R5),-;сохранить регистр состо-
 
                (R0)+                ;яния
 
        MOVZWL  UCB$W_TD_WRDCNT(R5),-;сохранить регистр
 
                (R0)+                ;счетчика слов
 
        MOVZWL  UCB$W_TD_BUFADR(R5),-;сохранить регистр адреса
 
                (R0)+                ;буфера
 
        MOVZWL  UCB$W_TD_DATBUF(R5),-;сохранить буферный
 
                (R0)+                ;регистр данных
 
 
 
                            - 181 -
 
                        00152-01 97 07-1
 
 
        RSB                          ;возврат
 
        .SBTTL  TD_END
 
   ; конец драйвера
 
 
   ;++
 
   ; метка, отмечающая конец драйвера
 
   ;--
 
   TD_END:                          ;последняя ячейка драйвера
 
         .END
 
 
 
 
            7. НАПИСАНИЕ ТАБЛИЦ ДРАЙВЕРА УСТРОЙСТВА
 
 
 
 
        Каждый драйвер устройства  об'являет  три  статические
 
   таблицы, которые описывают устройство и драйвер:
 
 
        - прологовая таблица драйвера,  описывающая  тип  уст-
 
   ройства, имя драйвера и поля в  базе  данных  ввода/вывода,
 
   которые должны быть инициализированы во  время  загрузки  и
 
   перезагрузки драйвера;
 
 
        - диспетчерская таблица драйвера, которая  перечисляет
 
   некоторые точки входа в драйвер, которым операционная  сис-
 
   тема передает управление; блок  запроса  канала  и  таблица
 
   выбора функций перечисляют другие точки входа;
 
 
        - таблица выбора функций, которая перечисляет допусти-
 
   мые функции драйвера и точки  входа  в  программы,  которые
 
   выполняют предобработку ввода/вывода для каждой функции.
 
 
        Операционная система  МОС  ВП  содержит  макрокоманды,
 
   которые могут быть  использованы  драйверами  для  создания
 
 
 
                            - 182 -
 
                        00152-01 97 07-1
 
 
   статических таблиц; при описании отдельных таблиц  рассмат-
 
   риваются макрокоманды, используемые для создания этих  таб-
 
   лиц.  Все  макрокоманды,  рассмотренные  в  этом   разделе,
 
   являются макрокомандами ключевых слов, т.е., значения пара-
 
   метров могут быть выражены в формате:
 
 
        KEYWORD=значение-параметра
 
 
        Синтаксические правила для макрокоманд  ключевых  слов
 
   более детально описаны в документе [7].
 
 
 
        7.1. Прологовая таблица драйвера (DPT)
 
 
 
        Прологовая таблица драйвера является первым  элементом
 
   в каждом драйвере устройства. Эта таблица вместе с парамет-
 
   рами, указанными в команде SYSGEN, которая запрашивает заг-
 
   рузку драйвера, описывают драйвер  для  процедуры  загрузки
 
   драйвера.  В  свою  очередь,  процедура  загрузки  драйвера
 
   вычисляет размер драйвера,  загружает  его  в  нестраничную
 
   системную память и создает  управляющие  блоки  для  нового
 
   устройства (или устройств) в базе данных ввода/вывода. Раз-
 
   дел 14 описывает, как процедура загрузки  драйвера  решает,
 
   какие блоки управления построить для данного устройства.
 
 
        Драйверы устройств могут передать информацию инициали-
 
   зации блока управления процедуре  загрузки  драйвера  через
 
   значения, хранящиеся в прологовой таблице  драйвера.  Кроме
 
   того, процедура загрузки драйвера инициализирует  некоторые
 
   поля  внутри  блоков  управления  устройствами,   используя
 
   информацию из своих  собственных  таблиц.  Драйверы  должны
 
   рассматривать многие  поля,  инициализированные  процедурой
 
 
 
                            - 183 -
 
                        00152-01 97 07-1
 
 
   загрузки драйвера, как поля, которые можно только читать. В
 
   документе [3] эти поля помечаются звездочкой (*).
 
 
        Для создания проголовой таблицы, драйвер вызывает мак-
 
   романду DPTАВ, рассмотренную в п. 7.1.1.
 
 
        Расширение макрокоманды DPТАВ создает блок управления,
 
   который  используется  процедурой  загрузки  драйвера   при
 
   выполнении этой загрузки. Загрузочная  процедура  совместно
 
   загружает прологовую таблицу драйвера и драйвер в виртуаль-
 
   ную память. Процедура загрузки связывает также новую проло-
 
   говую таблицу драйвера со списком  прологовых  таблиц  всех
 
   драйверов, известных системе.
 
 
        Большинство драйверов устройств требуют  инициализации
 
   определенных полей базы данных ввода/вывода  специфическими
 
   для драйвера значениями. Посредством макрокоманды DPT_STORE
 
   драйвер передает свои требования по инициализации процедуре
 
   загрузки драйвера. Макрокоманда помещает информацию в  про-
 
   логовую таблицу драйвера, которая  используется  процедурой
 
   загрузки драйвера для помещения указанных значений  в  ука-
 
   занные поля. Макрокоманда допускает два списка полей:
 
 
        - поля, которые должны быть инициализированы при пост-
 
   роении блоков управления с использованием  команды  CONNECT
 
   (соединить) генерации  системы  (SYSGEN),  а  также,  когда
 
   драйвер перезагружается;
 
 
        - поля, которые должны  быть  инициализированы  только
 
   при перезагрузке драйвера с использованием  команды  RELOAD
 
   (перезагрузить) генерации системы (SYSGEN);
 
 
 
 
 
                            - 184 -
 
                        00152-01 97 07-1
 
 
        Макрокоманда DPТАВ сохраняет относительные адреса двух
 
   этих списков, называемых данными инициализации и  реинициа-
 
   лизации, в прологовой таблице драйвера. После  макрокоманды
 
   DPTАВ должен следовать список одного или более обращений  к
 
   макрокоманде DPT_STORE. Формат макрокоманды DPT_STORE расс-
 
   матривается в п. 7.1.2.
 
 
        Драйверы должны использовать макроманду DPT_STORE  для
 
   занесения исходных данных в следующие поля:
 
 
        UCB$B_FIPL     форк_IPL драйвера.
 
        UCB$B_DIPL     аппаратный IPL устройства.
 
        UCB$L_DEVCHAR  характеристики устройства
 
                       (см. Документ  [3] ).
 
 
        Драйвер должен также обеспечить реинициализацию данных
 
   для поля DDв$L_DDТ блока данных устройства и для любого  из
 
   следующих адресов программ в блоке запроса канала:
 
 
   DDB$L_DDT                 адрес диспетчерской таблицы драй-
 
                           вера.
 
   CRB$L_INTD+4              точка входа в драйверную програм-
 
                           му обслуживания прерывания, если
 
                           она существует.
 
   CRB$L_INTD+VEC$L_INITIAL  адрес программы инициализации кон
 
                           троллера, если она существует.
 
   CRB$L_INTD+VEC$L_UNITINIT адрес программы инициализации
 
                           устройства, если она существует.
 
                           Эта точка   входа  используется
 
                           устройствами общей шины.
 
 
 
 
 
 
                            - 185 -
 
                        00152-01 97 07-1
 
 
        7.1.1. Макрокоманда DPTAB
 
 
 
        Макрокоманда DPTAB создает прологовую таблицу  драйве-
 
   ра.
 
 
        Формат:
 
 
        DPTAB   END,ADAPTER,[FLAGS],UCBSIZE,[UNLOAD],
 
                [MAXUNITS],[DEFUNITS],[DELIVER],[VECTOR],NAME
 
 
   END    - адрес конца драйверного модуля.
 
 
   ADAPTER
 
          - тип адаптера:
 
 
             UBA  = адаптер общей шины;
 
             DR   = устройство DR;
 
             NULL = отсутствие допустимых устройств для драйве
 
 
   FLAGS  - флажки загрузчика драйвера:
 
 
   DPT$M_SVP
 
          - когда установлен,  то  указывает,  что  устройство
 
            требует постоянно назначенной системной  страницы.
 
            Этот флажок требует от процедуры загрузки драйвера
 
            назначить для устройства постоянную элемент табли-
 
            цы страниц  системы.  Виртуальный  адрес  элемента
 
            таблицы страниц системы записывается в  поле  сис-
 
            темной страницы блока UCB (UCB$L_SVPN) при  созда-
 
            нии этого блока. Дисковые драйверы используют этот
 
            элемент таблицы страниц во время коррекции  ошибок
 
            по ECC.
 
 
 
 
 
                            - 186 -
 
                        00152-01 97 07-1
 
 
   DPT$M_NOUNLOAD
 
          - будучи установлен, указывает, что драйвер не может
 
            перезагружаться. Чтобы перезагрузить  такой  драй-
 
            вер, необходима предварительная начальная загрузка
 
            системы.
 
 
   UCBSIZE
 
          - размер в байтах каждого UCB устройства. Этот аргу-
 
            мент обязателен. Это поле позволяет драйверам рас-
 
            ширять UCB для хранения данных, зависящих от  уст-
 
            ройства и описывающих операцию ввода/вывода.  Поля
 
            в части расширения UCB интерпретируются программа-
 
            ми драйвера и программами ECC  (коррекции  ошибок)
 
            операционной системы, размер расширения UCB разли-
 
            чен для каждого драйвера.
 
 
   UNLOAD - адрес программы,  вызываемой  перед  перезагрузкой
 
            драйвера. Процедура загрузки драйвера вызывает эту
 
            программу перед реинициализацией всех контроллеров
 
            и устройств, связанных с драйвером.
 
 
   MAXUNITS
 
          - максимальное число устройств на контроллере,  под-
 
            держиваемых данным драйвером. Это поле  влияет  на
 
            размер блока диспетчеризации прерывания, создавае-
 
            мого по команде (SYSGEN) CONNECT. Если это поле не
 
            используется, то  по  умолчанию  задается  8  уст-
 
            ройств. Вы можете подавить это поле, добавляя ква-
 
            лификатор /MAXUNIT к команде CONNECT.
 
 
   DEFUNITS
 
          - число устройств, создаваемых по умолчанию для каж-
 
 
                            - 187 -
 
                        00152-01 97 07-1
 
 
            дого контроллера, который обрабатывается по коман-
 
            де SYSGEN AUTOCONFIGURE от имени данного драйвера.
 
            Число создаваемых  устройств  может  находиться  в
 
            границах от нуля до DEFUNITS (числа  устройств  по
 
            умолчанию) без единицы. Если  аргумент  DELIVER  в
 
            макрокоманде DPTAB опущен,  команда  AUTOCONFIGURE
 
            создает число устройств, указанных в рассматривае-
 
            мом аргументе (число устройств по умолчанию). Если
 
            же аргумент DELIVER присутствует, то  он  называет
 
            имя программы доставки  устройств,  которая  вызы-
 
            вается  командой  AUTOCONFIGURE  для  определения,
 
            создавать ли каждое устройство автоматически.
 
 
   DELIVER
 
          - адрес программы доставки устройств, которая  вызы-
 
            вается AUTOCONFIGURE, чтобы определить,  какие  из
 
            устройств автоматически включаются в  конфигурацию
 
            для группового контроллера, поддерживаемого данным
 
            драйвером.
 
 
   VECTOR - адрес специфического для драйвера вектора  переда-
 
            чи. Использование этого аргумента резервируется.
 
 
   NAME   - имя модуля драйвера устройства. Процедура загрузки
 
            драйвера разрешает загрузить лишь одну копию драй-
 
            вера, связанного с именем, указанном в этом  поле.
 
            По соглашению имя драйвера формируется присоедине-
 
            нием строки DRIVER к двухбуквенному  характеристи-
 
            ческому имени устройства, например, DBDRIVER.
 
 
 
 
 
 
 
                            - 188 -
 
                        00152-01 97 07-1
 
 
        7.1.2. Макрокоманда DPT_STORE
 
 
 
        Макрокоманда DPT_STORE либо об'являет метку  на  языке
 
   ассемблера, либо описывает поля, которые должны инициализи-
 
   роваться. Когда эта макрокоманда об'являет метку, она имеет
 
   формат 1. В альтернативном случае макрокоманда имеет формат
 
   2.
 
 
        Формат 1:
 
 
        DPT_STORE  имя-метки
 
 
   имя-метки
 
          - имя-метки,  которая  должна  быть  об'явлена.  Оно
 
            может быть одним из следующих:
 
 
         INIT  указывает начало полей, которые должны ини-
 
               циализироваться при загрузке драйвера;
 
         REINIT указывает начало дополнительных полей для
 
                инициализации, когда драйвер загружается
 
                или перезагружается;
 
         END    указывает конец этих двух списков.
 
 
        Формат 2:
 
 
        Dрт_STORE  струк.-тип, струк.-смещение, операция,
 
                   выражение, [позиция], [размер]
 
 
   струк.-тип
 
          - тип блока управления  базой  данных  ввода/вывода,
 
            который содержит инициализируемое поле. Тип  может
 
            быть одним из:
 
 
 
 
 
                            - 189 -
 
                        00152-01 97 07-1
 
 
        DDB  блок данных устройства;
 
        UCB  блок управления устройством;
 
        CRB  блок запроса канала;
 
        IDB  блок диспетчеризации прерывания.
 
 
   Струк.-смещение
 
          - беззнаковое смещение в блоке управления. Процедура
 
            загрузки драйвера  может  инициализировать  только
 
            256 первых байтов каждой структуры  данных.  Прог-
 
            раммы инициализации устройства и контроллера могут
 
            инициализировать дополнительные поля данных.
 
 
   Операция
 
          - тип операции, которая должна быть выполнена. Типа-
 
            ми могут быть:
 
 
        B  записать значение байта;
 
        W  записать значение слова;
 
        L  записать значение двойного слова;
 
        D  записать адрес относительного драйвера;
 
        V  записать битовое поле.
 
       Операция V берет следующее двойное слово данных, а
 
       также аргументы позиции и размера, в качестве операндов
 
       инструкции INSV.
 
       Знак @, предшествующий параметру операции, указывает,
 
       что следующий за ним параметр выражения является адре-
 
       сом данных для инициализации.
 
 
   Выражение
 
          - это выражение, которое  должно  быть  сохранено  в
 
            блоке управления или,  перед  параметром  операции
 
            указывается знак @, то это адрес выражения. Напри-
 
 
                            - 190 -
 
                        00152-01 97 07-1
 
 
            мер, следующая макрокоманда указывает, что  DEVICE
 
            CHAR является адресом данных, которые должны  быть
 
            записаны в поле DEVCHAR блока UCB:
 
 
            DPT_STORE UCB,UCB$L_DEVCHAR,@L,DEVICE_CHARS
 
 
   позиция
 
          - начальная позиция  бита  внутри  указанного  поля.
 
            Этот параметр указывается только для операций V.
 
 
   Размер - число битов  в  поле.  Этот  параметр  указывается
 
            только для операций V.
 
 
        Следующий пример использует макрокоманду DPTAB и  мак-
 
   рокоманды DPT_STORE для описания драйвера устройства и  его
 
   базы данных.
 
 
        Пример.
 
 
                                      ;определить DPT
 
   DPTAB    END=XX_END,-              ;конец драйвера
 
            ADAPTER=UBA,-             ;тип адаптера
 
            UCBSIZE=UCB$K_XX_LENGTH,- ;размер UCB
 
            NAME=XXDRIVER             ;имя драйвера модуля
 
      DPT_STORE INIT                  ;начало инициализируе-
 
                                      ;мых значений блока
 
                                      ;управления
 
      DPT_STORE UCB,UCB$B_FIPL,B,8    ;драйверный форк-IPL
 
      DPT_STORE UCB,UCB$L_DEVCHAR,L,- ;характеристики УВВ:
 
                <DEV$M_REC-          ;ориентированное на запис
 
                !DEV$M_AVL_           ;доступное
 
                !DEV$M_ODV>           ;устройство вывода
 
      DPT_STORE UCB,UCB$B_DEVCLASS,B,-;класс устройства
 
 
                            - 191 -
 
                        00152-01 97 07-1
 
 
                DC$_XX
 
      DPT_STORE UCB,UCB$B_DEVTYPE,B,- ;тип устройства
 
                XX$_XL78
 
      DPT_STORE UCB,UCB$W_DEVBUFSIZ,  ;размер буфера по
 
                W,132                 ;умолчанию
 
      DPT_STORE UCB,UCB$B_DIPL,B,22   ;IPL устройства
 
      DPT_STORE REINIT                ;начало реинициализиру-
 
                                      ;емых величин блока упр.
 
      DPT_STORE CRB,CRB$L_INTD+4,D,-  ;адрес программы обслу-
 
                XX_INTERRUPT          ;живания прерывания
 
      DPT_STORE CRB,CRB$L_INTD+VEC$L_UNITINIT,- ;адрес прогр.
 
                D,XX_XL78_INIT        ;инициализации устройств
 
      DPT_STORE DDB,DDB$L_DDT,D,-     ;адрес диспетчерской
 
                XX$DDT                ;таблицы драйвера
 
      DPT_STORE END                   ;конец поля инициализ.
 
 
 
        7.2. Диспетчерская таблица драйвера (DDT)
 
 
 
        В диспетчерской таблице драйвера перечислены некоторые
 
   точки входа в драйверные программы, которые вызываются опе-
 
   рационной системой для обработки ввода/вывода. Каждый драй-
 
   вер должен  создать  диспетчерскую  таблицу.  Перечисленные
 
   программы могут размещаться в драйверном модуле или в моду-
 
   ле операционной системы. Не зависящие от  устройства  прог-
 
   раммы операционной системы, которые могут  быть  указаны  в
 
   драйвере, рассматриваются  в  документе  [3].  Операционной
 
   системы, которые могут быть указаны.  Программы,  зависящие
 
   от устройства, обычно размещаются в драйверном модуле. Дис-
 
   петчерская  таблица  драйвера  содержит  относительные  для
 
   программ, размещенных в  драйверном  модуле,  и  абсолютные
 
 
                            - 192 -
 
                        00152-01 97 07-1
 
 
   адреса программ, расположенных в операционной  системе.  Во
 
   время загрузки процедура загрузки драйвера заменяет относи-
 
   тельные адреса драйверных программ абсолютными адресами.
 
 
        Драйвер создает диспетчерскую таблицу, используя  мак-
 
   рокоманду DDTAB.  Процедура  загрузки  драйвера  записывает
 
   адрес этой таблицы, в соответствии с указанием  в  макроко-
 
   манде DPT_STORE, в блок данных устройства.
 
 
 
        7.2.1. Макрокоманда DDTAB
 
 
 
        Макрокоманда DDTAB создает диспетчерскую таблицу драй-
 
   вера. Эта таблица имеет метку  DEVPAM$DDT.  Непосредственно
 
   предшествуя таблице, DDTAB генерирует драйверную  программ-
 
   ную секцию следующей директивой:
 
 
                 .PSECT $$$115_DRIVER
 
 
        Формат:
 
 
      DDTAB DEVNAM,START,[UNSOLIC],FUNCTB,[CANCEL],[REGDMP],
 
            [DIAGBF],[ERLGBF],[UNITINIT],[ALTSTART],[MNTVER],
 
            [CLONEDUCB]
 
 
   DEVNAM - характерное имя  устройства,  управляемого  данным
 
            драйвером.
 
 
   START  - адрес драйверной программы начала ввода/вывода.
 
 
   UNSOLIC
 
          - адрес программы, которая обслуживает  незапланиро-
 
            ванные прерывания от устройства. Это поле резерви-
 
            ровано.
 
 
 
                            - 193 -
 
                        00152-01 97 07-1
 
 
   FUNCTB - адрес таблицы выбора функций для данного драйвера.
 
 
   CANCEL - адрес     программы     аннулирования     операции
 
            ввода/вывода.
 
 
   REGDMP - адрес программы, которая выполняет дамп  регистров
 
            устройства в буфер регистрации ошибок или в  буфер
 
            диагностики.
 
 
   DIAGBF - длина (в байтах) диагностического буфера,  исполь-
 
            зуемого для данного устройства.
 
 
   ERLGBF - длина  (в  байтах)  буфера   регистрации   ошибок,
 
            используемого для данного устройства.
 
 
   UNITINIT
 
          - адрес программы инициализации устройства, если этA
 
            программа существует. Драйверы  общей  шины  могут
 
            также использовать поле CRB$INTD+VEC$L_UNITINIT.
 
 
   ALTSTART
 
          - адрес     альтернативной     программы      начала
 
            ввода/вывода. Для  иницииализации  этой  программы
 
            используется программа МОС ВП EXE$ALTQUEPKT вместо
 
            EXE$QIODRVPKT.
 
 
   MNTVER - адрес  программы  операционной  системы,   которая
 
            вызывается в начале и  конце  проверки  установки.
 
            Если программа не указывается, вызывается програм-
 
            ма IOC$MNTVER.
 
 
   CLONEDUCB
 
          - адрес  программы  операционной  системы,   которая
 
            вызывается системным сервисом $ASSIGN.
 
 
                            - 194 -
 
                        00152-01 97 07-1
 
 
        Макрокоманда DDтав пишет  адрес  программы  IOC$RETURN
 
   операционной системы в поля адресов программ (в диспетчерс-
 
   кой таблице драйвера), которые не заданы в вызове  макроко-
 
   манды (запись не выполняется только для аргумента  проверки
 
   монтирования). Программа  IOC$RETURN  выполняет  инструкцию
 
   RSB; дополнительная информация приведена в документе [3].
 
 
        Чтобы указать, что данная  программа  является  частью
 
   операционной системы, в макрокоманде DDTAB в  соответствую-
 
   щем аргументе адресу системной программы предшествует  знак
 
   (+).
 
 
        Пропуск требующегося знака плюса является частой ошиб-
 
   кой в драйвере.
 
 
        Пример.
 
 
   DDTAB  DEVNAM=XX,-          ;диспетчерская таблица драйвера
 
          START=STARTIO,-      ;операция начала ввода/вывода
 
          FUNCTB=FUNCTABLE,-   ;таблица выбора функций
 
          CANCEL=+IOC$CANCELIO ;отменить ввод/вывод
 
 
 
        7.3. Таблица выбора функций (FDT)
 
 
 
        В таблице выбора функций  перечисляются  коды  функций
 
   ввода/вывода, которые являются допустимыми для данного уст-
 
   ройства; указывается, являются ли функции функциями буфери-
 
   зованного ввода/вывода; указываются программы для  выполне-
 
   нияс предобработки для отдельных  функций.  Каждый  драйвер
 
   устройства должен создать эту таблицу, содержащую  три  или
 
   более записей:
 
 
 
 
                            - 195 -
 
                        00152-01 97 07-1
 
 
        - список допустимых кодов функций ввода/вывода;
 
 
        - список кодов функций буферизованного ввода/вывода;
 
 
        - одна или более записей, каждая из которых - множест-
 
   во или подмножество  кодов  функций  ввода/вывода  и  адрес
 
   программы, которая выполняет предобработку ввода/вывода для
 
   этих кодов функций.
 
 
        Если для устройства не определяются функции  буферизо-
 
   ванного ввода/вывода, вторая запись содержит пустой список.
 
 
        Взятые вместе, записи от 3-ей до  последней  в  данной
 
   таблице указывают одну или более программс FDT для  каждого
 
   допустимого кода функции устройства. Программы  FDT  должны
 
   завершать предобработку ввода/вывода для каждого типа функ-
 
   ции посредством передачи управления из системной  программы
 
   обслуживания очереди  запросов  ввода/вывода  в  программу,
 
   которая помещает пакет запроса  ввода/вывода  в  очерель  к
 
   драйверу, устанавливает пакет запроса ввода/вывода  в  оче-
 
   редь на постобработку или аварийно  завершает  обслуживание
 
   запроса ввода/вывода.
 
 
        Информациия по написанию программ FDT приведена в раз-
 
   деле 8.
 
 
        В  табл.  2  перечислены   коды   допустимых   функций
 
   ввода/вывода, которые наиболее часто используются в таблице
 
   выбора функций. Полный перечень кодов функций содержится  в
 
   макрокоманде $IODEF в SYS$LIBRARY:STARLET.MLB.
 
 
 
 
 
 
 
 
                            - 196 -
 
                        00152-01 97 07-1
 
 
        7.3.1. Определение       кодов        функций,
 
               специфических для устройства
 
 
 
        Определить коды функций специфических  для  устройства
 
   можно приравнивая имя специфической для устройства  функции
 
   к имени функции, которая не относится к устройству. Выбран-
 
   ные коды, однако, должны иметь тип (логический,  физический
 
   или  виртуальный),  соответствующий  функции,  которую  они
 
   представляют. Например, в  ассемблерной  программе  опреде-
 
   ляютсяс три специфических для  устройства  кода  физических
 
   функций ввода/вывода:
 
 
   IO$_STARTCLOCK=IO$_ERASETAPE ;включить аппаратные часы
 
   IO$_STOPCLOCK=IO$_OFFSET     ;остановить аппаратные часы
 
   IO$_STARTDATA=IO$_SPACEFILE  ;начать получение данных
 
 
 
                                                     Таблица 2
         Коды допустмимых функций ввода/вывода в МОС ВП
 
   -----------------------------------------------------------
                                   I
           Тип  функции            I  Определение кодов
                                   I
   -----------------------------------------------------------
    Физические коды IO$_AVAILABLE    Установить устройство
                                     доступно (требуется для
                                     всех дисковых драйверов)
                    IO$_DIAGNOSE     Диагностика
                    IO$_DRVCLR       Сброс в приводе
                    IO$_ERASETAPE    Стереть ленту
                    IO$_NOP          Отсутствие операции
                    IO$_OFFSET       Сместить головки чтения
                    IO$_PACKACK      Опознание пакета
                    IO$_READHEAD     Читать заголовок и
                                     данные
                    IO$_READPBLK     Читать физический блок
                    IO$_READPRESET   Читать по предустановке
                    IO$_READTRACKD   Читать дорожку данных
                    IO$_RECAL        Перекалибровать механизм
                    IO$_RELEASE      Освободить вход(порт)
                    IO$_RETCENTER    Вернуться на центральную
                                     линию
                    IO$_SEARCH       Искать сектор
                    IO$_SEEK         Искать цилиндр
 
 
                            - 197 -
 
                        00152-01 97 07-1
 
 
                                           Продолжение табл. 2
   -----------------------------------------------------------
                                   I
           Тип  функции            I  Определение кодов
                                   I
   -----------------------------------------------------------
                    IO$_SENSECHAR    Определить характеристи-
                                     ки устройства
                    IO$_SETCHAR      Установить характеристи-
                                     ки устройства
                    IO$_SPACEFILE    Разделять файлы проме-
                                     жутками
                    IO$_SPACERECORD  Разделять промежутками
                                     записи
                    IO$_STARTSPNDL   Включить шпиндель
                    IO$_UNLOAD       Разгрузить привод
                    IO$_WRITECHECK   Записать контрольные
                                     данные
                    IO$_WRITECHECKH  Записать контрольный за-
                                     головок и данные
                    IO$_WRITEHEAD    Записать заголовок и
                                     данные
                    IO$_WRITEMARK    Записать метку ленты
                    IO$_WRITEPBLK    Записать физический блок
                    IO$_WRITETRACKD  Записать дорожку данных
    Логические коды IO$_READLBLK     Прочесть логический блок
                    IO$_REWIND       Перемотать ленту
                    IO$_REWINDOFF    Выполнить перемотку и
                                     отключить от системы
                    IO$_SENSEMODE    Определить режим устрой-
                                     ства
                    IO$_SETMODE      Встановить режим
                    IO$_SKIPFILE     Пропустить файлы
                    IO$_SKIPRECORD   Пропустить записи
                    IO$_WRITELBLK    Записать логический блок
                    IO$_WRITEOF      Записать конец файла
     Виртуальные коды
                    IO$_ACCESS       Выбрать файл
                    IO$_ACPCONTROL   Разнообразное управление
                                     ACP
                    IO$_CREATE       Создать файл
                    IO$_DEACCESS     Исключить доступ к файлу
                    IO$_DELETE       Вычеркнуть файл
                    IO$_MODIFY       Изменить файл
                    IO$_MOUNT        Установить том
                    IO$_READPROMPT   Читать терминал с сооб-
                                     щением подсказки
                    IO$_READVBLK    Прочесть виртуальный блок
                    IO$_WRITEVBLK   Записать виртуальный блок
 
 
 
        Драйвер устройства  создает  таблицу  выбора  функций,
 
   используя макрокоманду FUNCTAB. Каждым вызовом этой  макро-
 
   команды создается запись из двух или трех  двойных  слов  в
 
   этой таблице. Первые два  вызова  создают  по  2  2-словные
 
 
                            - 198 -
 
                        00152-01 97 07-1
 
 
   записи, так как они указывают только коды функций;  они  не
 
   указывают сопутствующие рабочие программы.
 
 
        Все последующие вызовы указанной  макрокоманды  должны
 
   указывать как коды функций, так и адрес рабочей  программы,
 
   выполняющей предобработку для этих функций. В данном случае
 
   создаются записи, состоящие из трех двойных слов.
 
 
        Системная  программа  обслуживания  очереди   запросов
 
   ввода/вывода обрабатывает эти записи в порядке их появления
 
   в таблице выбора функций. Когда  код  функции  присутствует
 
   более чем в одной записи, состоящей из трех  двойных  слов,
 
   системная служба последовательно  вызывает  каждую  рабочую
 
   программу, указанную для кода функции, пока  рабочая  прог-
 
   рамма не остоновит сканирование путем прекращения,  оконча-
 
   ния или установки в очередь запроса ввода/вывода.
 
 
 
        7.3.2. Определение   тех   функций,    которые
 
               являются буферизованным вводом/выводом
 
 
 
        Вторая запись в таблице выбора  функций  указывает  те
 
   функции, которые обрабатываются как операции буферизованно-
 
   го ввода/вывода. При выборе функций,  которые  должны  быть
 
   буферизованы,  необходимо  принять  во  внимание  следующую
 
   информацию:
 
 
        - прямой ввод/вывод предназначается для устройств, чьи
 
   операции ввода/вывода всегда оканчиваются быстро. Например,
 
   хотя треминальный ввод/вывод является быстрым, пользователь
 
   может  препятствовать  окончанию   операции   ввода/вывода,
 
   используя клавишу CTRL/S для останова операции на  длитель-
 
 
 
                            - 199 -
 
                        00152-01 97 07-1
 
 
   ное  время;  поэтому  терминальные  операции   ввода/вывода
 
   являются буферизованными;
 
 
        - использование прямого  ввода/вывода  требует,  чтобы
 
   страницы процесса, содержащие буфер, были  заблокированы  в
 
   памяти. Такая блокировка страниц в памяти увеличивает  нак-
 
   ладные расходы при  своппинге  процесса,  который  содержит
 
   такие страницы;
 
 
        - буферизованный ввод/вывод требует  пересылки  данных
 
   из системного буфера  в  буфер  пользователя,  что  требует
 
   дополнительного времени;
 
 
        - программы, которые обрабатывают данные перед достав-
 
   кой их пользователю, (например, программа обслуживания пре-
 
   рывания терминала), не в состоянии получить доступ  к  дан-
 
   ным, если используется прямой ввод/вывод. Поэтому передачи,
 
   требующие манипуляции данными, должны  быть  буферизованным
 
   вводом/выводом;
 
 
        - операционная  система  различным  образом  управляет
 
   квотами для прямого и буферизованного ввода/вывода, как это
 
   рассматривается в документе [5];
 
 
        - устройства с прямым  доступом  к  памяти  используют
 
   прямой ввод/вывод, тогда как устройства  с  программируемым
 
   вводом/выводом используют буферизованный.
 
 
        Пример  буферизованного  ввода/вывода  приведен  в  п.
 
   7.3.3.
 
 
 
 
                            - 200 -
 
                        00152-01 97 07-1
 
 
        7.3.3. Макрокоманда FUNCTAB
 
 
 
        Макрокоманда FUNCTAB создает  таблицу  выбора  функций
 
   для драйвера.
 
 
        Формат:
 
 
          FUNCTAB      [действие], коды
 
 
   действие
 
          - адрес программы, вызываемой для предобработки ука-
 
            занного кода или кодов функций ввода/вывода. Прог-
 
            рамма действия указывается  только  для  элементов
 
            таблицы от третьего до последнего. Список допусти-
 
            мых  функций  и  список   буферизованных   функций
 
            ввода/вывода не имеют соответствующих им  программ
 
            действия.
 
 
   Коды   - список кодов функций ввода/вывода. Макрорасширение
 
            префиксирует каждый код  строкой  IO$_;  например,
 
            READVBLK расширяется до IO$_READVBLK.
 
 
        В примере программа, названная XX_READ, вызывается для
 
   функции чтения и является драйверной программой. Она  нахо-
 
   дится в драйверном модуле.
 
 
        Программы EXE$SETMODE и EXE$SENSEMODE,  которым  пред-
 
   шествует знак плюса (+) в аргументе макрокоманды,  являются
 
   программами операционной системы, которые  предобрабатывают
 
   запросы ввода/вывода для функций установа  характеристик  и
 
   определения режима устройства.
 
 
 
 
 
 
                            - 201 -
 
                        00152-01 97 07-1
 
 
        Пример.
 
 
   XX_FUNCTABLE:                  ;таблица выбора функций
 
        FUNCTAB  ,-               ;допустимые функции
 
                 <READLBLK,-      ;читать логический блок
 
                  READPBLK,-      ;читать физический блок
 
                  READVBLK,-      ;читать виртуальный блок
 
                  SENSEMODE,-     ;определить режим считывания
 
                  SENSECHAR,-     ;определить характеристики
 
                                  ;считывания
 
                  SETMODE,-       ;установить режим считывания
 
                  SETCHAR,-       ;установить характеристики
 
                 >                ;считывания
 
        FUNCTAB  ,-               ;буферизованный ввод/вывод
 
                 <READLBLK,-      ;читать логический блок
 
                  READPBLK,-      ;читать физический блок
 
                  READVBLK,-      ;читать виртуальный блок
 
                  SENSEMODE,-     ;определить режим считывания
 
                  SENSECHAR,-     ;определить характеристики
 
                                  ;считывания
 
                  SETMODE,-       ;установить режим считывания
 
                  SETCHAR,-       ;установить характеристики
 
                  >               ;считывания
 
        FUNCTAB  XX_READ,-        ;функции чтения
 
                 <READLBLK,-      ;читать логический блок
 
                  READPBLK,-      ;читать физический блок
 
                  READVBLK,-      ;читать виртуальный блок
 
                 >
 
        FUNCTAB +EXE$SETMODE,-    ;установка режима или
 
                                  ;характеристик
 
 
 
                            - 202 -
 
                        00152-01 97 07-1
 
 
                <SETCHAR,-        ;установить характеристики
 
                                  ;считывания
 
                 SETMODE,-        ;установить режим считывания
 
                >
 
        FUNCTAB +EXE$SENSEMODE,-  ;определение режима или
 
                                  ;характеристик
 
                <SENSECHAR,-      ;определить характеристики
 
                                  ;считывания
 
                 SENSEMODE,-      ;определить режим считывания
 
                >
 
 
 
 
                   8. НАПИСАНИЕ ПРОГРАММ FDT
 
 
 
 
        Системная  программа  обслуживания  очереди   запросов
 
   ввода/вывода использует драйверную таблицу  выбора  функций
 
   для определения, какую программу FDT следует  вызвать.  Эти
 
   программы FDT утверждают аргументы, заданные  пользователем
 
   в запросе ввода/вывода. Операционная система содержит  мно-
 
   жество не зависящих от устройства программ FDT.
 
 
        Драйверу должен вызывать не  зависящие  от  устройства
 
   программы FDT операционной  системы,  когда  это  возможно.
 
   Такой подход позволяет использовать хорошо отложенные прог-
 
   раммы и минимизировать размер драйвера.
 
 
 
        8.1. Контекст для выполнения программы FDT
 
 
 
        Системная  программа  обслуживания  очереди   запросов
 
   ввода/вывода вызывает программы FDT в  контексте  процесса,
 
 
 
                            - 203 -
 
                        00152-01 97 07-1
 
 
   который затребовал  операцию  ввода/вывода.  Характеристики
 
   контекста процесса во время вызова программы  FDT  является
 
   следующими:
 
 
        - виртуальные адреса  отображаются  в  соответствии  с
 
   таблицей  страниц  процесса.  Такое  отображение  позволяет
 
   программам FDT получить доступ к виртуальным адресам,  ука-
 
   занным пользователем;
 
 
        - процесс выполняется в режиме ядра, так как системная
 
   программа обслуживания очереди запросов ввода/вывода  вызы-
 
   вается с исполнением инструкции изменения режима  на  режим
 
   ядра;
 
 
        - привилегии процесса остаются без изменений;
 
 
        - уровень приоритета прерывания устанавливается равным
 
   IPLS_ASTDEL. Поэтому процесс может быть перепланирован,  но
 
   он не  может  воспринять  AST.  Возможен  страничный  обмен
 
   (PAGING).
 
 
 
        8.2. Предустановка регистров для  исполнения
 
             программы FDT
 
 
 
        Системная  программа  обслуживания  очереди   запросов
 
   ввода/вывода перед вызовом программ FDT устанавливает неко-
 
   торые регистры, перечисленные в табл. 3.
 
 
 
 
 
                            - 204 -
 
                        00152-01 97 07-1
 
 
                                                     Таблица 3
         Установка регистров для исполнения программ FDT
 
   -----------------------------------------------------------
          I
   РегистрI                    Содержимое
          I
   -----------------------------------------------------------
   R0      Адрес программы FDT, которая должна быть вызвана
   R3      Адрес пакета запроса ввода/вывода для текущего
           запроса ввода/вывода
   R4      Адрес блока управления процессом (PCB) текущего
           процесса
   R5      Адрес UCB устройства, назначенного для указанного
           пользователем канала ввода/вывода процесса
   R6      Адрес блока управления каналом, который описывает
           указанный пользователем канал ввода/вывода процесса
   R7      Номер бита для указанного пользователем кода функци
           ввода/вывода
   R8      Адрес текущего входа в таблицу выбора функций
   AP      Адрес первого зависящего от функции параметра,
           указанного в пользовательском запросе
 
 
 
        8.3. Соглашения, которым  следуют  программы
 
             FDT
 
 
 
        Программы FDT вызываются системной программой обслужи-
 
   вания очереди запросов ввода/вывода и  возвращаются  в  нее
 
   или вызывают другую программу операционной системы; поэтому
 
   они должны следовать определенным соглашениям  относительно
 
   сохранения содержимого  регистров  и  ожидаемого  контекста
 
   процесса.
 
 
 
        8.3.1. Соглашения о регистрах
 
 
 
        Программы  FDT  отвечают  за  сохранность  содержимого
 
   регистров R3-R8 при своей работе  после  вызова.  Программы
 
   FDT могут использовать R0-R2 и R9-R11, не сохраняя их преж-
 
   нее содержимое. Если же эти программы нуждаются в регистрах
 
   от R3 до R8, то для сохранения регистров в стеке  и  после-
 
 
 
                            - 205 -
 
                        00152-01 97 07-1
 
 
   дующего восстановления их из стека программы могут  исполь-
 
   зовать инструкции пересылки регистров в стек и обратно.
 
 
        Пример.
 
 
        PUSHR  #^M<R3,R4,R5>   ;сохранить R3 - R5 в стеке
 
               .
 
               .
 
               .
 
        POPR   #^M<R3,R4,R5>   ;восстановить R3 - R5 из стека
 
 
 
        8.3.2. Соглашения по контексту процесса
 
 
 
        Системная  программа  обслуживания  очереди   запросов
 
   ввода/вывода работает в контексте процесса, выдавщего  зап-
 
   рос ввода/вывода, но в режиме ядра и на уровне IPL$_ASTDEL.
 
   Системная   программа   обслуживания    очереди    запросов
 
   ввода/вывода полагает, что программы FDT сохранят этот кон-
 
   текст. Поэтому программа  FDT  должна  соблюдать  следующие
 
   соглашения:
 
 
        - не    устанавливать    уровень    приоритета    ниже
 
   IPL$_ASTDEL;
 
 
        - если  программа  повышает  уровень  приоритета,  она
 
   должна понизить его перед выходом до IPL$_ASTDEL;
 
 
        - не изменять стек без  восстановления  его  исходного
 
   состояния перед выходом;
 
 
        - должна соблюдать соглашения по  регистрам,  рассмот-
 
   ренные в п. 8.3.1.
 
 
 
 
                            - 206 -
 
                        00152-01 97 07-1
 
 
        - выход из программы осуществляется либо по инструкции
 
   RSB для возврата управления системной службе, либо по инст-
 
   рукции JMP для перехода на одну  из  программ  операционной
 
   системы, которые рассматриваются в подразделе 8.4.
 
 
 
        8.4. Переход к программе FDT и выход из нее
 
 
 
        Для передачи  управления  в  программу  FDT  системная
 
   программа обслуживания очереди запросов ввода/вывода загру-
 
   жает адрес программы FDT в регистр и выполняет  переход  на
 
   инструкцию подпрограммы:
 
 
        JSB (R0)
 
 
        Каждая программа FDT выбирает путь выхода, основываясь
 
   на следующих факторах:
 
 
        - имеется ли необходимость в вызове  другой  программы
 
   FDT для выполнения дополнительной обработки,  зависящей  от
 
   функции;
 
 
        - обнаружена ли ошибка в запросе ввода/вывода;
 
 
        - завершена ли операция;
 
 
        - требует ли операция  ввода/вывода  активизации  уст-
 
   ройства и готова ли к ней.
 
 
        На рис. 21 показан цикл обработки запроса ввода/вывода
 
   программами FDT и выход из цикла FDT в системные  программы
 
   обслуживания очереди  запросов  ввода/вывода  и  завершения
 
   запроса ввода/вывода. Системная программа обслуживания оче-
 
   реди запросов ввода/вывода не знает, когда остановить прос-
 
 
 
                            - 207 -
 
                        00152-01 97 07-1
 
 
   мотр таблицы выбора функций. Поэтому необходимо, чтобы  все
 
   допустимые коды функций в драйверной таблице FDT в конечном
 
   счете обеспечивали вызов программы FDT, которая не  возвра-
 
   щается к системной программе обслуживания очереди  запросов
 
   ввода/вывода.
 
 
                  Цикл  обработки FDT
 
                    ***************
                    *   Читать    *
            ------->*  следующий  *<--------------
            I       *  вход FDT   *              I
            I       ***************              I
            I              I                     I
            I              I                     I
            I              *                     I
            I            *   *                   I
            I           * Код *                  I
            I   Нет    *функции*                 I
            ----------*совпа-   *                I
                        *дает?*                  I
                         *   *                   I
                           *                     I
                           I                     I
                           I Да                  I
                     ***************             I
                     *   Вызвать   * Возврат в   I
                     *  программу  *программы FDTI
                     *     FDT     *--------------
                     ***************
                           I
                           I Выход из программ FDT
                           I
                  ***********************
                  * Помещение в очередь *
                  * IRP, конец   или    *
                  *     прекращение     *
                  *    ввода/вывода     *
                  ***********************
 
                         Рис. 21
 
 
        Выход из программы FDT осуществляется с помощью одного
 
   из методов, описанных в табл. 4. Первый из  методов  выпол-
 
   няет возврат к  системной  программе  обслуживания  очереди
 
   запросов ввода/вывода. Все  остальные  методы  осуществляют
 
   переход на программы операционной системы,  которые  выпол-
 
   няют соответствующие действия. Детальное рассмотрение  этих
 
 
                            - 208 -
 
                        00152-01 97 07-1
 
 
   программ приведено в подразделе 8.8.
 
                                                     Таблица 4
                      Методы выхода из FDT
 
   -----------------------------------------------------------
                       I
   Метод выхода        I            Результат
                       I
   -----------------------------------------------------------
   RSB                   Возврат в системную службу очереди
                        запросов ввода/вывода. Программа FDT
                        переходит к этой системной службе
                        тогда, когда она знает, что таблица
                        FDT содержит последующую запись с
                        установленным битом того же самого
                        кода функции. В результате, эта сис-
                        темная служба вызывает другую прог-
                        рамму FDT.
   JMS  G^EXE$QIODRVPKT  Передача управления программе
        Или             МОС ВП, которая устанавливает в
   JSB  G^EXE$ALTQUEPKT Очередь к драйверу пакет
                        ввода/вывода. Программа FDT использу-
                        ет этот метод выхода, когда в специ-
                        фикации запроса ввода/вывода не обна-
                        ружено фатальных ошибок и если для
                        окончания операции требуется работа
                        устройства.
                           Как только программа FDT пере-
                        даст управление одной из этих прог-
                        рAMM, выполняющая последующую обра-
                        ботку запроса ввода/вывода, не может
                        обращаться в пространство виртуаль-
                        ных адресов процесса.
                           EXE$QIODRVPKT - это стандартный
                        метод, используемый для установки в
                        очередь на работу устройства запроса
                        ввода/вывода. Эта программа иницииру-
                        ет деятельность драйвера только в том
                        случае, если устройство на данный мо-
                        мент находится в состоянии холостого
                        хода, т.е., отсутствуют обслуживаемые
                        запросы ввода/вывода. Если устройство
                        занято, то данная программа устанав-
                        ливает запрос в очередь к устройству,
                        так что работа драйвера потребуется,
                        когда устройство освободится.
                            в противоположность этому, прог-
                        рамма EXE$ALTQUEPKT инициирует рабо-
                        ту драйвера через особую точку входа
                        в драйвер, не интересуясь при этом,
                        находится ли устройство  в  активном
                        состоянии. Эта программа вызывается
                        драйверами, которые могут обрабаты-
                        вать два или более запросов одновре-
                        менно.
   JMP  G^EXE$FINISHIO   Передача управления в программу мос
                        вп, которая переписывает четыре слова
                        конечного состояния ввода/вывода  из
 
 
                            - 209 -
 
                        00152-01 97 07-1
 
 
                                           Продолжение табл. 4
   -----------------------------------------------------------
                       I
   Метод выхода        I            Результат
                       I
   -----------------------------------------------------------
                        R0 и R1 в поле состояния пакета зап-
                        роса ввода/вывода (IRP$L_MEDIA   и
                        IRPSL_MEDIA+4). После этого программа
                        помещает запрос ввода/вывода (пакет)
                        в очередь на постобработку.
                            Программа FDT, которая обнаружи-
                        вает ошибку, всегда должна передать
                        состояние, используя EXE$FINISHIO или
                        EXE$FINISHIOC. Программа передает си-
                        стемной службе очереди запросA ввода/
                        вывода два двойных слова состояния,
                        содержащихся в блоке состояния (если
                        он есть), указанном в запросе очереди
                        ввода/вывода.
   JMP  G^EXE$FINISHIOC    Передача управления программе, ко-
                        торая выполняет те же функции, что и
                        программа EXE$FINISHIO, за исключением
                        того, что рассматриваемая программа
                        всегда очищает второе длиное слово ко-
                        нечного состояния ввода/вывода.
   JMP  G^EXE$ABORTIO       Передает управление программе мос
                        вп, которая прекращает обработку за-
                        проса ввода/вывода. Программа   FDT,
                        которая обнаружила не зависимую  от
                        устройства ошибку в запросе ввода/
                        вывода, всегда должна   использовать
                        этот метод выхода. Программа сохраняет
                        двойное слово состояния в R0  и пере-
                        дает его системной службе.  Примером
                        ошибки, не зависящей от устройства,
                        может служить невозможность получить
                        доступ к буферу данных.
 
 
        8.5. Программы FDT для прямого ввода/вывода
 
 
 
        Операционная система МОС ВП предоставляет две програм-
 
   мы  FDT,   которые   применяются   для   операций   прямого
 
   ввода/вывода: EXE$READ и EXE$WRITE.
 
 
        Будучи вызваны драйвером, эти программы полностью под-
 
   готавливают  запрос  прямого  ввода/вывода  на  чтение  или
 
   запись. Таким образом, драйвер, использующий эти программы,
 
   освобождается от необходимости иметь  собственные  специфи-
 
 
 
                            - 210 -
 
                        00152-01 97 07-1
 
 
   ческие для устройства программы FDT.
 
 
        Программы операционной системы  EXE$READ  и  EXE$WRITE
 
   рассматриваются в подразделе 8.7.
 
 
 
        8.6. Программы   FDT   для   буферизованного
 
             ввода/вывода
 
 
 
        Драйверы  устройств  для  операций   буферизированного
 
   ввода/вывода должны содержать  свои  собственные  программы
 
   FDT, зависящие от устройства. Программы FDT  для  буферизо-
 
   ванного ввода/вывода должны выполнять следующие шаги:
 
 
        1) подтвердить доступ к буферу пользователя по  записи
 
   или чтению;
 
 
        2) зарезервировать буфер в системном пространстве.
 
 
 
        8.6.1. Проверка буфера пользователя
 
 
 
        Программа FDT вызывает EXE$READCHK  или  EXE$WRITECHK,
 
   чтобы убедиться в возможности доступа по чтению или записи,
 
   соответственно, к пользовательскому буферу. Обе  эти  прог-
 
   раммы записывают счетчик передаваемых байтов в  IRP$W_BCNT.
 
   Первая  из  программ  устанавливает  также   IRP$V_BCNT   в
 
   IRP$W_STS для индикации, что функция является чтением.
 
 
 
        8.6.2. Выделение системного буфера
 
 
 
        Программа FDT резервирует системный  буфер.  Программа
 
   прибавляет 12 байтов, предназначенных для заголовка буфера,
 
 
 
                            - 211 -
 
                        00152-01 97 07-1
 
 
   к счету байтов, переданному пераметром R2 в  пользовательс-
 
   ком запросе ввода/вывода. После этого имеется полный  об'ем
 
   системного   буфера.   Затем   программа    FDT    вызывает
 
   EXE$BUFFRQUOTA для  проверки  наличия  ресурсов.  Вызванная
 
   программа возвращает управление с кодом  успеха,  программа
 
   FDT вызывает  EXE$ALLOCBUF,  которая  резервирует  буфер  и
 
   записывает размер и тип буфера в его третье двойное слово.
 
 
        Как только буфер выделен, программа FDT проходит  сле-
 
   дующие шаги:
 
 
        1) загружает адрес системного буфера в IRP$L_SVAPTE;
 
 
        2)  загружает  общий  размер   системного   буфера   в
 
   IRP$W_BOFF;
 
 
        3) вычитает размер системного буфера из  JIB$L_BYTCNT.
 
   Двойное слово в рсв  (PCB$L_JIB)  указывает  местоположение
 
   блока информации о задании (JIB);
 
 
        4) сохраняет начальный  адрес  области  данных  буфера
 
   системы в первом двойном слове заголовка буфера;
 
 
        5) сохраняет адрес пользовательского буфера во  втором
 
   двойном слове заголовка;
 
 
        6) копирует данные из буфера пользователя в буфер сис-
 
   темы, если запрос ввода/вывода указывает операцию записи.
 
 
        В данной точке буферы  готовы  для  передач.  Рис.  22
 
   иллюстрирует формат системного буфера.
 
 
 
 
 
 
 
 
                            - 212 -
 
                        00152-01 97 07-1
 
 
 
 
                    Формат системного буфера
 
 
                     **********************   \
   Системный буфер-->*Адрес области данных*   I
                   I-**********************   I
                   I *Адрес буфера пользо-*-I  > Заголовок
                   I *       вателя       * I I
                   I ********************** I I
                   I *   Тип   *  Размер  * I I
                   I ********************** I /
                   ->*                    * I
                     *       Область      * I
                     *       данных       * I  ***************
                     *       буфера       * I->*             *
                     *                    *    *Пользователь-*
                     **********************    *    ский     *
                                               *   буфер     *
                                               *             *
                                               ***************
 
                             Рис.22
 
 
        ДополнительнAя     информация     об      EXE$READCHK,
 
   EXE$WRITECHK,  EXE$BUFFRQUOTA,  EXE$ALLOCBUF  приведена   в
 
   документе [3].
 
 
 
        8.6.3. Окончание буферизованного  ввода/вывода
 
               в постобработке
 
 
 
        Когда передача заканчивается, драйвер предает управле-
 
   ние  в   операционную   систему   для   окончания   запроса
 
   ввода/вывода. Драйвер записывает конечный счет байтов, хра-
 
   нящийся в старшем слове R0, и конечное состояние запроса  в
 
   младших словах R0 и R1. Драйвер должен оставить  нетронутым
 
   заголовок  буфера;  программа  постобработки   ввода/вывода
 
   полагается  на  точность  заголовка.  Когда   постобработка
 
   ввода/вывода операционной системой получает управление, она
 
   выполняет следующие действия:
 
 
 
 
                            - 213 -
 
                        00152-01 97 07-1
 
 
        1) прибавляет значение IRP$W_BOFF к  JIB$L_BYTCNT  для
 
   корректировки пользовательской квоты счета байтов;
 
 
        2) если IRP$L_SVAPTE  не  нулевое,  предполагает,  что
 
   системный буфер был  выделен  и  проверяет,  установлен  ли
 
   IRP$W_FUNC в IRP$W_STS;
 
 
        3)  если  IRP$W_FUNC  очищен,  освобождает   системный
 
   буфер, использовавшийся для операции  записи;  если  же  он
 
   установлен, AST режима ядра  копирует  данные  в  пользова-
 
   тельский буфер и затем, вместе с остальными  функциями  AST
 
   режима ядра, освобождает буфер.
 
 
        AST режима ядра выполняет следующие действия для окон-
 
   чания операции буферизованного чтения:
 
 
        1) получает адрес системного буфера из IRP$L_SVAPTE;
 
 
        2) для операции чтения получает число байтов  (которые
 
   должны  быть   засланы   в   пользовательский   буфер)   из
 
   IRP$W_BCNT;
 
 
        3) получает адрес пользовательского буфера из  второго
 
   двойного слова заголовка системного буфера;
 
 
        4) проверяет доступность по записи ко  всем  страницам
 
   буфера пользователя (для операции чтения);
 
 
        5) копирует данные из системного буфера в  буфер  про-
 
   цесса (для операции чтения);
 
 
        6) освобождает системный буфер. Заметим, что при осво-
 
   бождении буфера  система  использует  размер,  указанный  в
 
   заголовке буфера.
 
 
 
                            - 214 -
 
                        00152-01 97 07-1
 
 
        8.7. Программы FDT, предоставляемые системой
 
             MOC BП
 
 
 
        Программа FDT операционной системы выполняют  проверку
 
   достоверности запроса ввода/вывода, которая является  общей
 
   для многих устройств. Когда вызывается программа FDT опера-
 
   ционной системы, дополнительной обработки  программами  FDT
 
   не требуется. Все программы FDT операционной систEмы, расс-
 
   мотренные здесь, выполняют выход путем передачи  управления
 
   одной из следующих программ МОС ВП:
 
 
              -  EXE$QIODRVPKT;
 
              -  EXE$FINISHIO;
 
              -  EXE$FINISHIOC;
 
              -  EXE$ABORTIO.
 
 
        При вызове программы FDT операционной системы  никакой
 
   последующей FDT-обработки не требуется.
 
 
        Информация о дополнительных программах FDT  содержится
 
   в документе [3].
 
 
 
        8.7.1. EXE$ONEPARM
 
 
 
        Программа обрабатывает код функции ввода/вывода, кото-
 
   рый имеет лишь один параметр, с ним связанный.
 
 
        Метод выхода
 
 
        Помещение  в  очередь  к   драйверу   пакета   запроса
 
   ввода/вывода.
 
 
 
 
 
                            - 215 -
 
                        00152-01 97 07-1
 
 
        Описание
 
 
        Обработка кода функции ввода/вывода,  который  требует
 
   лишь одного параметра, который  не  нуждается  в  проверке.
 
   Например, параметр не должен проверяться на доступность  по
 
   чтению  или  записи.  Рассматриваемая  программа  сохраняет
 
   параметр, находящийся в 0(АР), в IRPSL_MEDIA пакета запроса
 
   ввода/вывода. Затем она помещает пакет запроса в очередь  к
 
   драйверу.
 
 
 
        8.7.2. EXE$READ
 
 
 
        Программа обрабатывает функции логического  или  физи-
 
   ческого чтения для  операции  прямого  ввода/вывода.  И  не
 
   может  быть  использована  для   операции   буферизованного
 
   ввода/вывода.
 
 
        Метод выхода
 
 
        В  случае   обнаружения   ошибки   обработка   запроса
 
   ввода/вывода прекращается; если пользовательские буферы  не
 
   заблокированы в памяти, выполняется освобождение и  повтор-
 
   ный прием на рассмотрение запроса ввода/вывода. Иначе пакет
 
   запроса ввода/вывода помещается в очередь к драйверу.
 
 
        Описание
 
 
        Устанавливает бит функции ввода/вывода в поле  состоя-
 
   ния (IRPSV_FUNC в IRP$W_STS) пакета запроса. Этот бит  ука-
 
   зывает, что данная функция является чтением.
 
 
        Рассматриваемая программа записывает  четвертый  пара-
 
   метр, размещенный в  12(AP),  в  поле  управления  кареткой
 
 
                            - 216 -
 
                        00152-01 97 07-1
 
 
   (IRPSB_CARCON).
 
 
        Программа заменяет логический код функции IO$_READLBLK
 
   на физический код функции IO$_READPBLK в поле кода  функции
 
   (IRP$W_FUNC) пакета запроса ввода/вывода.
 
 
        Если параметр количества  байтов  для  передачи  равен
 
   нулю, программа устанавливает пакет  запроса  в  очередь  к
 
   драйверу устройства. Второй  параметр  находится  в  4(AP).
 
   Если количество передаваемых байтов не равно нулю, програм-
 
   ма использует начальный  адрес  передачи,  расположенный  в
 
   0(AP), и передает количество байтов в качестве аргумента  к
 
   программе EXE$READLOCK.
 
 
        Программа EXE$READLOCK вызывает EXE$READLOCKR, которая
 
   немедленно вызывает EXE$READCHKR. Эта последняя подпрограм-
 
   ма определяет, разрешен ли для буфера доступ по записи.
 
 
        Если EXE$READCHKR определяет, что доступ к буферу раз-
 
   решен, программа корректирует  пакет  запроса  ввода/вывод,
 
   записывая число передаваемых байтов в IRP$W_BCNT и устанав-
 
   ливая бит состояния чтения в IRP$W_STS (IRP$V_FUNC). Макси-
 
   мальное число байтов,  которое  можно  передать  с  помощью
 
   EXE$READ, равно 65535 (128 страниц минус один байт).
 
 
        Если  доступ  по   записи   в   буфер   не   разрешен,
 
   EXE$READCHKR возвращает вызвавшей программе (EXE$READLOCKR)
 
   состояние нарушения доступа, а эта программа, в  свою  оче-
 
   редь, вызывает вызвавшую ее программу EXE$READLOCK как соп-
 
   рограмму.
 
 
        Когда последняя программа вызывается в  качестве  соп-
 
   рограммы, она не выполняет каких-либо действий  по  ошибке.
 
 
                            - 217 -
 
                        00152-01 97 07-1
 
 
   вместо этого,  она  передает  управление  к  EXE$READLOCKR,
 
   которая   прекращает    обслуживание    очереди    запросов
 
   ввода/вывода с состоянием нарушения  доступа.  EXE$READLOCK
 
   вызывается как сопрограмма для удобства драйверов,  которые
 
   прямо вызывают EXE$READLOCKR. Подробная информация  дана  в
 
   документе [3].
 
 
        После того, как EXE$READCHKR  убедится  в  доступности
 
   буфера   по   записи,   EXE$READLOCK   вызывает   программу
 
   MMG$IOLOCK для блокировки в  памяти  тех  страниц,  которые
 
   содержат буфер. Программа возвращает в  EXE$READLOCKR  сос-
 
   тояние успешного завершения, страничный отказ или состояние
 
   ошибки.
 
 
        Если  MMG$IOLOCK  выполнилась  успешно,  EXE$READLOCKR
 
   сохраняет адрес элемента таблицы страниц (рте)  процесса  в
 
   поле   IRP$L_SVAPTE   и   передает   состояние   успеха   к
 
   EXE$READLOCK.
 
 
        Если  MMGSIOLOCK   сообщает   о   страничном   отказе,
 
   EXE$READLOCKR устанавливает в счетчике прямого ввода/вывода
 
   и и в счетчике AST те значения, которые они имели до запро-
 
   са ввода/вывода, освобождает пакет запроса  ввода/вывода  и
 
   вновь запускает процедуру обработки запроса системной прог-
 
   раммой обслуживания очереди запросов ввода/вывода. Эта про-
 
   цедура выполняется, так что процесс пользователя может при-
 
   нять асинхронные захваты системы (AST) в то время, пока  он
 
   ожидает завершения страничного отказа, при наличии которого
 
   системная  служба  будет  повторно   рассматривать   запрос
 
   ввода/вывода.
 
 
 
 
 
                            - 218 -
 
                        00152-01 97 07-1
 
 
        MMG$IOLOCK может сообщать  о  возникновении  одной  из
 
   двух ошибок: нарушение доступа (SS$_ACCVIO) и недостаточный
 
   лимит рабочего набора  (SS$_INSFWSL).  Когда  EXE$READLOCKR
 
   получает ошибку, аварийно  завершает  запрос  с  состоянием
 
   ошибки.
 
 
        EXE$READLOCK возвращает управление EXE$READ, эта прог-
 
   рамма передает управление  программе  EXE$QIODRVPKT,  чтобы
 
   установить запрос ввода/вывода в очередь к драйверу.
 
 
 
        8.7.3. EXE$SENCEMODE
 
 
 
        Программа обрабатывает функции  определения  режима  и
 
   характеристики устройства, путем чтения полей блока  управ-
 
   ления устройством (UCB). При этом, активности устройства не
 
   требуется.
 
 
        Метод выхода
 
 
        Передача управления к EXE$FINISHIO.
 
 
        Описание
 
 
        Загружает поле зависящих от  устройства  характеристик
 
   (UCB$L_DEVDEPEND) блока управления устройством в RI,  после
 
   чего загружает состояние нормального окончания (SS$_NORMAL)
 
   в R0 и передает управление  к  EXE$FINISHIO  для  помещения
 
   пакета  запроса  ввода/вывода   в   очередь   постобработки
 
   ввода/вывода.
 
 
 
                            - 219 -
 
                        00152-01 97 07-1
 
 
        8.7.4. EXE$SETCHAR
 
 
 
        Программа  обрабатывает  функции  установки  режима  и
 
   характеристик устройства. Если установка характеристик уст-
 
   ройства не требует его активности либо не требует синхрони-
 
   зации с форк-обработкой,  запись  в  таблице  FDT  драйвера
 
   может указывать EXE$SETCHAR;  иначе  она  должна  указывать
 
   EXE$SETMODE.
 
 
        Метод выхода
 
 
        Аварийное завершение запроса ввода/вывода  по  ошибке;
 
   иначе передает управление к EXE$FINISHIO.
 
 
        Описание
 
 
        Определяет, имеет ли процесс доступ по чтению к  квад-
 
   рослову, в котором  содержатся  новые  характеристики  уст-
 
   ройства. Первый параметр, находящийся  в  0(AP),  указывает
 
   адрес квадрослова. Если процесс не имеет доступа по  чтению
 
   к этому слову, ехе$SETCHAR прекращает обслуживание запроса.
 
 
        Если процесс имеет доступ по чтению, EXE$SETCHAR запо-
 
   минает новые характеристики в полях блока  управления  уст-
 
   ройством. Если функций  служит  IO$_SETCHAR,  поля  типа  и
 
   класса устройства (UCBSB_DEVCLASS  и  UCB$B_DEVTYPE,  соот-
 
   ветственно) блока управления устройством заполняются первым
 
   словом данных, указанных параметром.
 
 
        Для функций IO$_SETMODE и IO$_SETCHAR программа  запи-
 
   сывает второе слово данных в поле  UCB  размера  буфера  по
 
   умолчанию (UCB$W_DEFBUFSIZ), а  третье  и  четвертое  слова
 
   данных записываются в поле зависящих от устройства характе-
 
 
                            - 220 -
 
                        00152-01 97 07-1
 
 
   ристик (UCB$L_DEVDEPEND).
 
 
        EXE$SETCHAR запоминает состояние нормального окончания
 
   (SS$NORMAL)  в   R0   и   передает   управление   программе
 
   EXE$FINISHIO для установка пакета  запроса  ввода/вывода  в
 
   очередь на постобработку ввода/вывода.
 
 
 
        8.7.5. EXE$SETMODE
 
 
 
        Программа  обрабатывает  функции  установки  режима  и
 
   характеристик устройства при активизации работы устройства.
 
 
        Метод выхода
 
 
        Аварийное завершение  запроса  ввода/вывода  в  случае
 
   возникновения ошибки;  в  противном  случае,  устанавливает
 
   пакет запроса ввода/вывода в очередь к драйверу устройства.
 
 
        Описание
 
 
        Определяет, имеет ли процесс доступ по чтению к  квад-
 
   рослову, которое описывает новые характеристики устройства.
 
   Первый параметр, находящийся в О(AP), указывает адрес этого
 
   квадрослова. Если процесс не имеет доступа по чтению, прог-
 
   рамма прекращает обслуживание запроса.
 
 
        Если процесс имеет доступ по чтению, программа  сохра-
 
   няет новые  характеристики  в  поле  среды  (IRP$L_MEDIA  и
 
   IRP$L_MEDIA+4) пакета запроса. После этого, программа пере-
 
   дает управление к программе выхода  EXE$QIODRVPKT,  которая
 
   помещает запрос в очередь к соответствующему драйверу  уст-
 
   ройства.
 
 
 
 
                            - 221 -
 
                        00152-01 97 07-1
 
 
        8.7.6. EXE$WRITE
 
 
 
        Программа обрабатывает функции логической или физичес-
 
   кой записи для операций прямого ввода/вывода. Она не  может
 
   быть    использована    для    операций     буферизованного
 
   ввода/вывода.
 
 
        Метод выхода
 
 
        При  наличии  ошибки  прекращает   обработку   запроса
 
   ввода/вывода; если пользовательские буферы ввода/вывода  не
 
   могут быть заблокированы в памяти,  запрос  отклоняется.  В
 
   иных случаях пакет запроса ввода/вывода помещается  в  оче-
 
   редь к драйверу.
 
 
        Описание
 
 
        Записывает четвертый параметр, находящихся в 12(ар), в
 
   поле  управления  кареткой  (IRP$B_CARCON)  пакета  запроса
 
   ввода/вывода.
 
 
        Программа    заменяет    код    логической     функции
 
   IO$_WRITELBLK кодом физической функции IO$_WRITEPBLK в поле
 
   кода функции пакета запроса ввода/вывода (IRP$W_FUNC).
 
 
        Если параметр  количества  передаваемых  байтов  равен
 
   нулю, программа устанавливает пакет  запроса  в  очередь  к
 
   драйверу. Данный параметр находится в 4(AP). Если количест-
 
   во байтов не равно  нулю,  программа  использует  начальный
 
   адрес передачи, находящихся в 0(AP), и  количество  переда-
 
   ваемых  байтов  в   качестве   аргументов   для   программы
 
   EXE$WRITELOCK.
 
 
 
 
                            - 222 -
 
                        00152-01 97 07-1
 
 
        Программа EXE$WRITELOCK вызывает EXE$WRITELOCKR, кото-
 
   рая, в свою очередь, вызывает EXE$WRITECHKR,  определяющую,
 
   разрешен ли для буфера доступ по чтению.
 
 
        Если  буфер   доступен   по   чтению,   то   программа
 
   EXE$WRITECHKP  корректирует  пакет  запроса   ввода/вывода,
 
   записывая число передаваемых байтов в IRP$W_BCNT. EXE$WRITE
 
   способна передать максимум 65535 байтов (128 страниц  минус
 
   один байт).
 
 
        Если  буфер  не   допускает   обращения   по   чтению,
 
   EXE$WRITECHKR возвращает состояние нарушения доступа в выз-
 
   вавшую его программу, EXE$WRITELOCKR, которая, в свою  оче-
 
   редь, вызывает вызвавшую ее программу  (EXE$WRITELOCK)  как
 
   сопрограмму.
 
 
        Когда программа EXE$WRITELOCK  вызывается  в  качестве
 
   сопрграммы, она не выполняет никаких  действий  по  ошибке.
 
   Вместо   этого,   она   передает    управление    программе
 
   EXE$WRITELOCKR, которая аварийно завершает  запрос  очереди
 
   ввода/вывода с состоянием нарушения доступа.  EXE$WRITELOCK
 
   вызывается как сопрограмма  для  драйверов,  которые  прямо
 
   вызывают EXE$WRITELOCKR. Более детальная информация  приво-
 
   дится в документе [3].
 
 
        После того, как EXE$WRITELOCKR убеждается в доступнос-
 
   ти буфера по чтению,  она  вызывает  программу  MMG$IOLOCK,
 
   которая блокирует в памяти те  страницы,  которые  содержат
 
   буфер. Программа MMG$IOLOCK возврашает в EXE$WRITELOCKR код
 
   состояния  успешного  завершения,  страничного  отказа  или
 
   ошибки.
 
 
 
 
                            - 223 -
 
                        00152-01 97 07-1
 
 
        Если MMG$IOLOCK  выполняется  успешно,  EXE$WRITELOCKR
 
   сохраняет адрес входа  таблицы  страниц  (PTE)  процесса  в
 
   IRP$L_SVAPTE и возвращает к EXE$WRITELOCK состояние  успеш-
 
   ного завершения.
 
 
        Если  MMG$IOLOCK   сообщает   о   страничном   отказе,
 
   EXE$WRITELOCKR    устанавливает    в    счетчике    прямого
 
   ввода/вывода и счетчике AST те значения,  которые  содержа-
 
   лись в них до начала обработки пакета запроса  ввода/вывода
 
   и повторно запускает процедуру обработки запроса  системной
 
   программой обслуживания очереди запросов ввода/вывода. Если
 
   имеется страничный отказ, системная служба возобновит обра-
 
   ботку очереди запросов ввода/вывода повторно.
 
 
        MMG$IOLOCK может сообщить об  одной  из  двух  ошибок:
 
   нарушение доступа (SS$_ACCVIO) и недостаточный лимит  рабо-
 
   чего набора (SS$_INSFWSL).  Когда  EXE$WRITELOCKR  получает
 
   ошибку, она прекращает обработку запроса с состоянием ошиб-
 
   ки.
 
 
        После   того,   как   EXE$WRITELOCK   возвращается   в
 
   EXE$WRITE,  эта  программа  передает  управление  программе
 
   выхода EXE$QIODRVPKT, так что запрос помещается в очередь к
 
   драйверу.
 
 
 
        8.7.7. EXE$ZEROPARM
 
 
 
        Эта программа обрабатывает  код  функции,  который  не
 
   имеет связанных с ней параметров.
 
 
        Метод выхода
 
 
 
 
                            - 224 -
 
                        00152-01 97 07-1
 
 
        Устанавливает  в  очередь  к  драйверу  пакет  запроса
 
   ввода/вывода.
 
 
        Описание
 
 
        Обрабатывает код функции  ввода/вывода,  который  пол-
 
   ностью  описывает  операцию  ввода/вывода  без   каких-либо
 
   дополнительных  параметров,  специфических   для   функции.
 
   Единственная  необходимая  FDT-обработка  для  такого  кода
 
   функции, состоит в заполнении нулями поля в пакете  запроса
 
   ввода/вывода, которое обычно содержит параметр, указываемый
 
   пользователем (IRP$L_MEDIA). После этого EXE$ZEROPARM поме-
 
   щает пакет запроса ввода/вывода в очередь к  драйверу  уст-
 
   ройства.
 
 
 
        8.8. Программы выхода в системе МОС ВП
 
 
 
        FDT-обработка должна завершаться передачей  управления
 
   к  одной  из  следующих  программ   операционной   системы:
 
   EXE$ABORTIO,  EXE$FINISHIO,  EXE$FINISHIOC,  EXE$ALTQUEPKT,
 
   EXE$QIODRVPKT.
 
 
        Каждая из этих программ передает пользователю код сос-
 
   тояния системного обслуживания.
 
 
 
        8.8.1. EXE$ABORTIO
 
 
 
        Когда   программа   FDT   определяет,    что    запрос
 
   ввода/вывода не может быть окончен из-за ошибки в  специфи-
 
   кации запроса или в FDT-обработке, программа  FDT  передает
 
   управление программе EXE$_ABORTIO для аварийного  прекраще-
 
 
 
                            - 225 -
 
                        00152-01 97 07-1
 
 
   ния обслуживания запроса.  Программа  EXE$ABORTIO  получает
 
   управление без каких-либо изменений в  контексте  процесса.
 
   Уровень приоритета  прерывания  соответствует  IPL$_ASTDEL;
 
   виртуальное  пространство  процесса  отображается;  процесс
 
   исполняется в режиме ядра.
 
 
        Требуемое содержимое регистров:
 
 
        R0 - конечный код состояния системной программы обслу-
 
   живания очереди запросов ввода/вывода;
 
 
        R3 - адрес текущего пакета запроса ввода/вывода;
 
 
        R4 - адрес блока  управления  процессом  для  текущего
 
   процесса;
 
 
        R5 - адрес блока управления устройством для  устройст-
 
   ва, назначенного каналу ввода/вывода процесса.
 
 
        Регистры R3-R5 всегда содержат адреса  пакета  запроса
 
   ввода/вывода, PCB и UCB при входе в программу FDT. Програм-
 
   ма FDT не должна разрушать эти содержимое этих регистров.
 
 
        Описание
 
 
        EXE$ABORTIO очищает адрес блока состояния ввода/вывода
 
   в пакете запроса (IRPSL_IOSB), чтобы никакое  состояния  не
 
   возвраащалось  во  время  постобработки  ввода/вывода.  Эта
 
   программа также очищает бит в пакете  запроса  ввода/вывода
 
   (ACB$V_QUOTA в поле IRPSB_RMOD).  Установленный  бит  озна-
 
   чает, что запрашивающий процесс указал программу AST.  Если
 
   необходимо,  программа  повторно  регулирует  использование
 
   квоты AST процессом.
 
 
 
                            - 226 -
 
                        00152-01 97 07-1
 
 
        Программа EXE$ABORTIO помещает пакет запроса в очередь
 
   на постобработку ввода/вывода. Если другие записи в очереди
 
   отсутствуют, программа запрашивает  программное  прерывание
 
   на приоритетном уровне IPL$_IOPOST. Это прерывание вызывает
 
   выполнение постобработки перед выполнением каких-либо инст-
 
   рукций в программе EXE$ABORTIO.
 
 
        Когда вся постобработка ввода/вывода  была  завершена,
 
   рассматриваемая  программа  вновь  получает  управление   и
 
   заканчивает операцию следующим образом:
 
 
        - понижает значение приоритетного уровня до нуля;
 
        - изменяет иекущий режим на исходный режим
 
          процессора;
 
 
        - переходит из системной службы  к  программе  образа,
 
   выдавшей    исходный    запрос    операции    ввода/вывода.
 
   EXE$_ABORTIO передает к программе, ее вызвавшей, код конеч-
 
   ного состояния (в R0),  сохраненный  при  вызове  программы
 
   выхода.
 
 
        В результате такого метода выхода любые AST, указанные
 
   при выдаче запроса ввода/вывода, не  будут  переданы  и  не
 
   будет установлен ни один из запрошенных флажков событий.
 
 
 
        8.8.2. EXE$FINISHIO и EXE$FINSHIOC
 
 
 
        Многие из запросов ввода/вывода, чтобы быть оконченны-
 
   ми, не нуждаются в работе устройства. Программа (или  прог-
 
   раммы)  FDT  может  полностью  окончить  обработку  запроса
 
   ввода/вывода и немедленно  передать  состояние,  касающееся
 
   операции, в процесс. Однако, операционная  система  предос-
 
 
                            - 227 -
 
                        00152-01 97 07-1
 
 
   тавляет две программы окончания ввода/вывода,  указанные  в
 
   заголовке. Первая из  них  передает  квадрослово  состояния
 
   ввода/вывода. Вторая -  квадрослово  состояния,  в  котором
 
   второе двойное слово содержит нули.
 
 
        Эти  программы  получают  управление  без  какого-либо
 
   изменения контекста процесса. Уровень приоритета прерывания
 
   соответствует IPL$_ASTDEL; таблицы страниц  процесса  имеют
 
   отображение; процесс исполняется в режиме ядра.
 
 
        Требуемое содержимое регистров:
 
 
        R0 - значение,  которое  должно  помещаться  в  первое
 
   двойное слово состояния завершения ввода/вывода, когда сис-
 
   темная программа обслуживания очереди запросов ввода/вывода
 
   возвращает конечное состояние;
 
 
        R1 - значение, которое должно быть помещено во  второе
 
   двойное слово конечного состояния ввода/вывода (только  для
 
   EXE$FINISHIO);
 
 
        R3 - адрес текущего пакета запроса ввода/вывода;
 
 
        R4 - адрес блока управления процесса для текущего про-
 
   цесса;
 
 
        R5 - адрес блока управления устройством для  устройст-
 
   ва, назначенного каналу ввода/вывода процесса.
 
 
        Регистры от R3 до R5  всегда  содержат  адреса  пакета
 
   запроса ввода/вывода, рсв и UCB при входе в программу  FDT.
 
   Программа FDT не должна разрушать содержимое  этих  регист-
 
   ров.
 
 
 
 
                            - 228 -
 
                        00152-01 97 07-1
 
 
        Описание
 
 
        Программы модифицируют поля в базе данных ввода/вывода
 
   и затем завершают  обработку  запроса,  выполняя  следующие
 
   действия:
 
 
        1) увеличивают число завершенных операций ввода/вывода
 
   на данном устройстве в поле счетчика операций блока  управ-
 
   ления устройством (UCB$L_OPCNT);
 
 
        2) сохраняют содержимое регистров R0 и R1 в полях сре-
 
   ды   пакета    запроса    ввода/вывода    (IRP$L_MEDIA    и
 
   IRP$L_MEDIA+4);
 
 
        3) устанавливают пакет запроса ввода/вывода в  очередь
 
   на постобработку и, если  эта  очередь  пуста,  запрашивают
 
   программное прерывание на уровне IPL$_IOPOST.
 
 
        Программы    передают     управление     постобработке
 
   ввода/вывода, так как  она  выполняется  на  более  высоком
 
   приоритетном  уровне  IPL$_IOPOST.  Когда  программы  снова
 
   получают управление, завершают обработку следующими  дейст-
 
   виями:
 
 
        1) понижают приоритетный уровень до нуля; это  обычный
 
   уровень для процесса пользователя;
 
 
        2) изменяют режим на исходный режим доступа  процессо-
 
   ра;
 
 
        3) выполняют возврат из  системной  службы  к  образу,
 
   который исходно запросил операцию ввода/вывода. Этот  образ
 
   принимает в R0 состояние SS$_NORMAL, указывающее, что обра-
 
   ботка запроса очереди ввода/вывода завершилась без не зави-
 
 
                            - 229 -
 
                        00152-01 97 07-1
 
 
   сящих от устройства ошибок.
 
 
 
        8.8.3. EXE$QIODRVPKT
 
 
 
        Чтобы  завершить  операцию  ввода/вывода,   необходима
 
   ацтивность устройства или, по  крайней  мере,  обращение  к
 
   регистрам устройства для того, чтобы операция была  оконче-
 
   на. Наиболее общим примером являются  операции,  задаваемые
 
   функциями чтения и записи. Программы FDT выполняют  широкую
 
   предобработку, такую как  определение  доступности  буферов
 
   пользователя и переформатирование данных  при  пересылке  в
 
   буферы системого адресного пространства, но не должны обра-
 
   щаться к регистрам устройства, так как оно может находиться
 
   в рабочем состоянии. Более того, программы FDT должны  соб-
 
   людать осторожность при модификации блока  управления  уст-
 
   ройством. Для синхронизации  модификаций  программы  обычно
 
   обращаются к UCB на уровне драйверного форк-IPL, а програм-
 
   мы FDT не работают на этом приоритетном  уровне.  Драйверы,
 
   содержащие программы FDT, которые  обращаются  к  регистрам
 
   устройства или неосмотрительно модифицируют блок управления
 
   устройством, рискуют столкнуться с  непредсказуемой  опера-
 
   цией или с нарушением системы.
 
 
        Для функций ввода/вывода такого типа связанные с  ними
 
   программы FDT выполняют всю предобработку и затем  передают
 
   управление программе  EXE$QIODRVPKT  операционной  системы.
 
   Она устанавливает пакет ввода/вывода в очередь  к  драйверу
 
   устройства и пытается передать управления драйверной  прог-
 
   рамме начала  ввода/вывода.  Если  устройство  занято,  она
 
   помещает пакет запроса ввода/вывода в очередь с  упорядоче-
 
 
 
                            - 230 -
 
                        00152-01 97 07-1
 
 
   нием по приоритетам пакетов, ожидающих освобождения данного
 
   устройства.
 
 
        Требуемое содержимое регистров:
 
 
        R3 - адрес пакета запроса ввода/вывода;
 
        R4 - адрес блока управления для текущего процесса;
 
        R5 - адрес блока управления устройством для устройства
 
    назначенного каналу ввода/вывода процесса.
 
 
        Описание
 
 
        EXE$QIODRVPKT  вызывает  EXE$INSIOQ,  которая,  прежде
 
   всего, повышает уровень приоритета прерывания  процесса  до
 
   форк-уровня драйвера (UCB$B_FIPL). Драйверный  форк-уровень
 
   является по соглашению приоритетным уровнем прерывания,  на
 
   котором драйверы устройств и операционная система читают  и
 
   изменяют критические части  блока  управления  устройством.
 
   Выполняясь на форк-уровне, EXE$INSIOQ уверена, что пока она
 
   работает, драйверный форк-процесс для этого  устройства  не
 
   может выполняться в то же время. EXE$INSIOQ проверяет  сос-
 
   тояние UCB (слово  состояния),  чтобы  проверить  занятость
 
   устройства.
 
 
        Если устройство не занято, то эта  программа  вызывает
 
   программу IOC$INITIATE операционной системы, чтобы  создать
 
   контекст форк-процесса, в котором драйвер может  обработать
 
   запрос ввода/вывода. Вызываемая программа операционной сис-
 
   темы создает такой контекст и активизирует драйвер  следую-
 
   щими действиями:
 
 
        1) устанавливает бит занятости в блоке управления уст-
 
   ройством (UCB$V_BSY в UCB$W_STS);
 
 
                            - 231 -
 
                        00152-01 97 07-1
 
 
        2)   сохраняет   адрес   текущего    пакета    запроса
 
   ввода/вывода в поле UCB - UCB$L_IRP;
 
 
        3) копирует параметры передачи, содержащиеся в  пакете
 
   запроса ввода/вывода, в блок управления устройством:
 
 
          - копирует  начальный  адрес   из   IRP$L_SVAPTE   в
 
            UCB$L_SVAPTE;
 
 
          - копирует  смещение  байта   внутри   страницы   из
 
            IRP$W_BOFF в UCB$W_BOFF;
 
 
          - копирует младшее слово счета байтов из  IRP$W_BCNT
 
            в UCB$W_BCNT;
 
 
        4) сбрасывает биты отмены ввода/вывода  и  таймаута  в
 
   слове  состояние  UCB  (UCB$V_CANCEL   и   UCB$VTIMEOUT   в
 
   UCB$W_STS);
 
 
        5) если в запросе ввода/вывода указан  диагностический
 
   буфер, что индицируется битом IRP$W_DIAGBUF в IRPSW_STS, то
 
   программа запоминает системное время в буфере,  на  который
 
   указывает IRP$L_DIAGBUF (системная  программа  обслуживания
 
   очереди запросов ввода/вывода уже выделила буфер);
 
 
        6) находит точку входа программы  начала  ввода/вывода
 
   драйвера устройства, используя следующую  цепочку  указате-
 
   лей:
 
 
        UCB  --->  DDT  --->  точка  входа  программы   начала
 
   ввода/вывода;
 
 
        7) передает  управление  драйверной  программе  начала
 
   ввода/вывода, используя инструкцию JMP.
 
 
 
                            - 232 -
 
                        00152-01 97 07-1
 
 
        Если EXE$INSIOQ находит, что  устройство  занято,  она
 
   помещает пакет ввода/вывода в очередь ожидания пакетов зап-
 
   росов ввода/вывода  к  данному  устройству  для  последющей
 
   обработки путем вызова EXE$INESRTIRP. Очередь ожидания  для
 
   пакета запроса ввода/вывода упорядочена по признакам:
 
 
        - время установки в очередь; очередь  обслуживается  в
 
   порядке поступления запросов;
 
 
        - приоритет пакета запроса ввода/вывода, который  изв-
 
   лекается из базового приоритета запрашивающего  процесса  и
 
   сохраняется в поле IRP$B_PRI.
 
 
        После завершения одной из  двух  операций,  EXE$INSIOQ
 
   понижает уровень приоритета прерывания до  уровня,  который
 
   существовал в начале ее выполнения, т.е.,  до  IPL$_ASTDEL.
 
   После этого она передает управление к EXE$QIODRVPKT,  кото-
 
   рая возвращается из системной программы обслуживания очере-
 
   ди запросов ввода/вывода по следующим шагам:
 
 
        1) загружает в R0 код состояния  успешного  завершения
 
   (SS$_NORMAL);
 
 
        2) понижает приоритетный уровень до нуля;
 
 
        3) изменяет текущий режим на  режим  доступа  процесса
 
   (во время запроса ввода/вывода) путем выполнения инструкции
 
   REI;
 
 
        4) возвращается из вызова системной службы.
 
 
        Система устанавливает и сбрасывает бит занятости  уст-
 
   ройства в слове состояния UCB. Это предохраняет драйвер  от
 
   вызова для обслуживания устройства, которое уже работает по
 
 
                            - 233 -
 
                        00152-01 97 07-1
 
 
   другому запросу.
 
 
        Когда программа начала ввода/вывода драйвера устройст-
 
   ва получает управление, процесс, который установил запрос в
 
   очередь, не может быть далее отображаемым (MAPPED)  процес-
 
   сом. Поэтому, драйвер должен подразумевать, что вся  инфор-
 
   мация, относящаяся к запросу, находится в блоке  управления
 
   устройством или в пакете запроса и что все адреса буферов в
 
   блоке управления устройством являются либо системными адре-
 
   сами, или номерами страничных кадров, которые могут интерп-
 
   ретироваться в любом контексте процесса.
 
 
        Для операций прямого ввода/вывода программы FDT должны
 
   также заблокировать в физической памяти все страницы  поль-
 
   зовательского буфера памяти, поскольку работа со страницами
 
   (PAGING) не может появиться на драйверном форк-уровне и  на
 
   более высоких уровнях приоритета  прерывания.  Не  гаранти-
 
   руется отображение виртуального адресного пространства про-
 
   цесса, пока операционная система  не  доставит  AST  режима
 
   ядра  к  запросившему  процессу  как  часть   постобработки
 
   ввода/вывода.
 
 
 
        8.8.4. EXE$ALTQUEPKT
 
 
 
        Драйверы  специального  назначения   используют   свои
 
   собственные  очереди  ввода/вывода   наряду   с   очередями
 
   ввода/вывода (UCB$L_IOQFL)  к  устройствам,  контролируемым
 
   операционной системой. Такие внутренние  очереди  позволяют
 
   драйверу обрабатывать запросы ввода/вывода, даже когда уст-
 
   ройство занято другой операцией ввода/вывода.
 
 
 
 
                            - 234 -
 
                        00152-01 97 07-1
 
 
        Данная программа позволяет драйверу игнорировать синх-
 
   ронизацию очереди ввода/вывода устройства. Когда она  вызы-
 
   вается из программы FDT, она  получает  доступ  к  драйверу
 
   через альтернативную программу начала  ввода/вывода,  точка
 
   входа в которую указывается в диспетчерской таблице драйве-
 
   ра (смещение DDT$L_ALTSTART). Когда используется эта  точка
 
   входа, очередь к устройству и флажок  занятости  устройства
 
   не принимаются во внимание. Таким образом, драйвер  активи-
 
   зируется вне зависимости от  того,  занято  устройство  или
 
   нет.
 
 
        Драйвер, который использует  программу  EXE$ALTQUEPKT,
 
   отвечает не только за свою внутреннюю очередь, но  также  и
 
   за синхронизацию этой внутренней очереди с  очередью,  под-
 
   держиваемой операционной системой.
 
 
        Драйвер   завершает   обработку    пакетов    запросов
 
   ввода/вывода путем вызова программы COM$POST. Эта программа
 
   помещает каждый пакет запроса в очередь на постобработку  и
 
   возвращает управление драйверу. После этого  драйвер  может
 
   выбрать другой пакет из внутренней очереди.  Дополнительная
 
   информация о COM$POST содержится в документе [3].
 
 
        Если драйвер обрабатывает в одно и то же  время  более
 
   одного пакета запроса, для них должны быть созданы  отдель-
 
   ные форк-блоки.
 
 
        Для программирования драйвера устройства,  одноременно
 
   обрабатывающего запросы ввода/вывода,  требуется  детальное
 
   знание внутренней конструкции операционной системы.
 
 
        Требуемое содержание регистров:
 
 
 
                            - 235 -
 
                        00152-01 97 07-1
 
 
        R3 - адрес пакета запроса ввода/вывода;
 
 
        R5 - адрес блока управления устройством.
 
 
        Содержимое регистров R0 - R5 разрушается после возвра-
 
   та в программу FDT.
 
 
        Описание
 
 
        EXE$ALTQUEPKT выполняет следующие действия:
 
 
        - сохраняет в стеке текущий уровень приоритета  преры-
 
   вания;
 
 
        - повышает уровень приоритета прерывания до драйверно-
 
   го форк-уровня (UCB$B_FIPL);
 
 
        - находит точку входа в альтернативную программу нача-
 
   ла ввода/вывода, используя следующую цепочку указателей:
 
 
             UCB ---> DDT ---> адрес альтернативного начала
 
                               ввода/вывода.
 
 
        - вызывает драйвер по найденному адресу альтернативно-
 
   го начала ввода/вывода.
 
 
        Когда  альтернативная  программа  начала  ввода/вывода
 
   заканчивает   работу,   она   возвращает    управление    к
 
   EXE$ALTQUEPKT, выполняя инструкцию RSB. В отличие от других
 
   программ выхода FDT, EXE$-ALTQUEPKT вызывается  инструкцией
 
   JSB, а не JMP. Эта вызванная программа восстанавливает уро-
 
   вень приоритета прерывания до уровня, который использовался
 
   в момент ее вызова, после чего возвращает  управление  выз-
 
   вавшей ее программе FDT. Эта программа  FDT  выполняет  всю
 
   постобработку   и   передает   управление    к    программе
 
 
                            - 236 -
 
                        00152-01 97 07-1
 
 
   EXE$QIORETURN.  Когда  программа   EXE$QIORETURN   получает
 
   управление, она выполняет следующие действия:
 
 
        1) устанавливает  в  R0  код  успешного  завершения  -
 
   SS$_NORMAL;
 
 
        2) понижает уровень приоритета прерывания до нулевого;
 
 
        3) возвращается (через инструкцию  RET)  к  диспетчеру
 
   системного обслуживания.
 
 
 
 
           9. НАПИСАНИЕ ПРОГРАММЫ НАЧАЛА ВВОДА/ВЫВОДА
 
 
 
 
        Драйверная программа начала ввода/вывода  активизирует
 
   устройство и затем ожидает от него прерывания или таймаута.
 
   В   данном   разделе   рассматривается   программа   начала
 
   ввода/вывода. В разделе  12  рассматривается  реактивизация
 
   драйверной программы, которая выполняет зависящую  от  уст-
 
   ройства постобработку ввода/вывода. За некоторыми  исключе-
 
   ниями, программа начала ввода/вывода, обсуждаемая в  после-
 
   дующих разделах, касается  передач  по  прямому  доступу  к
 
   памяти с использованием выделенного контроллера (контролле-
 
   ра с одним устройством).
 
 
 
        9.1. Передача управления началу ввода/вывода
 
 
 
        Программа  начала  ввода/вывода  драйвера   устройства
 
   получает управление от одной из двух программ  операционной
 
   системы: от EXE$QIODRVPKT или от IOC$REQCOM.
 
 
 
                            - 237 -
 
                        00152-01 97 07-1
 
 
        После завершения обработки FDT для  некоторого  пакета
 
   запроса ввода/вывода программа FDT  передает  управление  к
 
   EXE$QIODRVPKT. Если указанное устройство свободно,  то  для
 
   создания драйверного форк-процесса вызывается IOC$INITIATE.
 
   (эта процедура детализируется в п.8.8.3). Затем  драйверный
 
   форк-процесс   передает   управление    программе    начала
 
   ввода/вывода  соответствующего  драйвера.  Если  устройство
 
   занято, EXE$QIODRVPKT вызывает EXE$INSIOQ, которая устанав-
 
   ливает данный пакет в очередь ожидания пакета  ввода/вывода
 
   к данному устройству.
 
 
        После завершения  устройством  операции  ввода/вывода,
 
   выполняется выход из  драйверного  форк-процесса  передачей
 
   управления IOC$REQCOM. IOC$REQCOM устанавливает законченный
 
   пакет ввода/вывода в очередь на постобработку. После  этого
 
   она извлекает из очереди ожидания ввода/вывода к устройству
 
   следующий   пакет   запроса   ввода/вывода    и    вызывает
 
   IOC$INITIATE для создания нового драйверного форк-процесса,
 
   который получает управление в точке входа в программу нача-
 
   ла ввода/вывода драйвера.
 
 
 
        9.2. Контекст драйверного форк-процесса
 
 
 
        Программа начала ввода/вывода выполняется  не  в  кон-
 
   тексте пользовательского процесса. Она имеет следующий кон-
 
   текст:
 
 
   Системное отображение Отображаются  только таблицы страниц
 
                         системы. Поэтому драйверная программа
 
                         не  может  обращаться  к  виртуальным
 
                         адресам  в  пространстве  адресов
 
 
                            - 238 -
 
                        00152-01 97 07-1
 
 
                         процесса.
 
   Режим ядра            Исполнение производится в наиболее
 
                         привилегированном режиме доступа и
 
                         поэтому  может изменить IPL.
 
   Высокий IPL           Программа операционной системы, кото-
 
                         рая создает драйверный форк-процесс,
 
                         повышает IPL до драйверного  форк-
 
                         уровня перед активизацией  драйвера.
 
                         Драйвер может повышать
 
                         и понижать IPL в границах от драйвер-
 
                         ного форк-уровня до IPL$_POWER.
 
   Стек режима ядра      При выполнении используется стек ре-
 
   или стек прерывания   жима ядра или стек прерывания драй-
 
                         вер не должен изменять содержимое
 
                         стека без восстановления его исход-
 
                         ного состояния перед передачей
 
                         управления. Использование стека
 
                         зависит от того, является ли
 
                         начало ввода/вывода результатом но-
 
                         вого запроса или результатом окон-
 
                         чания предыдущего запроса. Различие
 
                         в стеках не должно влиять на опера-
 
                         ции программы начала ввода/вывода.
 
 
        В дополнение к описанному контексту  программы  опера-
 
   ционной системы, занимающиеся установкой в очередь  пакета,
 
   устанавливают R3 и R5  для  программы  начала  ввода/вывода
 
   следующим образом:
 
 
        - R3 содержит адрес пакета запроса ввода/вывода;
 
 
                            - 239 -
 
                        00152-01 97 07-1
 
 
        - R5 содержит адрес блока управления  устройством  для
 
   данного устройства.
 
 
        Все регистры, за исключением R0,R1,R2 и R4 должны быть
 
   сохранены.
 
 
        Программы установки пакета в очередь  перед  тем,  как
 
   передать управление программе начала ввода/вывода, копируют
 
   в свои соответствующие поля в блоке управления  устройством
 
   следующие поля пакета запроса ввода/вывода:
 
 
             -  IRP$W_BCNT   --->   UCB$W_BCNT
 
             -  IRP$W_BOFF   --->   UCB$W_BOFF
 
             -  IRP$L_SVAPTE --->   UCB$L_SVAPTE
 
 
 
        9.3. Активизация устройства
 
 
 
        Обработка, выполняемая программой начала ввода/вывода,
 
   специфическая для устройства. Программа начала ввода/вывода
 
   обычно содержит элементы для выполнения следующих функций:
 
 
        - анализ функции ввода/вывода;
 
 
        - передача информации о  передачи  из  пакета  запроса
 
   ввода/вывода в блок управления устройством;
 
 
        - получения и инициализации контроллера  и,  в  случае
 
   передач по прямому доступу к памяти,  -  ресурсов  адаптера
 
   общей шины;
 
 
        - модификации регистров устройства с целью его активи-
 
   зации.
 
 
 
 
 
                            - 240 -
 
                        00152-01 97 07-1
 
 
        Элементы программы ввода/вывода  выполняют  последова-
 
   тельность действий для активизации устройства. Разделы  10,
 
   11, 12 описывают такие действия,  выполняемые  для  образца
 
   устройства, обладающего прямым доступом к  памяти,  такого,
 
   как канал параллельных связей.  Детали  обработки,  однако,
 
   специфичны для каждого конкретного устройства.  Подробности
 
   о передачах по прямому  доступу  к  памяти,  относящиеся  к
 
   общей шине, рассматриваются в разделе 10.
 
 
 
        9.3.1. Получение доступа к контроллеру
 
 
 
        Если устройство присоединено к групповому контроллеру,
 
   программа начала ввода/вывода для назначения канала  данных
 
   контроллера  устройству  использует  макрокоманду  REQPCHAN
 
   операционной  системы.  Выделенный  контроллер  не  требует
 
   арбитража для канала данных контроллера. Указанная макроко-
 
   манда вызывает программу IOC$REQPCHANL операционной  систе-
 
   мы, которая приобретает право владения каналом данных конт-
 
   роллера.
 
 
        Управляемая программой старта  ввода/вывода  передача,
 
   рассматриваемая здесь, не требует  поиска,  предшествующего
 
   передаче. Ввод/вывод на  диске  служит  примером  передачи,
 
   которая требует предварительного поиска.  Чтобы  обеспечить
 
   перекрытие (одновременно  выполнение  поисков  и  передач),
 
   следует вызвать REQPCHAN с аргументом PRI = HIGH.  В  соот-
 
   ветствии с указанием этого аргумента, запрос  канала  поме-
 
   щается в голову очереди ожидания канала.
 
 
        Если канал недоступен, IOC$REQPCHANL  приостанавливает
 
   драйверную  обработку,  сохраняя  драйверный   контекст   в
 
 
                            - 241 -
 
                        00152-01 97 07-1
 
 
   форк-блоке UCB и помещая адрес форк-блока в очередь  ожида-
 
   ния канала. После этого она возвращает управление  програм-
 
   ме, вызвавшей драйвер, т.е., IOC$INSIOQ, как  это  показано
 
   на рис. 23.

 
 
                            - 242 -
 
                        00152-01 97 07-1
 
 
           Установка UCB в очередь ожидания канала
 
                            *******************************
                            *  Пользовательская программа *
                            *******************************
                                              /I\     IВызовы
                                               I      I
                       -------------------------      I
                       I                           *******
                       I                           * QIO *
                       I RET                       *******
                       I                              I JSB
                       I                              I
                ************* JMP************* JMP *******
                * QIORETURN *<---* QIODRVPKT *<----* FDT *
                *************    *************     *******
                                    /I\ I
                                 RSB I  I JSB
                                     I  I
                                 *************
         ----------------------->*  INSIOQ   *
         I                       *************
         I                             I
         I RSB                         I JSB
         I                             I
   ************    *********     *************
   * ********** JSB*       * JMP *           *
   **REQCHAN **<---*Драйвер*<----* Инициация *
   ************    *       *     *           *
   ************    *********     *************
         I
         I
         I
   ***************
   *   *Адрес*   *
   *   * UCB *   * Очередь ожидания канала
   ***************
 
                             Рис.23
 
 
 
 
        Форк-блок в UCB содержит теперь полный контекст приос-
 
   тановленного драйвера:
 
 
        - сохраненный  R3,  содержащий  адрес  пакета  запроса
 
   ввода/вывода;
 
 
        - неявно сохраненный R5, содержащий адрес UCB;
 
 
        - адрес возврата в драйвер.
 
 
 
 
                            - 243 -
 
                        00152-01 97 07-1
 
 
        IOC$REQPCHANL не сохраняет  содержимого  регистра  R4,
 
   поскольку она выполняет запись в R4 перед возвратом  управ-
 
   ления драйверу.
 
 
        Если канал доступен, IOC$REQPCHANL определяет местопо-
 
   ложение блока диспетчеризации прерывания для  канала  через
 
   указатель в блоке управления устройством:
 
 
        UCB-----> CRB-----> IDB
 
 
        Блок диспетчеризации прерывания содержит  также  адрес
 
   регистра управления и  состояния  для  канала  (IDB$L_CSR).
 
   IOC$REQPCHANL засылает адрес регистра управления и  состоя-
 
   ния в R4. Драйвер устройства, присоединенного к выделенному
 
   контроллеру, должен содержать  программу,  необходимую  для
 
   загрузки адреса регистра управления и состояния в R4.
 
 
        IOC$REQPCHANL записывает также адрес UCB  нового  вла-
 
   дельца  канала  в  поле  блока  диспетчеризации  прерывания
 
   (IDB$L_OWNER) этого владельца. Позже  драйверная  программа
 
   обслуживания прерывания читает это поле IDB, чтобы  опреде-
 
   лить, какое устройство владеет каналом данных  контроллера.
 
   Драйвер для выделенного контроллера должен  заполнить  поле
 
   IDB$L_OWNER в своей программе инициализации контроллера или
 
   устройства.
 
 
        Драйвер должен поддерживать стек в известном и  согла-
 
   сованном состоянии для работы  механизма  очереди  ожидания
 
   ресурса. Когда IOC$REQPCHANL получает управление, две верх-
 
   них единицы стека должны быть двумя адресами возврата:
 
 
        - 0(SP) - адрес следующей инструкции,  которая  должна
 
   быть выполнена в драйверном форк-процессе;
 
 
                            - 244 -
 
                        00152-01 97 07-1
 
 
        - 4(SP) - адрес следующей инструкции,  которая  должна
 
   быть выполнена  в  программе,  которая  вызвала  драйверную
 
   программу начала ввода/вывода.
 
 
 
        9.3.2. Получение кода функции  ввода/вывода  и
 
               преобразование    этой    функции     и
 
               модификаторов
 
 
 
        Программа начала ввода/вывода  извлекает  код  функции
 
   ввода/вывода и модификаторы функции из  поля  IRPSW_FUNC  и
 
   транслирует их в коды функции, специфические для  устройст-
 
   ва, для загрузки их в регистр команд и состояния устройства
 
   или в другие регистры  управления.  Программа  ввода/вывода
 
   устанавливает битовую маску, которая  должна  изменяться  в
 
   дальнейшем  последующими  инструкциями  и   загружаться   в
 
   регистр управления и состояния, когда драйвер действительно
 
   запускает устройство.  Другими  словами,  программа  начала
 
   ввода/вывода преобразует модификаторы функции, содержащиеся
 
   в IRP$W_FUNC, в зависящую от устройства установку  битов  в
 
   универсальном регистре.
 
 
        В данной точке драйвер устройства выполняет  процедуры
 
   для получения ресурсов общей шины. Эти процедуры  детализи-
 
   руются в разделе 10.
 
 
 
        9.3.3. Вычисление длины передачи
 
 
 
        Так как устройство, управляемое данным драйвером, ожи-
 
   дает счета слов для передачи, программа начала ввода/вывода
 
   вычисляет длину передачи в словах, путем деления поля счета
 
 
 
                            - 245 -
 
                        00152-01 97 07-1
 
 
   байтов в блоке управления устройством  (UCB$W_BCNT)  на  2.
 
   Программа загружает это вычисленное значение в регистр сче-
 
   та слов устройства. Одна  из  программ  FDT,  обрабатывющих
 
   запрос ввода/вывода, должна убедиться, что счет байтов  для
 
   передачи имеет четное значение. Нечетный счет байтов приве-
 
   дет к неполучению пользователем последнего байта данных.
 
 
 
        9.3.4. Вычисление адреса начала передачи
 
 
 
        Программа начала ввода/вывода вычисляет адрес  переда-
 
   чи, используя поля смещения (байт в блоке  управления  уст-
 
   ройством - UCB$в_BOFF) и номер начального регистра  отобра-
 
   жения   (CRB$L_INTD+VEC$W_MAPREG).   Результатом   является
 
   18-разрядная  величина,  представляющая  адрес  в  адресном
 
   пространстве общей шины. В подразделе  10.4  детализируется
 
   вычисление начального адреса для передач по общей шине.
 
 
        Программа начала  ввода/вывода  сохраняет  младшие  16
 
   разрядов вычисленного адреса общей шины в буферном регистре
 
   адреса устройства. Два старших разряда вычисленного  адреса
 
   общей шины сохраняются в битах расширения памяти  регистра,
 
   который содержит битовую маску рассмотренную  в  п.  9.3.2.
 
   Таким образом  этот  регистр  будет  содержать  данные  для
 
   регистра команд и состояния устройства и два старших разря-
 
   да адреса общей шины.
 
 
 
        9.3.5. Подготовка  битовой  маски  активизации
 
               устройства
 
 
 
        Программа начала ввода/вывода  подготавливает  битовую
 
 
 
                            - 246 -
 
                        00152-01 97 07-1
 
 
   маску активизации устройства путем установки бита  разреше-
 
   ния прерывания и бита действия (GO) в универсальном регист-
 
   ре, уже использовавшемся ранее. Этот универсальный  регистр
 
   содержит в данной точке  полную  команду  начала  передачи.
 
   Когда программа  начала  ввода/вывода  копирует  содержимое
 
   этого регистра в регистр  команд  и  состояния  устройства,
 
   устройство начинает передачу. Перед активизацией устройства
 
   программа начала ввода/вывода должна выполнить  шаги,  ука-
 
   занные в пп. 9.3.6 и 9.3.7.
 
 
 
        9.3.6. Блокировка всех прерываний
 
 
 
        Программа начала ввода/вывода использует  макрокоманду
 
   DSBINT операционной системы для блокировки всех прерываний.
 
   Макрокоманда поднимает приоритетный уровень до IPL$_POWER и
 
   сохраняет предшествующую установку приоритетного уровня  на
 
   вершине стека.
 
 
 
        9.3.7. Проверка сбоя питания
 
 
 
        Программа начала ввода/вывода проверяет бит сбоя пита-
 
   ния в слове состояния UCB (UCB$V_POWER в UCB$W_STS),  чтобы
 
   определить, не было ли сбоя  питания  с  момента  получения
 
   управления программой начала ввода/вывода. Если этот бит не
 
   установлен, можно начинать передачу.
 
 
        Если этот бит установлен, сбой питания мог иметь место
 
   в  интервале  между  временем,   когда   программа   начала
 
   ввода/вывода выполнила запись в первый регистр устройства и
 
   временем, когда программа начала ввода/вывода готова  акти-
 
 
 
                            - 247 -
 
                        00152-01 97 07-1
 
 
   визировать устройство. Такой сбой питания мог изменить  уже
 
   заполненные регистры устройства и  вызвать  непредсказуемое
 
   поведение устройства, если оно будет запущено.
 
 
        Если  бит  UCB$V_POWER  установлен,  программа  начала
 
   ввода/вывода ответвляется на обрабочик ошибки  в  драйвере.
 
   Драйвер несет ответственность за очистку UCB$V_POWER, преж-
 
   де чем могут быть инициализированы процедуры восстановления
 
   из ошибки. Многие драйверы  очищают  это  поле  и  передают
 
   управление на программу начала ввода/вывода, которая  начи-
 
   нает повторную обработку запроса ввода/вывода.
 
 
 
        9.3.8. Активизация устройства
 
 
 
        Если  сбоя   питания   не   было,   программа   начала
 
   ввода/вывода  копирует  содержимое  управляющей   маски   в
 
   регистр управления и состояния устройства. Когда устройство
 
   обнаруживает новое содержание  этого  регистра,  начинается
 
   реальная передача.
 
 
 
        9.4. Ожидание прерывания или таймаута
 
 
 
        Как только программа начала ввода/вывода активизирова-
 
   ла устройство, драйверный форк-процесс не может  продолжать
 
   работу, пока не появится одно из двух внешних событий:
 
 
        - устройство генерирует аппаратное прерывание;
 
 
        - устройство  не  генерирует  аппаратного   прерывания
 
   внутри ожидаемого лимита времени; т.е., появляется  таймаут
 
   устройства.
 
 
 
                            - 248 -
 
                        00152-01 97 07-1
 
 
        Выполняясь все еще на  уровне  IPL$_POWER,  драйверная
 
   программа начала ввода/вывода запрашивает операционную сис-
 
   тему, чтобы приостановить драйверный форк-процесс,  исполь-
 
   зуя одну из следующих макрокоманд МОС ВП:
 
 
        WFIKPCH - ожидать прерывания или таймаута и  сохранять
 
   канал данных контроллера;
 
 
        WFIRLCH - ожидать прерывания или таймаута и освободить
 
   канал данных контроллера.
 
 
        Макрокоманды используют программы, которые  на  выходе
 
   возвращают IPL на  предшествующий  уровень.  Эти  программы
 
   рассчитывают получить возвращаемый IPL из стека. IPL сохра-
 
   няется в стеке макрокомандой DSBINT, как это рассмотрено  в
 
   п. 9.3.7.
 
 
        Драйверы сохраняют канал данных контроллера, пока  они
 
   ожидают прерывания или таймаута. Драйверы  для  выделенного
 
   контроллера (с единственным устройством)  всегда  сохраняют
 
   этот канал, поскольку другие устройства,  которые  могут  в
 
   нем нуждаться, отсутствуют. В случае группового контроллера
 
   некоторые операции, такие как поиск диска, не требуют конт-
 
   роллера, как только операция была  начата.  В  этом  случае
 
   драйвер может пожелать освободить канал данных  контроллера
 
   на время ожидания прерывания или таймаута, так  что  другие
 
   устройства контроллера могут начать свои операции.
 
 
 
        9.4.1. Форматы макрокоманд WFIKPCH и WFIRLCH
 
 
 
        Программа начала ввода/вывода использует один из  двух
 
   макрокоманд WFIKPCH и WFIRLCH для ожидания прерывания  уст-
 
 
                            - 249 -
 
                        00152-01 97 07-1
 
 
   ройства.
 
 
        Форматы:
 
 
        WFIKPCH    EXCPT,[TIME]
 
        WFIRLCH    EXCPT,[TIME]
 
 
   EXCPT  - адрес программы таймаута для данного устройства
 
 
   TIME (время)
 
          - число секунд ожидания перед сигнализацией  о  тай-
 
            мауте устройства. Это число должно быть больше или
 
            равно 2. Минимальное значение  2  требуется  из-за
 
            того, что механизм таймаута имеет точность в  пре-
 
            делах одной секунды. Если не указано никакое  чис-
 
            ло,  макрокоманда  использует  величину  65536  по
 
            умолчанию.
 
 
 
        9.4.2. Расширение макрокоманды WFIKPCH
 
 
 
        Так как макрокоманды аналогичны,  последущее  описание
 
   рассматривает расширение только макрокоманды WFIKPCH.
 
 
        Если драйвер в вызове макрокоманды указывает  аргумент
 
   времени, макрокоманда помещает значение этого  аргумента  в
 
   стек. Если аргумент времени  не  указывается,  макрокоманда
 
   помещает в стек значение 65536. Программа  таймера  МОС  ВП
                    
   использует значение  времени  для  вычисления  длительности
 
   ожидания до передачи управления обработчику таймаута.  Мак-
 
   рокоманда завершает свое выполнение двумя строками програм-
 
   мы:
 
 
 
 
 
                            - 250 -
 
                        00152-01 97 07-1
 
 
        JSB     G^IOC$WFIKPCH
 
        .WORD   EXCPT-.
 
 
        При выполнении инструкции JSB адрес, следующий за этой
 
   JSB, помещается в стек в качестве адреса, к  которому  нор-
 
   мально будет возвращаться  вызванная  программа  с  помощью
 
   инструкции RSB.
 
 
 
        9.4.3. Программа IOC$WFIKPCH
 
 
 
        Программа операционной системы IOC$WFIKPCH,  вызванная
 
   из макрокоманды WFIKPCH, выполняет функции, необходимые для
 
   драйверного форк-процесса, чтобы перейти к ожиданию  преры-
 
   вания или таймаута устройства. Прежде всего, эта  программа
 
   прибавляет 2 к адресу на вершине  стека,  так  что  вершина
 
   стека содержит адрес инструкции  в  драйвере  после  вызова
 
   макрокоманды. Этот  адрес  указывает  действительное  место
 
   возобновления драйверной обработки в результате  выполнения
 
   инструкции JSB программой обслуживаниия прерывания.
 
 
        Затем IOC$WFIKPCH переписывает  содержимое  R3,  R4  и
 
   адрес возврата в драйвер из вершины стека (в  первую  часть
 
   блока управления устройством, т.е., в форк-блок UCB). Прог-
 
   рамма обслуживания прерывания должна восстановить R5, чтобы
 
   он содержал после прерывания адрес  блока  управления  уст-
 
   ройством. Программа обслуживания прерывания обычно получает
 
   адрес блока управления устройством из поля IDB$L_OWNER бло-
 
   ка диспетчеризации прерывания.
 
 
        Программа операционной системы,  которая  обнаруживает
 
   таймаут устройства, вычисляет  адрес  драйверной  программы
 
 
 
                            - 251 -
 
                        00152-01 97 07-1
 
 
   таймаута, вычитая 2 из РС, сохраненного в форк-блоке UCB, и
 
   выполняя косвенный вызов через результат, например:
 
 
   MOVL   UCB$L_FPC(R5),R2 ;получить сохраненный РС.
 
   CVTWL  -(R2),-(SP)      ;получить смещение к обрабочику тай
 
                           ;маута.
 
   ADDL   (SP)+,R2         ;прибавить к относительному адресу
 
                           ;драйвера, чтобы получить относите-
 
                           ;льный адрес обработчика.
 
   JSB    (R2)             ;вызвать обработчик драйвера.
 
 
        IOC$WFIKPCH устанавливает биты в блоке управления уст-
 
   ройством (UCB$V_INT и UCB$V_TIM в UCB$W_STS) для  указания,
 
   что от устройства  ожидаются  прерывания  и  таймауты.  Эта
 
   программа записывает также абсолютное время  таймаута  уст-
 
   ройства в поле UCB$L_DUETIM. Абсолютное время является чис-
 
   лом секунд, прошедших с момента начальной загрузки  системы
 
   плюс число секунд, указанных в аргументе  времени  макроко-
 
   манды.
 
 
        Наконец, эта программа  заново  разрешает  прерывания,
 
   понижая IPL до предыдущего  уровня  в  драйвере,  т.е.,  до
 
   драйверного форк-уровня, и возвращает управление к програм-
 
   ме, вызвавшей драйвер.
 
 
 
        9.5. Реакция   на    ожидаемое    прерывание
 
             устройства
 
 
 
        Только контекст, сохраненный для  драйвера,  находится
 
   теперь в блоке управления устройством. Он содержит  следую-
 
   щую информацию:
 
 
 
                            - 252 -
 
                        00152-01 97 07-1
 
 
        - описание запроса ввода/вывода и состояние  устройст-

   ва;
 
 
        - содержимое R3 и R4;
 
 
        - неявное содержимое R5, т.е., адрес форк-блока UCB.
 
 
        - адрес возврата драйвера.
 
 
        - неявный адрес программы таймаута устройства.
 
 
        По соглашению, R4 часто содержит адрес регистра команд
 
   и состояния; он позволяет драйверу проверять регистры  уст-
 
   ройства. Когда драйверный форк-процесс возобновляет  управ-
 
   ление после обработки прерывания, R5 содержит адрес UCB. Он
 
   является ключом к базе данных ввода/вывода,  которая  имеет
 
   отношение к текущей операции ввода/вывода.
 
 
        Когда устройство прерывает, драйверная программа  обс-
 
   луживания прерывания анализирует прерывание, как это указы-
 
   вается в разделе 11 и суммируется ниже:
 
 
        - идентифицирует адрес UCB устройства,  которое  вызы-
 
   вает прерывание;
 
 
        - получает состояние устройства или контроллера  (если
 
   это необходимо) из регистров устройства и сохраняет состоя-
 
   ние в блоке управления устройством;
 
 
        - восстанавливает регистры  драйверного  форк-процесса
 
   из форк-блока UCB, восстанавливает R5 адресом UCB и реакти-
 
   визирует приостановленный  драйвер  по  PC,  хранящемуся  в
 
   форк-блоке UCB.
 
 
 
 
 
                            - 253 -
 
                        00152-01 97 07-1
 
 
        Если вместо запроса прерывания устройство переходит  в
 
   состояние таймаута, программа таймера операционной  системы
 
   реактивизирует приостановленный драйверный форк-процесс  по
 
   адресу программы  таймаута.  Подробная  обработка  таймаута
 
   устройства приведена в подразделе 12.2.
 
 
 
 
        10. ОПИСАНИЕ ПЕРЕДАЧ ПО ОБЩЕЙ ШИНЕ С ПРЯМЫМ ДОСТУПОМ К
 
            ПАМЯТИ
 
 
 
 
        Драйвер, выполняющий  передачи  с  прямым  доступом  к
 
   памяти через общую шину, должен принять во внимание  опера-
 
   ции общей шины. Операционная система МОС ВП и  база  данных
 
   ввода/вывода берут на себя большую часть управления регист-
 
   рами отображения общей шины и ресурсами  путей  данных  для
 
   драйвера устройства. Необходимо различать тип путей  данных
 
   (прямой или буферизованный), соответствующий устройству,  и
 
   правильно  заполнять   поля   UCB,   описывающие   операцию
 
   ввода/вывода.  При  выполнении  этих   условий   драйверный
 
   форк-процесс вызывает программы операционной системы, кото-
 
   рые принимают на себя заботу о детальных операциях адаптера
 
   общей шины.
 
 
        База  данных  ввода/вывода  содержит  блок  управления
 
   адаптером (ADP), который описывает адаптер общей шины. Этот
 
   блок содержит информацию о  распределении  путей  данных  и
 
   регистров отображения адаптера общей шины.
 
 
        Блок управления адаптером содержит  также  виртуальный
 
   адрес регистра конфигурации адаптера общей шины. Все прочие
 
   регистры адаптера  расположены  на  фиксированном  смещении
 
 
                            - 254 -
 
                        00152-01 97 07-1
 
 
   относительно регистра конфигурации. Программы  операционной
 
   системы для управления адаптером общей шины  изменяют  пути
 
   данных адаптера и его регистры отображения по  запросам  от
 
   драйверных форк-процессов.
 
 
        Драйверные форк-процессы не обращаются к блоку  управ-
 
   ления адаптером общей  шины.  Драйверы  вызывают  программы
 
   операционной системы, которые выполняют следующее  обслужи-
 
   вание, касающееся адаптера:
 
 
        - назначают буферизованный путь данных;
 
        - назначают регистры отображения;
 
        - загружают регистры отображения;
 
        - освобождают регистры отображения;
 
        - очищают буферизованный путь данных;
 
        - освобождают буферизованный путь данных.
 
 
        Система создает драйверный форк-процесс, вызывая прог-
 
   рамму начала ввод/вывод в драйвере устройства. Для  инициа-
 
   ции  передачи  устройства  ввода/вывода  на   общей   шине,
 
   форк-процесс  выполняет  некоторые  или  все  из  следующих
 
   действий:
 
 
        1) запрашивает буферизованный путь данных;
 
 
        2) запрашивает регистры отображения;
 
 
        3) загружает регистры отображения;
 
 
        4) вычисляет начальный адрес на общей шине;
 
 
        5) активизирует устройство;
 
 
        6) ожидает прерывание.
 
 
 
                            - 255 -
 
                        00152-01 97 07-1
 
 
        Когда аппаратное прерывание индицирует,  что  передачи
 
   по вводу/выводу окончены,  драйверный  форк-процесс  прове-
 
   ряет, закончилась ли передача  успешно  или  ее  выполнение
 
   было нарушено. В  заключение  драйвер  выполняет  следующие
 
   действия:
 
 
        1) очищает буферизованный путь данных;
 
 
        2) освобождает путь данных;
 
 
        3) освобождает регистры отображения.
 
 
        Все эти действия связаны с адаптером общей шины.  Опе-
 
   рационная система скрывает от драйвера все  свои  действия,
 
   связанные с адаптером общей шины.
 
 
 
        10.1. Запрос буферизованного пути данных
 
 
 
        Система позволяет драйверу запрашивать  временное  или
 
   постоянное назначение буферизованного  пути  данных.  После
 
   того, как драйверный форк-процесс получает доступ  к  конт-
 
   роллеру, он запрашивает буферизованный  путь  данных  путем
 
   вызова макрокоманды REQDPR операционной системы. Эта макро-
 
   команда вызывает программу МОС ВП, называемую IOC$REQDATAP,
 
   которая определяет местоположение блока управления  адапте-
 
   ром общей шины. Чтобы добиться этого,  вызванная  программа
 
   использует последовательность указателей, которые начинают-
 
   ся в текущем блоке управления устройством:
 
 
                   UCB ---> CPB ---> ADP
 
 
        Информация о назначении путей данных а  ADP  указывает
 
   доступный    буферизованный    путь    данных.    Программа
 
 
                            - 256 -
 
                        00152-01 97 07-1
 
 
   IOC$REQDATAP присваивает путь  данных  драйверу,  запоминая
 
   номер пути данных в блоке запроса канала и указывая в блоке
 
   управления адаптером (ADP), что путь  данных  используется.
 
   После   этого   управление    возвращается    к    драйверу
 
   форк-процессу. Блок управления адаптером рассматривается  в
 
   документе [3].
 
 
        Если доступные пути данных  отсутствуют,  IOC$PEQDATAP
 
   сохраняет драйверный контекст  (R3,  R4  и  рс)  в  UCB  (в
 
   форк-блоке) и помещает адрес форк-блока,  который  является
 
   также адресом блока управления устройством и содержимым P5,
 
   в очередь ожидания пути данных  ADR.  Драйверный  форк-блок
 
   остается в очереди, пока не выполняется следующие два усло-
 
   вия:
 
 
        - путь данных доступен;
 
 
        - драйверный форк-блок является  очередной  записью  в
 
   очереди ожидания путей данных.
 
 
        После появления этих  событий  программа  IOC$RELDATAP
 
   операционной системы назначает путь данных приостановленно-
 
   му драйверу и реактивизирует драйверный форк-процесс.
 
 
 
        10.1.1. Запрос постоянного буферизованного пути
 
                данных
 
 
 
        Драйвер устройства может получить постоянный буферизо-
 
   ванный путь данных с помощью кода в программе инициализации
 
   устройства. Следующие действия приводят к  назначению  пос-
 
   тоянного буферизованного пути данных:
 
 
 
 
                            - 257 -
 
                        00152-01 97 07-1
 
 
        1) проверить бит блокирования пути (VEC$V_PATHLOCK)  в
 
   поле   номера   пути   данных    блока    запроса    канала
 
   (CRB_INTD+VEC$B_датаратн), чтобы убедиться, что путь данных
 
   не назначен уже этому устройству.
 
 
        2) вызвать подпрограмму IOC$REQDATAPNW для  присвоения
 
   пути данных:
 
 
                  JSB   G^IOC$REQDATAPNW
 
 
        Если программа назначает путь данных,  она  запоминает
 
   номер  пути  данных,  который  она  использовала,  в   поле
 
   VEC$B_DAтаратн блока запроса канала и передает управление с
 
   установленным младшим битом в R0. Если же  подпрограмма  не
 
   может назначить пути данных, она возвращает  управление  со
 
   сброшенным младшим битом R0;
 
 
        3) установить бит блокирования пути (VEC$V_PATHLOCK) в
 
   VEC$B_Dатаратн блока запроса канала.
 
 
        Процедура загрузки драйвера вызывает программу инициа-
 
   лизации устройства для каждого  устройства,  обслуживаемого
 
   данным  драйвером.  Программа   инициализации   устройства,
 
   содержащая код, описанный выше, будет назначать  постоянный
 
   буферизированный путь данных для каждого CRB, связанного  с
 
   драйвером, т.е., один путь  для  каждого  контроллера  уст-
 
   ройства, обслуживаемого драйвером.
 
 
        Число постоянно закрепленных путей данных  может  быть
 
   неограниченным, в этом случае система может  оказаться  без
 
   путей для ее собственных нужд.  В  этом  случае,  передачи,
 
   которые требуют в этом случае,  передачи,  которые  требуют
 
   буферизованнго пути  данных,  будут  ожидать  неограниченно
 
 
                            - 258 -
 
                        00152-01 97 07-1
 
 
   долго.
 
 
 
        10.1.2. Запрос прямого пути данных
 
 
 
        Поскольку адаптер общей шины сам арбитрирует устройст-
 
   ва, которые желают использовать прямой путь данных,  а  CRB
 
   инициализируется в 0 (O=прямой путь данных),  драйверам  не
 
   требуется использовать  макрооператор  REQDPR  для  запроса
 
   прямого пути данных.
 
 
 
        10.1.3. Смешанные   передачи   по   прямому   и
 
                буферизованному пути данных
 
 
 
        Драйвер может использовать буферизованные пути  данных
 
   для некоторых операций, а затем для других  операций  может
 
   использовать прямые пути данных. Чтобы выполнить эту  зада-
 
   чу, драйвер должен назначить буферизованные пути данных для
 
   буферизованного  ввода/вывода.  После  окончания   операции
 
   драйвер должен очистить и освободить путь данных.  Освобож-
 
   дение автоматически сбрасывает номер пути  данных  в  ноль,
 
   который означает прямой  путь  данных.  Драйвер  не  должен
 
   освобождать прямой путь данных,  хотя  он  должен  очистить
 
   этот путь. (очистка прямого пути данных состоит в  отсутст-
 
   вии операции -NOP - и всегда выполняется успешно).
 
 
 
        10.2. Запрос регистров  отображения  адаптера
 
              общей шины
 
 
 
        Операционная система  позволяет  драйверу  присваивать
 
   регистры на временное или постоянное пользование.
 
 
                            - 259 -
 
                        00152-01 97 07-1
 
 
        10.2.1. Назначение регистров отображения
 
 
 
        Когда драйверный форк-процесс получает доступ к  конт-
 
   роллеру он запрашивает набор регистров отображения адаптера
 
   общей шины с помощью макрокоманды REQMPR операционной  сис-
 
   темы. Макрокоманда вызывает программу IOC$-REQMAPREG, кото-
 
   рая вычисляет количество регистров отображения, необходимых
 
   для передачи. Вычисление основывается на поле счета  байтов
 
   передачи и на поле байтового смещения блока управления уст-
 
   ройством (UCB$W_BCNT и UCB$W_BOFF).
 
 
        Процедура назначения регистров отображения  аналогична
 
   той, которая использовалась при назначении  буферизованного
 
   пути данных. Прежде всего, IOC$REQMAPREG определяет  место-
 
   положение блока управления адаптером по  последовательности
 
   указателей, которые начинаются с текущего блока  управления
 
   устройством:
 
 
        UCB ---> CRB ---> ADP
 
 
        Затем эта программа проверяет информацию о распределе-
 
   нии регистров отображения, чтобы отыскать  требуемое  коли-
 
   чество смежных  регистров  отображения.  Если  в  настоящий
 
   момент такие регистры недоступны, программа сохраняет драй-
 
   верный контекст (R3, R4, PC) в форк-блоке  UCB  и  помещает
 
   адрес форк-блока (являющийся также адресом UCB и содержимым
 
   R5) в очередь ожидания регистров отображения.
 
 
        Когда регистры отображения доступны, программа  выпол-
 
   няет их назначение и подправляет информацию о распределении
 
   соответствующих регистров отображения  в  блоке  управления
 
   адаптером. После этого программа записывает номер начально-
 
 
                            - 260 -
 
                        00152-01 97 07-1
 
 
   го регистра отображения, количество  регистров  отображения
 
   (назначенных) в блок запроса канала и возвращает управление
 
   в драйверный форк-процесс.
 
 
 
        10.2.2. Постоянное     назначение     регистров
 
                отображения
 
 
 
        Драйвер может получить постоянное назначение регистров
 
   отображения с помощью кода в программе  инициализации  уст-
 
   ройства. Количество регистров отображения, назначаемых пос-
 
   тоянно, должно быть достаточным для максимально длиной воз-
 
   можной передачи. Постоянное назначение регистров  отображе-
 
   ния выполняется следующими действиями:
 
 
        1)    проверить     бит     блокировки     отображения
 
   (VEC$V_MAPLOCK)      в      блоке      запроса       канала
 
   (CRB$L_INTD+VEC$W_MAPREG);
 
 
        2) загрузить число требуемых регистров  отображения  в
 
   R3;
 
 
        3) вызвать программу IOC$ALOUBAMAPN инструкцией JSB:
 
 
                JSB   G^IOC$ALOUBAMAPN
 
 
        Если вызванная программа успешно выполняет распределе-
 
   ние регистров отображения, она запоминает число назначенных
 
   регистров отображения и номер начального регистра отображе-
 
   ния  в  блоке  запроса  канала  (CRB$L_INTD+VEC$B_NUMREG  и
 
   CRB$L_INTD+VEC$W_MAPREG, соответственно и возвращает управ-
 
   ление с установленным младшим битом в R0. В противном  слу-
 
   чае она возвращает управление с младшим битом R0,  установ-
 
 
 
                            - 261 -
 
                        00152-01 97 07-1
 
 
   ленным в нуль;
 
 
        4) установить бит блокировки отображения в блоке  зап-
 
   роса канала.
 
 
        Процедура загрузки драйвера вызывает программу инициа-
 
   лизации устройства для каждого устройства,  относящегося  к
 
   драйверу. Если программа инициализации устройства  содержит
 
   программу IOC$ALOUBAMAPN, она выполняет постоянное  закреп-
 
   ление одного набора регистров отображения для каждого  CRB,
 
   относящегося к драйверу, т.е., одного набора регистров  для
 
   каждого контроллера устройства, который обслуживается драй-
 
   вером.
 
 
 
        10.3. Загрузка регистров отображения адаптера
 
              общей шины
 
 
 
        Когда драйверный форк-процесс выполнил присвоение пути
 
   данных и зарезервировал  набор  регистров  отображения,  он
 
   может обратиться к операционной системе  с  целью  загрузки
 
   регистров отображения номерами страничных кадров, посредст-
 
   вом макрокоманды LOADUBA. Эта макрокоманда  вызывает  прог-
 
   рамму IOC$LOADUBAMAP операционной системы,  которая  загру-
 
   жает каждый назначенный регистр отображения пятью единицами
 
   данных:
 
 
        - установкой бита, указывающего, является  ли  регистр
 
   отображения действительным;
 
 
        - установкой бита, указывающего, начинается ли переда-
 
   ча с нечетного или с четного байта внутри слова;  этот  бит
 
   устанавливается, если младший бит UCB$W_ BOFF равен I;
 
 
                            - 262 -
 
                        00152-01 97 07-1
 
 
        - номером используемого для передачи пути данных;
 
 
        - номером страничного кадра страницы в памяти;
 
 
        - установкой бита, указывающего, что передачи произво-
 
   дятся в режиме доступа к произвольной ячейке, выравненной в
 
   границах двойного слова. Этот  бит  устанавливается,  когда
 
   VEC$LWAE установлен в VEC$B_DATAPATH.
 
 
        Программа IOC$LOADUBAMAP загружает  номер  страничного
 
   кадра первой страницы передачи в первый выделенный  регистр
 
   отображения, номер страничного кадра  второй  страницы  для
 
   передачи - во второй регистр отображения и т.д.
 
 
        Программа IOC$LOADUBAMAP  устанавливает  бит  действи-
 
   тельности в каждом назначенном регистре отображения,  кроме
 
   последнего. Она сбрасывает бит действительности в  конечном
 
   регистре отображения, чтобы  предотвратить  предвыборку  из
 
   недействительного номера кадра страницы.
 
 
        Для вычисления номера кадра страницы, используемого  в
 
   передачах по вводу/выводу,  IOC$LOADUBAMAP  использует  три
 
   поля, которые заполняются  операционной  системой  в  блоке
 
   управления устройством:
 
 
        - UCB$W_BOFF - байтовое  смещение  в  первой  странице
 
   передачи;
 
 
        - UCB$W_BCNT - число передаваемых байтов;
 
 
        - UCB$L_SVAPTE - виртуальный  адрес  входа  в  таблицу
 
   страниц, которая содержит номер  страничнего  кадра  первой
 
   страницы, используемой для передачи.
 
 
 
 
                            - 263 -
 
                        00152-01 97 07-1
 
 
        Программа IOC$LOADUBAMAP определяет номер пути данных,
 
   номер первого регистра отображения, адрес первого  регистра
 
   отображения и количество  регистров  отображения  из  блока
 
   запроса канала и блока управления адаптером общей шины:
 
 
        UCB ---> CRB ---> номер пути данных
 
        UCB ---> CRB ---> номер первого регистра отображения
 
        UCB ---> CRB ---> ADP ---> виртуальный адрес первого
 
                                   регистра отображения
 
        UCB ---> CRB ---> количество регистров отображения
 
 
        Драйверы, которые управляют устройствами общей шины  с
 
   побайтной адресации,  вызывают  программу  IOC$LOADUBAMAPA.
 
   Эта  программа  выполняет  те  же  самые  функции,  что   и
 
   IOC$LOADUBAMAP, за единственным исключением.  Когда  первая
 
   из них загружает регистры отображения, она  сбрасывает  бит
 
   смещения байта, даже если  передача  начинается  по  адресу
 
   нечетного байта.
 
 
        Когда IOC$LOADUBAMAP загрузила все регистры  отображе-
 
   ния и пометила недействительность последнего регистра отоб-
 
   ражения,    она    возвращает    управление     драйверному
 
   форк-процессу.
 
 
 
        10.4. Вычисление начального адреса передачи
 
 
 
        Драйверный  форк-процесс  должен  вычислить  начальный
 
   адрес передач по общей шине и загрузить этот адрес в  соот-
 
   ветствующий регистр устройства. Для этого он выполняет сле-
 
   дующие действия:
 
 
 
                            - 264 -
 
                        00152-01 97 07-1
 
 
        1) записывает  (в  биты  от  0  до  8  регистра)  поле
 
   байтого-смещения-в-странице в блоке UCB (UCB$W_BOFF);
 
 
        2) получает из блока запроса канала  номер  начального
 
   регистра отображения для передачи; номер является 9-битовой
 
   величиной;
 
 
        3) заносит биты от 0 до 6 номера регистра  отображения
 
   в биты от 9 до 15 регистра, содержащего поля смещения  бай-
 
   та;
 
 
        4) заносит биты от 0 до 15 этого регистра  в  буферный
 
   регистр адреса для данного устройства;
 
 
        5) заносит биты 7 и 8 номера  регистра  отображения  в
 
   биты расширения памяти регистра соответствующего устройства
 
   (обычно, в регистр управления и состояния).
 
 
 
        10.5. Активизация устройства
 
 
 
        Поскольку  драйверный  форк-процесс  может  адресовать
 
   регистры устройства, не выходя за рамки обычной виртуальной
 
   адресации, загрузка буферного регистра адреса общей шины  и
 
   регистра управления и состояния являются простыми  процеду-
 
   рами. Драйвер определяет адрес регистра команд и  состояния
 
   устройства в блоке данных прерывания:
 
 
          UCB ---> CRB ---> --->      адрес CSR
 
 
        Адрес CSR является виртуальным адресом  регистра  уст-
 
   ройства. Все остальные регистры устройства  размещаются  на
 
   постоянном смещении относительно адреса CSR.  Если,  напри-
 
   мер, регистр и состояния  является  первым  регистром  уст-
 
 
                            - 265 -
 
                        00152-01 97 07-1
 
 
   ройства, а счет слов устройства является третьим  регистром
 
   устройства, драйвер устройства может загрузить регистр сче-
 
   та слов следующей последовательности инструкции:
 
 
        - переслать адрес CSR в R4;
 
 
        - переслать число передаваемых слов с помощью инструк-
 
   ции, которая использует адресацию 4(R4).
 
 
 
        10.6. Окончание передачи по прямому доступу к
 
              памяти
 
 
 
        После того, как драйверный  форк-процесс  активизирует
 
   устройство общей шины с прямым доступом к  памяти,  драйвер
 
   ожидает прерывания от  устройства,  используя  макрокоманду
 
   операционной системы, который  приостанавливает  выполнение
 
   драйвера. Когда устройства общей шины запрашивает  аппарат-
 
   ное прерывание, управление получает  диспетчер  прерывания.
 
   Диспетчер сохраняет содержимое регистров R0 - R5 и передает
 
   управление драйверной  программе  обслуживания  прерывания.
 
   Если эта обслуживающая программа может сопоставить прерыва-
 
   ние с приостановленным драйверным  форк-процессором,  прог-
 
   рамма  обслуживания  прерывания  реактивизирует  драйверный
 
   форк-процесс с той точки, на  которой  было  приостановлено
 
   его выполнение. Драйвер почти немедленно обращается к  мак-
 
   рокоманде IOFORK операционной системы.
 
 
        Этот макрокоманда вызывает программу EXE$IOFORK опера-
 
   ционной системы, которая сохраняет драйверный контекст (R3,
 
   R4 и PC) в форк-блоке UCB и помещает адрес этого форк-блока
 
   (R5) в форк-очередь устройства. После этого она  возвращает
 
 
 
                            - 266 -
 
                        00152-01 97 07-1
 
 
   управление драйверной  программе  обслуживания  прерывания,
 
   которая закрывает прерывания.
 
 
        Когда   форк-диспетчер    реактивизирует    драйверный
 
   форк-процесс, драйвер выполняет все необходимые операции по
 
   наведению порядка в адаптере общей шины, такие как  очистки
 
   пути данных и освобождение ресурсов адаптера,  использован-
 
   ных при передаче по прямому доступу.
 
 
 
        10.6.1. Очистка пути данных
 
 
 
        Драйверный форк-процесс,  использующий  буферизованный
 
   путь данных, должен очистить путь  данных  после  окончания
 
   передач по прямому доступу. Драйвер использует макрокоманду
 
   PURDPR, которая вызывает  программу  IOC$PURGEDATAP  опера-
 
   ционной системы и выполняет следующие действия  по  очистке
 
   пути данных:
 
 
        1) сохраняет в стеке содержимое R4;
 
 
        2) определяет местоположение блока запроса канала -
 
 
                R5 ---> UCB ---> CRB
 
 
        3) получает  начальный  адрес  пространства  регистров
 
   адаптера общей шины и сохраняет его в R2;
 
 
        4) извлекает из блока запроса канала номер  пути  дан-
 
   ных, который следует очистить, и загружает его в RI;
 
 
        5) сохраняет в R4 адрес пути данных;
 
 
        6) дает распоряжение адаптеру общей  шины  об  очистки
 
   пути данных. После этого программа заменяет содержимое R0 -
 
 
                            - 267 -
 
                        00152-01 97 07-1
 
 
   R2 следующей информацией:
 
 
          R0  -  состояние успеха или ошибки. Если очистка
 
                 оканчивается без ошибки, программа установит
 
                 в этом регистре SS$_NORMAL. В случае ошибки
 
                 R0 очищается и выполняется сброс аппаратуры;
 
          RI  -  содержимое регистра пути данных;
 
          R2  -  адрес первого регистра отображения адаптера
 
                 общей шины.
 
 
        Адрес блока запроса канала остается в R3.  Этот  адрес
 
   вместе с информацией в RI и R2  используется  для  входа  в
 
   программу регистрации ошибок в случае ошибки пути данных;
 
 
        7) восстаннавливает содержимое R4 информацией из стека
 
   и выполняет переход к PURDPR.
 
 
        Если ошибка пути данных появляется во время его очист-
 
   ки, драйвер должен повторить полностью всю передачу по пря-
 
   мому доступу.
 
 
 
        10.6.2. Освобождение    буферизованного    пути
 
                данных
 
 
 
        Драйверный  форк-процесс  освобождает   буферизованный
 
   путь данных,  используя  макрокоманду  RELDPR  операционной
 
   системы. Макрокоманда вызывает программу IOC$RELDATAP  опе-
 
   рационной системы, которая определяет, какой из путей  дан-
 
   ных был назначен драйверному  форк-процессу  и  освобождает
 
   путь данных для ожидающего драйвера. Драйвер должен исполь-
 
   зоваться на форк-IPL.
 
 
 
 
                            - 268 -
 
                        00152-01 97 07-1
 
 
        Номер пути данных хранится  в  блоке  запроса  канала.
 
   Программа IOC$RELDATAP определяет его  местоположение  сле-
 
   дующим образом:
 
 
        UCB ---> CRB ---> номер пути данных
 
 
        Если путь данных закреплен за  устройством  постоянно,
 
   программа не освобождает пути данных. В  противном  случае,
 
   номер    пути    данных    в    блоке    запроса     канала
 
   (CRB$L_INTD+VEC$B_DATAP)       обнуляется.        Программа
 
   IOC$REALDATAP пытается извлечь  из  очереди  ожидания  пути
 
   данных ожидающих  драйверный  форк-процесс,  сохраненный  в
 
   блоке управления адаптером:
 
 
        UCB ---> CRB  --->  ADR ---> очередь ожидания пути дан
 
 
        Если какой-то другой драйвер  ожидает  буферизованного
 
   пути данных, программа IOC$RELDATAP представляет путь  дан-
 
   ных этому драйверному  форк-процессу,  восстанавливает  его
 
   драйверный контекст из форк-блока UCB и передает управление
 
   сохраненному РС драйвера. Когда IOC$RELDATAP не в состоянии
 
   больше выделить  путь  данных,  она  возвращает  управление
 
   драйверу, который освободил  путь  данных.  Это  отклонение
 
   драйверной обработки прозрачно для форк-процесса драйвера.
 
 
        Если очередь ожидания пути данных пуста,  IOC$RELDATAP
 
   помечает путь данных, как  доступный  (в  блоке  управления
 
   адаптером) и возвращает управление драйверу.
 
 
 
 
 
                            - 269 -
 
                        00152-01 97 07-1
 
 
        10.7. Освобождение   регистров    отображения
 
              адаптера общей шины
 
 
 
        Драйверный форк-процесс  освобождает  набор  регистров
 
   отображения адаптера  общей  шины  с  помощью  макрокоманды
 
   RELMPR операционной системы. Макрокоманда вызывает програм-
 
   му IOC$RELMAPREG, которая освобождает регистры  отображения
 
   в той же последовательности, как и при  освобождении  путей
 
   данных. Количество регистров отображения, закрепленных дан-
 
   ным устройством, содержится в блоке запроса канала. Драйвер
 
   должен выполняться  на  форк-IPL.  Номер  первого  регистра
 
   отображения и число этих регистров  определяются  следующим
 
   образом:
 
 
         UCB--->CRB---> номер первого регистра отображения
 
         UCB--->CRB---> число выделенных регистров отображения
 
 
        Программа IOC$RELMAPREG освобождает регистры отображе-
 
   ния, приводя в  порядок  информацию  о  распределении  этих
 
   регистров в блоке управления адаптером.
 
 
        Затем  эта  программа  пытается   извлечь   драйверный
 
   форк-процесс из  очереди  ожидания  регистров  отображения.
 
   Если обнаруживается приостановленный драйвер, то  программа
 
   выполняет следующее:
 
 
        - извлекает форк-блок  из  очереди  и  восстанавливает
 
   контекст драйвера;
 
 
        - удовлетворяет, если это возможно, запрос на регистры
 
   отображения;
 
 
 
 
 
                            - 270 -
 
                        00152-01 97 07-1
 
 
        - реактивизирует драйверный форк-процесс с инструкции,
 
   следующей за драйверным запросом регистров отображения;
 
 
        - выполняет возврат к драйверному форк-процессу.
 
 
        Если очередь ожидания регистров отображения пуста, или
 
   если IOC$RELMAPREG не имеет достаточного количества смежных
 
   регистров   отображения    для    любого    из    ожидающих
 
   форк-процессов,  управление  возвращается   к   драйверному
 
   форк-процессу, который освобождает регистры отображения.
 
 
 
 
         11. НАПИСАНИЕ ПРОГРАММ ОБСЛУЖИВАНИЯ ПРЕРЫВАНИЙ
 
 
 
 
        Прологовая таблица драйвера большинства драйверов уст-
 
   ройств содержит в секции реинициализации, устанавливаемой с
 
   использованием  макрокоманды  DPT_STORE,  адрес  одной  или
 
   более программ обслуживания  прерывания.  Каждая  программа
 
   обслуживания прерывания соответствует вектору прерывания на
 
   общей шине и указывается в команде SYSGEN генерации  систе-
 
   мы, как это рассматривается в разделе I4.
 
 
        Большинство программ обслужиивания прерывания в  драй-
 
   верах устройств выполняют следующие функции:
 
 
        - определяют местоположение блока управления устройст-
 
   вом;
 
 
        - определяют, было ли прерывание ожидаемым;
 
 
        - отклоняют или обрабатывают незапрошенные прерывания;
 
 
        - активизируют приостановленный драйвер для  обработки
 
 
 
                            - 271 -
 
                        00152-01 97 07-1
 
 
   ожидаемых прерываний.
 
 
        Рис. 24 иллюстрирует основной поток обработки прерыва-
 
   ния.

 
 
 
                            - 272 -
 
                        00152-01 97 07-1
 
 
                  Алгоритм обработки прерывания
 
     Прерывание
          I
   ************************    ******************************
   * Диспетчер прерывания *    * Программа обслуживания пре-*
   *активизирует программу*    *рываний определяет местополо*
   * обслуживания         *----*жение UCB, используя указа- *
   *прерываний устройства *    *тель IDB в стеке прерывания *
   ************************    ******************************
                                              I
                                              *
   *********************                    *   *
   *  Реактивизирует   *           Да     * Ожида-*
   * приостановленный  *<---------------* ется пре- *
   *   драйвер         *                  *рывание*
   *********************                    * ? *
            I                                 *
   ******************                         I Нет
   *Драйвер вызывает*                       /   \
   * макрокоманду   *                     /  Или  \
   *   IOFORK       *                   /           \
   ******************   *******************  *****************
          I             *Программа обслужи*  *Программа обслу*
   ******************   *вания прерывания *  *живания прерыва*
   *IOFORK вызывает *   *отвергает преры- *  *ния определяет *
   *  EXE$IOFORK    *   *вание как ложное *  *причину прерыва*
   ******************   *******************  *************ния*
            I                        I             I
   *************************         I     *******************
   *  EXE$IOFORK устанавли-*         I     *   Выполняет     *
   * вает в очередь драй-  *         I     * соответствующте *
   *верный форк-блок и воз-*         I     *   действия      *
   * вращается к программе *         I     *******************
   *обслуживания прерывания*         I             I
   *************************         I             I
            I                        I             I
            I<--------------------------------------
   *************************
   * Программа обслуживания*     ***********************
   *прерывания извлекает из*     * Выход из программы  *
   *стека указатель IDB и  *-----* обслуживания преры- *
   *восстанавливает содержи*     * ваний по REI        *
   * мое от R0 до R5       *     ***********************
   *************************
 
                             Рис.24
 

 
 
 
 
                            - 273 -
 
                        00152-01 97 07-1
 
 
        11.1. Доставка   прерывания   устройства    к
 
              драйверу
 
 
 
        Когда устройство общей шины генерирует аппаратное пре-
 
   рывание, устройство запрашивает прерывание на  приоритетном
 
   уровне этого устройства. Когда процессор работает при уров-
 
   не приоритета прерывания ниже, чем  IPL  устройства,  начи-
 
   нается диспетчеризация прерывания,  происходящая  следующим
 
   образом:
 
 
        - процессор сохраняет рс  и  длинное  слово  состояния
 
   текущей исполняемой программы в стеке  прерывания  и  подт-
 
   верждает прерывание устройства;
 
 
        - устройство общей шины выставляет адрес своего векто-
 
   ра, который процессор использует в качестве индекса таблицы
 
   адресов во второй (или третьей) странице  блока  управления
 
   системой (см. П. 3.I.6);
 
 
        - когда процессор находит адрес в SCB,  который  отно-
 
   сится к адресу вектора, он передает управление полю диспет-
 
   черизации прерывания блока запроса канала;
 
 
        - поле  CRB  диспетчеризации  прерывания  (CRB$L_INTD)
 
   содержит выполняемый  код  (программу),  который  процедура
 
   загрузки драйвера связала с вектором прерывания. Поля  дис-
 
   петчеризации прерываний прямых векторов содержат  следующие
 
   выполняемые инструкции:
 
 
              PUSHR <R0,R1,R2,R3,R4,R5>
 
              JSB   @#ADDRESS-OF-DRIVER-ISR
 
 
 
 
 
                            - 274 -
 
                        00152-01 97 07-1
 
 
        Процедура загрузки драйвера определяет, сколько  полей
 
   диспетчеризации прерываний нужно построить  внутри  CRB  по
 
   числу векторов, указанных в квалификаторе /NUMVEC в команде
 
   CONNECT генерации системы (SYSGEN), (п. I4.2.2.)  процедура
 
   загрузки драйвера  получает  адрес  программы  обслуживания
 
   прерывания для каждого поля диспетчеризации  прерывания  из
 
   реинициализируемой части прологовой таблицы  драйвера.  Эта
 
   секция DPT содержит одну или более макрокоманд  DPT_$STORE,
 
   которые идентифицируют адреса программ обслуживания  преры-
 
   ваний. Чтобы избежать ошибок при  инициализации  устройства
 
   или обработке прерываний,  число  макрокоманд,  указывающих
 
   программы обслуживания прерываний, должно  равняться  числу
 
   векторов, заданных квалификатором /NUMVEC.
 
 
        Непосредственно за инструкцией  JSB  в  блоке  запроса
 
   канала следует адрес блока диспетчеризации прерывания, свя-
 
   занного с этим CRB. Когда выполняется инструкция JSB,  ука-
 
   затель на адрес блока диспетчеризации прерывания помещается
 
   на вершину стека, как если  бы  он  был  адресом  возврата.
 
   Драйверная программа обслуживания прерывания может  исполь-
 
   зовать этот адрес IDB в качестве указателя на  базу  данных
 
   ввода/вывода. Рис.  25  иллюстрирует  часть  блока  запроса
 
   канала, которая содержит адрес программы обслуживания  пре-
 
   рывания.
 
 
                            - 275 -
 
                        00152-01 97 07-1
 
 
             Блок запроса канала, содержащий адрес
 
               программы обслуживания прерывания
 
 
 
   Блок        *******************************************
 
   запроса     *                    .                    *
 
   канала      *                    .                    *
 
               *******************************************
 
               *       JSB@#        *                    *
 
               *******************************************
 
               * Адрес программы обслуживания прерывания *
 
               *******************************************
 
               *  Адрес блока диспетчеризации прерывания *
 
               *******************************************
 
               *                    .                    *
 
               *                    .                    *
 
 
 
                             Рис.25
 
 
 
        11.2. Контекст прерывания
 
 
 
        Когда диспетчер прерывания вызывает  драйверную  прог-
 
   рамму обслуживания (драйверную), контекст является  следую-
 
   щим:
 
 
        - регистры от R0 до R5 сохраняются в стеке;
 
 
        - системное адресное пространство отображается. Обслу-
 
   живающая программа может получить доступ к  соответствующим
 
   блокам управления в базе ввода/вывода;
 
 
        - IPL находится на аппаратном уровне  прерывания  уст-
 
 
 
                            - 276 -
 
                        00152-01 97 07-1
 
 
   ройства;
 
 
        - процессор работает в режиме ядра;
 
 
        - процессор использует стек прерывания.
 
 
        Этот стек содержит следующую информацию:
 
 
      Ячейки стека                    Содержимое
 
   0 (SP)              Указатель на адрес блока диспетчери-
 
                       зации прерывания
 
   4 (SP) - 24 (SP)    Сохраненные регистры от R0 до R5
 
   28 (SP)             РС во время прерывания
 
   32 (SP)             PSL во время прерывания
 
 
 
        11.3. Обслуживание ожидаемых прерываний
 
 
 
        Когда драйверный форк-процесс активизирует  устройство
 
   и, как результат, ожидает обслуживания прерывания устройст-
 
   ва, этот драйвер приостанавливает форк-обработку и  ожидает
 
   появления прерывания.  Приостановленный  драйвер  представ-
 
   ляется  только  содержимым  блока  управления  устройством,
 
   который содержит описание запроса ввода/вывода и драйверно-
 
   го форк-процесса.  Когда  драйвер  получает  управление  от
 
   программы обслуживания прерывания, то программой обслужива-
 
   ния прерывания восстанавливаются к их предшествующему  сос-
 
   тоянию только R3, R4, R5 и адрес РС.
 
 
        Драйверная программа обслуживания  прерывания  возвра-
 
   щает управление ожидающему  драйверу  такой  последователь-
 
   ностью:
 
 
                            - 277 -
 
                        00152-01 97 07-1
 
 
        Программа обслуживания прерывания получает адрес блока
 
   управления устройством (из блока данных прерывания) следую-
 
   щим образом:
 
 
       0(SP)---> CRB---> IDB---> IDB$L_OWNER---> UCB устройств
 
 
        2) сервисная программа проверяет бит ожидаемого  прог-
 
   раммного прерывания в  слове  состояния  UCB  (UCB$V_INT  в
 
   UCB$W_STS). Если этот бит установлен, драйвер ожидает  пре-
 
   рывания от этого устройства. Программа обслуживания  преры-
 
   вания очищает затем  UCB$V_INT  в  UCB$W_STS  при  указании
 
   приема ожидаемого прерывания;
 
 
        3) программа обслуживания  прерывания  восстанавливает
 
   содержимое регистра R5 адресом форк-блока UCB. Она  восста-
 
   навливает R3 и R4 драйверного процесса, используя два  поля
 
   из форк-блока UCB, UCB$L_FR3 и UCB$L_FR4, соответственно;
 
 
        4) программа обслуживания прерывания передает управле-
 
   ние по адресу рс драйвера, сохраненному в форк-блоке UCB (в
 
   UCB$_FPC), выполняя инструкцию JSB.
 
 
        Восстановленный  драйвер  может  выполнить   несколько
 
   инструкций в контексте прерывания.  Эти  инструкции  могут,
 
   например, копировать информацию о состоянии  устройства  из
 
   регистров устройства в  UCB  устройства.  Перед  окончанием
 
   операции   ввода/вывода,   драйверная   программа   создает
 
   форк-процесс для понижения своего IPL выполнения  до  драй-
 
   верного форк-уровня, вместо того, чтобы продолжать выполне-
 
   ние на IPL аппаратного  прерывания  устройства.  Драйверная
 
   программа создает форк-процесс, вызывая макрокоманду IOFORK
 
   операционной системы, как это рассматривается в п.I2.I.I.
 
 
 
                            - 278 -
 
                        00152-01 97 07-1
 
 
        Макрокоманда вызывает программу  операционной  системы
 
   EXE$IOFORK, которая  помещает  форк-блок  UCB,  описывающий
 
   процесс драйвера, в соответствующую форк-очередь и  возвра-
 
   щает управление драйверной программе обслуживания  прерыва-
 
   ния. Программа обслуживания прерывания выполняет затем сле-
 
   дующее:
 
 
        - изывает из стека указатель IDB;
 
        - восстанавливает содержимое регистров от R0 до R5;
 
        - оставляет прерывание по инструкции REI.
 
 
 
        11.4. Обслуживание неожидаемого прерывания
 
 
 
        Устройства запрашивают прерывания для  указания  прог-
 
   рамме обслуживания прерываний (драйверной), что  устройство
 
   изменило состояние. Если драйверный  форк-процесс  начинает
 
   операцию ввода/вывода на устройстве, драйвер ожидает  полу-
 
   чить прерывание от этого устройства, когда  будет  окончена
 
   операция или появится ошибка.
 
 
        Изменения состояния устройства другого рода  появляют-
 
   ся, когда устройство не было активизировано его  драйвером.
 
   Устройство сообщает об этих изменениях,  запрашивая  неожи-
 
   даемые прерывания. Например, когда  вводится  информация  с
 
   терминала, который не присоединен к процессу, терминал зап-
 
   рашивает прерывание, которое воспринимается драйвером  тер-
 
   минала. В результате прерывания драйвер приводит к  появле-
 
   нию процедуры регистрации пользователя на терминале.
 
 
        Другой пример неожидаемого прерывания - это запрос  от
 
   устройства, когда оператор меняет  том  на  диске.  Драйвер
 
 
 
                            - 279 -
 
                        00152-01 97 07-1
 
 
   диска обслужит прерывание, изменяя биты  тома  и  состояния
 
   устройства в блоке управления устройством для данного  дис-
 
   ка.
 
 
        Устройства запрашивают неожидаемые прерывания  по  той
 
   причине, что некоторые внешние события  изменили  состояние
 
   устройства. Драйвер устройства  может  относиться  к  таким
 
   прерываниям двояко:
 
 
        - игнорировать прерывание, как ложное;
 
 
        - проверить регистры устройства и выполнить действия в
 
   соответствии с  их  указаниями  изменившихся  состояний,  а
 
   затем регистрировать любое  другое  изменение  в  состоянии
 
   устройства.
 
 
        Драйверная программа обслуживания  прерывания  решает,
 
   является ли прерывание ожидаемым или нет, проверяя бит ожи-
 
   даемого  прерывания  программы  в   слове   состояния   UCB
 
   (UCB$V_INT в UCB$W_STS). Все драйверы устройств общей  шины
 
   должны использовать этот метод  для  различения  ожидаемого
 
   прерывания от неожидаемого.  Адрес  программы  неожидаемого
 
   прерывания, указанный  в  диспетчерской  таблице  драйвера,
 
   резервирован.
 
 
        Если прерывание не ожидается, драйвер может  отклонить
 
   его следующей программой последовательностью:
 
 
        - извлечение из стека указателя IDB;
 
 
        - восстановление R0 - R5;
 
 
        - уход из прерывания по инструкции REI.
 
 
                            - 280 -
 
                        00152-01 97 07-1
 
 
        Вместо отклонения прерывания  драйвер  может  пожелать
 
   обработать его. Например, драйвер может  послать  сообщение
 
   оператору или в почтовый ящик  контроллера  задания,  когда
 
   такое прерывание появляется.
 
 
        Драйверы должны быть крайне осторожными при  обработке
 
   неожидаемых прерываний от занятых устройств. Блок  управле-
 
   ния занятого устройства может содержать активный  форк-блок
 
   ранее созданного  форк-процесса  драйвера.  Если  программа
 
   обслуживания  неожидаемого   прерывания   будет   создавать
 
   форк-процесс для обработки запроса от него, она может  раз-
 
   рушить драйверный форк-контекст, хранящийся в текущее время
 
   в этом блоке управления устройством.
 
 
 
        11.4.1. Примеры обработки неожидаемых входов
 
 
 
        Устройство считывания перфокарт запрашивает  неожидае-
 
   мые прерывания, если  какой-то  пользователь  включает  это
 
   устройство. Когда драйверная программа обслуживания  преры-
 
   ваний считывателя перфокарт определяет, что  прерывание  не
 
   ожидалось, программа анализирует прерывание следующим обра-
 
   зом:
 
 
        - получает  адрес  регистра  управления  и  состояния,
 
   используя  блок  диспетчеризации  прерывания,   указываемый
 
   адресом, содержащимся на вершине стека прерывания:
 
 
        0(SP) --> CRB --> IDB --> IDB$L_CSR --> CSR устройства
 
 
        Поскольку контроллер  считывателя  перфокарт  является
 
   выделенным (для единственного устройства), поле IDB$L_OWNER
 
   всегда указывает на единственный UCB считывателя перфокарт:
 
 
                            - 281 -
 
                        00152-01 97 07-1
 
 
   0(SP) --> CRB --> IDB --> IDB$LOWNER --> UCB устройства
 
 
        - убеждается, что прерывание  не  ожидалось,  проверяя
 
   бит  разрешения  прерывания  в  слове   состояния   в   UCB
 
   (UCB$V_INT в UCB$W_STS);
 
 
        - поскольку прерывание не ожидается, программа очищает
 
   все биты регистра команд и состояния, за  исключением  бита
 
   разрешения прерывания;
 
 
        - убеждается,  что  произошло  включение  считывателя,
 
   проверяя сохраненную копию регистра управления и состояния;
 
 
        - проверяет поле счета обращений блока управления уст-
 
   ройством, (UCB$W_REFC), чтобы определить, выполнял ли  про-
 
   цесс назначения данного устройства или закрепление  за  ним
 
   канала;
 
 
        - если счетчик обращений содержит ноль, программа обс-
 
   луживания прерываний проверяет бит присоединения к  заданию
 
   в поле зависящего  от  устройства  состояния  (UCB$V_JOB  в
 
   UCB$W_DEVSTS), чтобы проверить не посылала  ли  контроллеру
 
   задания сообщения о  подключении  считывателя  перфокарт  к
 
   системе. Используя бит подсоединения к заданию для  синхро-
 
   низации посылки сообщений, программа обслуживания  прерыва-
 
   ния  предохраняет  функцию  посылки  сообщения  контроллеру
 
   задания от вредного воздействия частых прерываний по поводу
 
   подключения устройства;
 
 
        - если бит подключения к заданию не установлен,  прог-
 
   рамма устанавливает его и создает форк-процесс для  посылки
 
   сообщения контроллеру задания, оповещая о подключении  счи-
 
   тывателя перфокарт к системе.  Только  одна  последователь-
 
 
                            - 282 -
 
                        00152-01 97 07-1
 
 
   ность  инструкций  может  использовать   UCB   в   качестве
 
   форк-блока. Поэтому перед созданием форк-процесса программа
 
   обслуживания прерывания должна выполнить следующий шаги:
 
 
        - убедиться, что считыватель перфокарт  еще  никем  не
 
   используется и что никто не желает воспользоваться ним. Это
 
   выполняется проверкой  нулевого  значения  счета  обращений
 
   (UCB$W_REFCNT);
 
 
        - убедиться, что оно не использует уже UCB для  созда-
 
   ния форк-процесса выполняющего переход на более низкий  IPL
 
   и для посылки сообщения диспетчеру заданий. Это выполняется
 
   проверкой  бита  подсоединения  к  заданию   (UCB$V_JOB   в
 
   UCB$W_DEVSTS).
 
 
        Программа  операционной   системы,   которая   создает
 
   форк-процесс, при  удовлетворении  указанных  выше  условий
 
   возвращает управление программе обслуживания прерывания;
 
 
        - когда  программа  обслуживания  прерывания  получает
 
   управление, она восстанавливает содержимое регистров  R0  -
 
   R5 и покидает прерывание по инструкции REI (программа  обс-
 
   луживания прерывания извлекает из стека указатель  IDB  еще
 
   ранее в ходе ее выполнения, чтобы получить адреса  регистра
 
   команд и состояния и блока  управления  устройством).  Если
 
   форк-процесс был создан, он выполняется после того как  IPL
 
   опустится ниже UCB$B_FIPL. Форк-процесс записывает  сообще-
 
   ние о подключении к системе считывателя перфокарт в  почто-
 
   вый ящик диспетчера задания. Форк-процесс не может  послать
 
   сообщение на IPL устройства  или  другом  IPL,  превышающем
 
   IPL$_MAILBOX.
 
 
 
 
                            - 283 -
 
                        00152-01 97 07-1
 
 
        Если запрос посылки сообщения не выполняется  успешно,
 
   форк-процесс очищает бит присоединения к заданию,  так  что
 
   контроллер задания получит сообщение только, если  произай-
 
   дет какое-либо изменение в состоянии считывателя перфокарт.
 
   Если  же  форк-процесс  успешно  пересылает  сообщение,  он
 
   оставляет установленным бит присоединения к заданию,  чтобы
 
   предотвратить прием контроллером задания дальнейших сообще-
 
   ний о состоянии считывателя перфокарт.
 
 
        Неожиданное прерывания возникает для устройства  груп-
 
   пового контроллера, когда оператор снимает дисковый  том  и
 
   диск запрашивает прерывание. Драйверная программа  обслужи-
 
   вания прерывания должна определить, какой из дисков  запро-
 
   сил прерывание,  получить  состояние  этого  диска  из  его
 
   регистра команд и состояния и затем решить, было ли  преры-
 
   вание ожидаемым. Если прерывание не  ожидалось,  драйверная
 
   обслуживающая программа вызывает программу неожидаемых пре-
 
   рываний. Эта программа проверяет состояние тома  следующими
 
   действиями:
 
 
        1) устанавливает бит в  блоке  управления  устройством
 
   для  индикации,  что  устройство   подключено   к   системе
 
   (UCB$V_ONLINE в UCB$W_STS);
 
 
        2)  если  бит  достоверности  тома  в  UCB  установлен
 
   (UCB$V_VALID в UCB$W_STS), программа проверяет бит  состоя-
 
   ния достоверности тома в регистре устройства для  определе-
 
   ния, изменилось ли состояние тома.  Если  том  не  является
 
   более достоверным, программа очищает бит достоверности тома
 
   в UCB;
 
 
 
                            - 284 -
 
                        00152-01 97 07-1
 
 
        3) наконец, программа возвращается к обычной  драйвер-
 
   ной программе обслуживания прерывания.
 
 
        Драйверная программа обслуживания прерывания проверяет
 
   затем остальные устройства контроллера,  чтобы  определить,
 
   не запросило ли прерывания какое-то  другое  устройство  на
 
   этом контроллере во время обслуживания первого  прерывания.
 
   Если отсутствуют устройства, требующие обслуживания  преры-
 
   вания, программа извлекает из стека указатель IDB,  восста-
 
   навливает содержимое регистров R0-R5 и покидает  прерывание
 
   по инструкции REI.
 
 
 
 
               12. ОКОНЧАНТЕ ЗАПРОСА ВВОДА/ВЫВОДА
 
 
 
 
        Когда драйвер активизировал устройство и вызвал макро-
 
   команду ожидания прерывания, драйвер остается в приостанов-
 
   ленном состоянии пока не произойдет одно из следующих собы-
 
   тий:
 
 
        - устройство запрашивает прерывание;
 
 
        - устройство перешло в состояние таймаута.
 
 
        Если  устройство  запрашивает  прерывание,  драйверная
 
   программа обслуживания прерывания обрабатывает его и  затем
 
   реактивизирует драйвер на инструкции, следующей за макроко-
 
   мандой  ожидания  прерывания.  Реактивизированный   драйвер
 
   выполняет постобработку  ввода/вывода,  зависящую  от  уст-
 
   ройства.
 
 
        Если устройство не запрашивает прерывания внутри  наз-
 
 
 
                            - 285 -
 
                        00152-01 97 07-1
 
 
   наченного интервала времени, система передает управление  к
 
   драйверному обработчику таймаута.  Его  адрес  определяется
 
   как аргумент макрокоманды ожидания прерывания.
 
 
 
        12.1. Постобработка ввода/вывода
 
 
 
        Когда  драйверная  программа  обслуживания  прерывания
 
   обработает прерывание, она  передает  управление  драйверу,
 
   выполняя инструкцию JSB. В данной точке драйвер исполняется
 
   в контексте прерывания.  Если  драйвер  намерен  продолжать
 
   выполняться в контексте  прерывания,  он  блокирует  другую
 
   обработку на процессоре, включая обработку аппаратных  пре-
 
   рываний. Чтобы возвратить драйвер  в  контекст  драйверного
 
   форк-процесса, драйвер использует макрокоманда IOFORK  опе-
 
   рационной системы.  Когда  форк-процесс  создан  и  получил
 
   управление, он выполняет программу драйвера, которая завер-
 
   шает обработку запроса ввода-ввывода.
 
 
 
        12.1.1. EXE$IOFORK
 
 
 
        IOFORK  является  макрокомандой,  которая   генерирует
 
   вызов программы EXE$IOFORK операционной системы. Эта  прог-
 
   рамма преобразует драйверный контекст,  который  сохранялся
 
   от программы обслуживания прерывания, в контекст драйверно-
 
   го форк-процесса следующими шагами:
 
 
        1) запрещает программные таймауты, очищая бит разреше-
 
   ния  таймаута  в  слове  состояния  в   UCB   (UCB$_TIM   в
 
   UCBSW_STS);
 
 
 
                            - 286 -
 
                        00152-01 97 07-1
 
 
        2) сохраняет R3 и R4 текущего драйверного контекста  в
 
   форк-блоке UCB (UCB$L_FR3 и UCB$L_FR4);
 
 
        3) затем сохраняет текущий счетчик команд  драйвера  в
 
   форк-блоке UCB (UCB$L_FPC). Счетчик команд драйвера являет-
 
   ся первым двойным словом в стеке после входа  в  рассматри-
 
   ваемую программу в результате выполнения инструкции JSB;
 
 
        4) получает форк-IPL устройства из UCB (UCB$B_FIPL);
 
 
        5) помещает адрес форк-блока UCB (R5) в  форк-очередь,
 
   относящуюся к драйверному форк-IPL;
 
 
        6)  наконец,  запрашивает  программное  прерывание  на
 
   уровне драйверного форк-IPL, если форк-блок является первым
 
   входом в форк-очереди.
 
 
        Перечисленные шаги, пересылают  существенный  контекст
 
   драйверного форк-процесса в форк-блок UCB, т.е., они сохра-
 
   няют содержимое регистров от R3 до R5 и  адрес  драйверного
 
   счетчика команд. Драйверный форк-процесс возобновляет обра-
 
   ботку, когда форк-диспетчер операционной системы  извлекает
 
   из форк-очереди форк-блок UCB и реактивизирует  драйвер  на
 
   уровне драйверного форк-IPL.
 
 
 
        12.1.2. Окончание запроса ввода/вывода
 
 
 
        Когда операционная система  реактивизирует  драйверный
 
   форк-процесс, извлекая форк-блок из очереди, драйвер возоб-
 
   новляет обработку операции  ввода/вывода.  Если  устройство
 
   завершило  операцию  ввода/вывода  без  ошибок,  драйверный
 
   форк-процесс для устройства с прямым доступом работает так:
 
 
 
                            - 287 -
 
                        00152-01 97 07-1
 
 
        - очищает буферизованный путь данных;
 
 
        - освобождает буферизованный путь данных;
 
 
        - освобождает регистры отображения;
 
 
        - освобождает контроллер;
 
 
        - сохраняетчик код состояния, счет передачи и  зависи-
 
   мое от устройства состояние, которые должны быть переданы в
 
   блок состояния ввода/вывода пользовательского процесса;
 
 
        - возвращает управление в операционную систему.
 
 
 
        12.1.2.1. Освобождение контроллера
 
 
 
        Чтобы освободить канал контроллера,  драйверная  прог-
 
   рамма использует макрокоманду RELCHAN операционной системы,
 
   который    вызывает    программу    операционной    системы
 
   IOC$RELCHAN. Если канал контроллера ожидается другим  драй-
 
   вером, эта программа вручает канал  ожидающему  драйверному
 
   форк-процессу, восстанавливает  форк-контекст  драйвера  из
 
   форк-блока UCB и передает управление сохраненному  счетчику
 
   команд (РС). Если очередь ожидания канала пуста,  программа
 
   возвращает управление  драйверному  форк-процессу,  который
 
   освобождает канал.
 
 
        Драйверы выделенных контроллеров не нуждаются в  осво-
 
   бождении канала данных контроллера (как это  рассмотрено  в
 
   п. 9.3.I подразделе I3.I). С помощью кода в программе  ини-
 
   циализации устройства эти драйверы  устанавливают  UCB  для
 
   постоянного владения контроллером.
 
 
                            - 288 -
 
                        00152-01 97 07-1
 
 
        Драйверы не должны выполняться на драйверном форк-IPL,
 
   когда они  используют  макрокоманду  RELCHAN  или  вызывают
 
   IOC$RELCHAN.
 
 
 
        12.1.2.2. Сохранение   состояния,   счетчика    и
 
                  зависимого от устройства состояния
 
 
 
        Чтобы сохранить  код  состояния,  счетчик  передачи  и
 
   зависимое от устройства состояние, драйвер  выполняет  сле-
 
   дующие действия:
 
 
        1) загружает код состояния, соответствующий  успешному
 
   завершению (SS$_NORMAL), в разряды от 0 до I5 регистра R0;
 
 
        2) если операция ввода/вывода,  выполненная  устройст-
 
   вом, связана с передачей, драйвер загружает число  передан-
 
   ных байтов в старшие I6 разрядов регистра R0, т.е., в  биты
 
   от I6 до 3I;
 
 
        3) затем драйвер  загружает  зависимую  от  устройства
 
   информацию о состоянии, если она есть, в RI. Регистры R0  и
 
   RI содержат значения состояния, которое  передается  опера-
 
   ционной системой к пользовательскому процессу в  блок  сос-
 
   тояния ввода/вывода, указанный исходной системной  програм-
 
   мой обслуживания очереди запросов ввода/вывода. Если  неоп-
 
   ределяется блок состояния вввода/вывода, операционная  сис-
 
   тема не использует R0 и RI.
 
 
 
        12.1.2.3. Возвращение в операционную систему
 
 
 
        Драйвер выполняет возврат в систему, используя  макро-
 
 
 
                            - 289 -
 
                        00152-01 97 07-1
 
 
   команду REQCOM операционной системы для окончания обработки
 
   запроса ввода/вывода. Эта макрокоманда  вызывает  программу
 
   IOC$REQCOM  операционной  системы,  которая  находит  адрес
 
   пакета запроса ввода/вывода, относящегося к  данной  опера-
 
   ции, в UCB устройства (UCB$L_IRP). Затем она записывает два
 
   длинных (двойных) слова состояния окончания, содержащиеся в
 
   R0  и  RI,  в  поле  среды  пакета   запроса   ввода/вывода
 
   (IRP$L_MEDIA и IRP$L_MEDIA  +  4).  После  этого  программа
 
   помещает пакет запроса ввода/вывода в очередь на  постобра-
 
   ботку. Если пакет является единственной записью  в  очереди
 
   обработки (постобработки), IOC$REQCOM запрашивает программ-
 
   ное прерывание на  уровне  IPL$_IOPOST,  поэтому  обработка
 
   начинается, когда IPL падает ниже этого уровня.
 
 
        Если в блоке  управления  устройством  установлен  бит
 
   регистрации  ошибок   (UCBSV_ERLOGIP   в   UCB$W_STS),   то
 
   IOC$REQCOM получает адрес буфера  сообщения  об  ошибке  из
 
   блока управления устройством (UCB$L_EMB). После  этого  она
 
   записывает в буфер ошибок следующую информацию:
 
 
        - конечное состояние устройства (UCB$W_DEVSTS);
 
        - конечный счет ошибок (UCB$B_ERTCNT);
 
        - два длинных слова состояния окончания (R0 и RI).
 
 
        Чтобы   освободить   буфер   сообщения   об   ошибках,
 
   IOC$REQCOM вызывает программу ERL$RELEASEMB.  В  подразделе
 
   I3.3 более подробно обсуждается регистрация ошибок.
 
 
        Если какие-либо пакеты запросов  ввода/вывода  ожидают
 
   драйверной обработки, IOC$REQCOM выполняет следующие дейст-
 
   вия:
 
 
 
 
                            - 290 -
 
                        00152-01 97 07-1
 
 
        1) изымает пакет из очереди;
 
 
        2) создает новый драйверный форк-процесс;
 
 
        3)   активизирует   драйвер   на   программе    начала
 
   ввода/вывода.
 
 
        В противном случае, IOC$REQCOM очищает  бит  занятости
 
   устройства в слове состояния в UCB устройства (UCB$V_BSY  в
 
   UCB$W_STS) и передает управление программе IOC$RELCHAN  для
 
   освобождения канала контроллера, если драйвер сам не  может
 
   сделать этого.
 
 
        Остальные шаги обработки запроса  ввода/вывода  выпол-
 
   няются постобработкой ввода/вывода в операционной системе.
 
 
 
        12.2. Обработчики таймаута
 
 
 
        Операционная система передает  управление  драйверному
 
   обработчику таймаута, если устройство не запросило прерыва-
 
   ния в пределах лимита времени,  указанного  в  макрокоманде
 
   ожидания прерывания. Таймерная программа операционной  сис-
 
   темы сканирует блоки управления устройствами  через  каждую
 
   секунду, чтобы определить, имеются ли устройства с  таймау-
 
   том.
 
 
        Когда таймерная программа находит устройство,  имеющее
 
   таймаут,  она  вызывает  драйверный  обработчик   таймаута,
 
   выполняя следующие действия:
 
 
        1) запрещает ожидавшееся прерывание и таймаут  в  уст-
 
   ройстве,  очищая  биты  в  поле  состояния  UCB  устройства
 
   (UCB$V_INT и UCB$V_TIM в UCB$W_STS);
 
 
                            - 291 -
 
                        00152-01 97 07-1
 
 
        2) устанавливает бит таймаута устройства в  поле  сос-
 
   тояния в UCB (UCB$V_TIMOUT в UCB$W_STS);
 
 
        3) устанавливает приоритетный уровень на IPL  аппарат-
 
   ного прерывания устройства (UCB$B_DIPL);
 
 
        4) восстанавливает  сохраненное  содержимое  R3  и  R4
 
   драйверного  форк-процесса  из  форк-блока  UCB  (UCB$L_FR3
 
   иUCB$L_FR4);
 
 
        5) восстанавливает R5 (адрес форк-блока UCB);
 
 
        6) вычисляет адрес драйверного обработчика таймаута из
 
   рс, сохраненного в форк-блоке UCB (UCB$L_FPC);
 
 
        7) вызывает драйверный обработчик таймаута через инст-
 
   рукцию JSB.
 
 
        Драйверный обработчик таймаута выполняется в следующем
 
   контексте:
 
 
        - содержимое регистров от R0 до R5 сохраняется в  сте-
 
   ке;
 
 
        - R5 содержит адрес UCB того устройства, которое имеет
 
   таймаут;
 
 
        - системное адресное пространство отображается;
 
 
        - процессор работает в режиме ядра;
 
 
        - процессор работет со стеком прерываний;
 
 
        - IPL равен уровню аппаратного прерывания устройства.
 
 
        Операционная  система  вызывает  обработчик   таймаута
 
 
                            - 292 -
 
                        00152-01 97 07-1
 
 
   через прерывание на уровне IPL$_TIMER. Таким образом, чтобы
 
   обработать таймаут, драйвер может понизить уровень  от  IPL
 
   устройства до драйверного форк-IPL. (драйвер  должен  пони-
 
   жать уровень приритета с  помощью  SETIPL,  чтобы  защитить
 
   содержимое стека).
 
 
        Когда упровление получает драйверный форк-процесс,  R3
 
   и R4 восстанавливаются к их  предшествующему  состоянию  из
 
   UCB$L_FR3 и UCB$L_FR4, соответственно.
 
 
        Во время восстановления после нарушения питания,  опе-
 
   рационная система  форсирует  таймаут  устройства,  изменяя
 
   поле таймаута (UCBSL_DUETIM) блока управления  устройством,
 
   если UCB этого устройства регистрирует, что устройство ожи-
 
   дает прерывания или таймаута (UCB$V_INT и  UCB$V_TIM  уста-
 
   новлены в UCB$W_STS). Обработчик таймаута  может  узнать  о
 
   выполнении восстановления после сбоя питания, проверяя  бит
 
   UCB$V_POWER в UCB$W_STS в блоке управления устройством.
 
 
        Обработчик таймаута  обычно  выполняет  одну  из  трех
 
   функций:
 
 
        - перезапускает операцию ввода/вывода, пока не  исчер-
 
   пается счет перезапусков;
 
 
        - прекращает обслуживание запроса ввода/вывода;
 
 
        - посылает сообщение в почтовый ящик оператора и возв-
 
   ращается к ожиданию последующих прерываний или таймаута.
 
 
 
                            - 293 -
 
                        00152-01 97 07-1
 
 
        12.2.1. Перезапуск операции ввода/вывода
 
 
 
        Некоторые устройства способны повторно запустить  опе-
 
   рацию ввода/вывода после таймаута. Например, дисковой драй-
 
   вер может выполнить следующие шаги после таймаута по  пере-
 
   даче:
 
 
        1) вызвать следующую макрокоманду для понижения IPL до
 
   драйвверного форк-уровня:
 
 
                   SETIPL  UCB$B_FIPL(R5)
 
 
        Результирующий приоритетный уровень не должен устанав-
 
   ливаться ниже IPL$_TIMER;
 
 
        2) освободить  регистры  отображения,  путь  данных  и
 
   канал данных контроллера;
 
 
        3) если произошло нарушение питания,  загрузить  адрес
 
   пакета запроса ввода/вывода в R3,  перезагрузить  следующие
 
   поля пакета запроса в соответствующие поля UCB и перейти на
 
   программу начала ввода/вывода:
 
 
                        IRP$W_BCNT
 
                        IRP$W_BOFF
 
                        IRP$L_SVAPTE
 
 
        Перечисленные действия приводят к полному  перезапуску
 
   передачи;
 
 
        4) если сбоя питания не  было,  а  драйвер  устройства
 
   поддерживает  регистрацию  ошибок,   вызывается   программа
 
   ERL$DEV_ICTMO для регистрации таймаута устройства;
 
 
                            - 294 -
 
                        00152-01 97 07-1
 
 
        5) если счет перезапусков не исчерпан, уменьшить счет,
 
   сбросить бит таймаута в  UCB  (UCB$W_STS)  и  перезапустить
 
   операцию;
 
 
        6) если счет  перезапусков  исчерпан,  установить  код
 
   ошибки, выполнить обычное  завершение  операции  и  вызвать
 
   REQCOM.
 
 
 
        12.2.2. Прекращение запроса ввода/вывода
 
 
 
        Драйверный  обработчик  таймаута   прекращает   запрос
 
   ввода/вывода, когда исчерпан счет перезапусков или когда он
 
   определяет (после  таймаута),  что  была  запрошена  отмена
 
   (вычеркивание) ввода/вывода. Если бит отмены ввода/вывода в
 
   слове состояния UCB (UCB$V_CANCEL в UCB$W_STS)  установлен,
 
   значит была запрошена отмена ввода/вывода и обработчик тай-
 
   маута может прекратить обслуживание этого запроса.
 
 
        Чтобы прекратить  обслуживание  запроса  ввода/вывода,
 
   драйверный обработчик таймаута  может  выполнить  следующие
 
   действия:
 
 
        1) обработчик очищает регистр команд и состояния  уст-
 
   ройства;
 
 
        2) затем обработчик  вызывает  следующую  макрокоманду
 
   операционной  системы  для  понижения  IPL  до  драйверного
 
   форк-уровня:
 
 
                    SETIPL UCB$B_FIPL(R5)
 
   результирующий IPL не должен опускаться ниже IPL$_TIMER;
 
 
                            - 295 -
 
                        00152-01 97 07-1
 
 
        3) обработчик освобождает ресурсы адтера общей шины  и
 
   канала данных контроллера, если это необходимо;
 
 
        4) загружает код состояния прекращения  (SS$_ABORT)  в
 
   младшее слово R0;
 
 
        5) очищает разряды с I6 по 3I в R0 для индикации,  что
 
   данные не были переданы;
 
 
        6) вызывает макрокоманду REQCOM операционной  системы,
 
   рассмотренный в подпункте I2.I.2.3, чтобы  завершить  обра-
 
   ботку ввода/вывода.
 
 
        Поскольку устройство может прерывать драйверную  обра-
 
   ботку таймаута, выполняемую на уровне  форк-IPL,  программа
 
   обслуживания прерывания должна проверять бит ожидания  пре-
 
   рывания (UCB$V_INT), прежде чем начать  обработку  прерыва-
 
   ния. Операционная система сбрасывает этот бит,  перед  тем,
 
   как она вызывает драйверный обработчик таймаута.
 
 
 
        12.2.3. Посылка сообщения оператору
 
 
 
        Следующая последовательность описывает обработчик тай-
 
   маута, который посылает сообщение в почтовый ящик оператора
 
   и затем возвращает в состояние ожидания прерывания или тай-
 
   маута:
 
 
        1)   использует  следующую  макрокоманду  операционной
 
   системы для понижения IPL до драйверного форк-уровня:
 
 
                   SETIPL UCB$B_FIPL(R5)
 
   результирующий IPL не должен опускаться ниже IPL$_TIMER.
 
 
                            - 296 -
 
                        00152-01 97 07-1
 
 
        2) проверяет бит отмены ввода/вывода в слове состояния
 
   в UCB (UCB$V_CANCEL в UCB$W_STS). Если  он  не  установлен,
 
   обработчик таймаута выполняет следующее:
 
 
        - сохраняет R3 и R4 в стеке;
 
 
        - загружает   код   сообщения   орсом,    такой    как
 
   MSG$_DEVOFFLIN, в R4;
 
 
        - загружает   адрес    почтового    ящика    оператора
 
   (SYS$GL_OPRMBX) в R3;
 
 
        - вызывает программу операционной системы для  помеще-
 
   ния сообщения в почтовый ящик оператора:
 
 
                       JSB     G^EXE$SNDEVMSG
 
 
        - восстанавливает R3 и R4.
 
 
        (если бит отмены  ввода/вывода  устанолен,  обработчик
 
   таймаута может прекратить запрос);
 
 
        3) затем обработчик таймаута  использует  макрокоманду
 
   DSBINT операционной  системы  для  повышения  приоритетного
 
   уровня до IPL$_POWER, блокируя таким образом все прерывания
 
   от программ и аппаратуры;
 
 
        4) обработчик таймаута вызывает  макрокоманду  WFIKPCH
 
   операционной системы для ожидания  другого  прерывания  или
 
   таймаута.
 
 
        Когда процесс орсом читает сообщение в своем  почтовом
 
   ящике, он посылает запрошенное сообщение, в  данном  случае
 
   "устройство отключено", на все операторные терминалы.
 
 
 
 
                            - 297 -
 
                        00152-01 97 07-1
 
 
        13. НАПИСАНИЕ    ПРОГРАММ    ИНИЦИАЛИЗАЦИИ,     ОТМЕНА
 
            ВВОДА/ВЫВОДА И РЕГИСТРАЦИИ ОШИБОК
 
 
 
 
        Драйвер  содержит  программы   инициализации,   отмены
 
   ввода/вывода и регистрации ошибок. Прологовая таблица драй-
 
   вера и  диспетчерская  таблица  драйвера  указывают  адреса
 
   программ  инициализации.  Диспетчерская  таблица   драйвера
 
   содержит адреса программ отмены ввода/вывода и  регистрации
 
   ошибок. Необходимость этих программ зависит  от  типа  уст-
 
   ройства.
 
 
 
        13.1. Программы инициализации
 
 
 
        Большинство контроллеров и устройств требуют инициали-
 
   зации при следующих обстоятельствах:
 
 
        - когда процедура загрузки лрайввера загружает драйвер
 
   устройства для контроллера и устройств;
 
 
        - во время восстановления после нарушения питания.
 
 
        Программы инициализации готовят контроллер и устройст-
 
   ва к операции. В зависимости  от  характеристик  устройств,
 
   программы инициализации выполняют следующие действия:
 
 
        - разрешают прерывания контроллера;
 
 
        - очищают биты состояния ошибки в регистрах  устройст-
 
   ва;
 
 
        - инициируют  операцию  устройства,  например,   сброс
 
   механизма или опознание пакета;
 
 
                            - 298 -
 
                        00152-01 97 07-1
 
 
        - сохраняют значения полей UCB, которые не могут  быть
 
   адресованы макрокомандой DPT_STORE, т.е.,  поля,  выходящие
 
   за пределы 256 байтов от блока управления устройством;
 
 
        - выполняют постоянное  назначение  ресурсов  адаптера
 
   общей шины, как это рассмотрено в разделе I0;
 
 
        - устанавливают    бит    подключения    к     системе
 
   (UCB$V_ONLINE в UCB$W_STS) в блоке управления устройством;
 
 
        - заполняют IDB$L_OWNER  для  устройств  с  выделенным
 
   контроллером, например, для устройства построчной печати.
 
 
 
        13.1.1. Инициализация   во    время    загрузки
 
                драйвера
 
 
 
        Инициализация, выполняемая во время загрузки драйвера,
 
   зависит от того, загружается  ли  драйвер  впервые  или  он
 
   замещает драйвер, который был загружен ранее.
 
 
        Команды генерации  системы  AUTOCONFIGURE,  CONNECT  и
 
   LOAD (автоконфигурировать, присоединить к загрузить,  соот-
 
   ветственно) добавляют новые драйверы и конфигурации. Коман-
 
   да LOAD загружает драйвер в бесстраничную системную память,
 
   но не вызывает специфической для драйвера  программы  и  не
 
   выполняет инициализации, указанной  в  вызове  макрокоманды
 
   DPT_STORE. Две  другие  команды  создают  структуры  данных
 
   ввода/вывода, относящиеся к драйверу  устройства,  вызывают
 
   специфические для драйвера программы инициализации и выпол-
 
   няют запросы, указанные в вызове макрокоманды DPT_STORE.
 
 
        Для каждого нового устройства, которое подсоединяют  к
 
 
                            - 299 -
 
                        00152-01 97 07-1
 
 
   системе, программы выполняют следующие действия:
 
 
        - создают блок управления устройством для данного уст-
 
   ройства. Если это первое появление имени устройства и конт-
 
   роллера, команды создают блок данных устройства, блок  зап-
 
   роса канала и блок диспетчеризации прерывания;
 
 
        - выполняют операции инициализации, указанные макроко-
 
   мандой DPT_STORE внутри частей инициализации и  реинициали-
 
   зации прологовой таблицы драйвера;
 
 
        - привязывают все адреса в диспетчерцкой таблице драй-
 
   вера и таблице выбора функций к системным виртуальным адре-
 
   сам;
 
 
        - вызывают программу инициализации  контроллера,  ука-
 
   занную в блоке запроса канала, если CRB (блок запроса кана-
 
   ла) был создан;
 
 
        - вызывают программу  инициализации  устройства  (если
 
   таковая  существует),  указанную  в  диспетчерской  таблице
 
   драйвера. Если в этой таблице таких программ не существуют,
 
   вызывают программу инициализации  устройства,  указанную  в
 
   CRB.
 
 
        Операции команд AUTOCONFIGURE и CONNECT повышают прио-
 
   ритетный уровень до IPL$POWER, чтобы предотвратить прерыва-
 
   ние программ инициализации.
 
 
        Команда RELOAD (перезагрузить)  замещает  существующий
 
   драйвер новым. Эта команда загружает новый  драйверный  код
 
   (программу) в бесстраничную системную память. В отличие  от
 
   других команд генерации системы для загрузки драйвера,  эта
 
 
                            - 300 -
 
                        00152-01 97 07-1
 
 
   команда полагает, что структуры данных ввода/вывода,  отно-
 
   сящиеся к драйверу, уже  существуют  и,  исходя  из  этого,
 
   обновляет базу данных,  чтобы  отобразить  модифицированную
 
   программу и ее отличающиеся ячейки в пространстве виртуаль-
 
   ных адресов системы. Эта команда выполняет следующие  функ-
 
   ции:
 
 
        - выполняет запросы,  указанные  вызовом  макрокоманды
 
   DPT_STORE только в секции реинициализации прологовой табли-
 
   цы драйвера;
 
 
        - привязывает все адреса в таблице  выбора  функций  и
 
   диспетчерской  таблице  драйвера  к  системным  виртуальным
 
   адресам;
 
 
        - вызывает программу инициализации контроллера.
 
 
        Документ [3] раздел  I4  содержит  детальные  описания
 
   всех команд SYSGEN, относящихся к драйверам устройств.
 
 
 
        13.1.2. Инициализация во  время  восстановления
 
                после сбоя питания
 
 
 
        Во время процедур восстановления питания  операционная
 
   система находит каждый блок управления устройством  в  базе
 
   данных ввода/вывода.  Каждый  блок  управления  устройством
 
   указывает на блок запроса канала для контроллера  устройст-
 
   ва. Блок запроса канала содержит адрес программы  инициали-
 
   зации контроллера, если он был указан.  Система  использует
 
   следующую цепочку указателей для определения местоположения
 
   адреса программы инициализации:
 
 
                            - 301 -
 
                        00152-01 97 07-1
 
 
        DDB ---> UCB ---> CRB ---> программа инициализации
 
                                   контроллера
 
 
        Если при обращении  макрокоманды  DPT_STORE  загружает
 
   адрес программы инициализации контроллера в поле блока зап-
 
   роса канала CRB$L_INTD+VEC$L_INITIAL, то операционная  сис-
 
   тема вызывает программу инициализации для каждого  контрол-
 
   лера. Для CRB$L_INTD + VEC$L_INITIAL блока запроса канала.
 
 
        Вслед за этим система проверяет наличие программы ини-
 
   циализации устройства. Сначала система  просматривает  поле
 
   инициализации устройства в диспетчерской  таблице  драйвера
 
   (DDT$L_UNITINIT). Если это поле не содержит адреса, система
 
   проверяет блок запроса канала, используя следующую  цепочку
 
   указателей:
 
 
        DDB ---> UCB ---> CRB ---> программа инициализации
 
                                   устройства
 
 
        Если блок запроса канала,  или  диспетчерская  таблица
 
   драйвера содержит ненулевой адрес для такой программы, сис-
 
   тема вызывает программу, чтобы инициализироввать  устройст-
 
   во. Система вызывает только одну программу; если драйверная
 
   диспетчерская таблица содержит адрес, то адрес в CRB  игно-
 
   рируется.
 
 
 
        13.1.3. Контекст инициализации
 
 
 
        Операционная система мос/вп всегда вызывает  программы
 
   инициализации устройств  и  контроллеров  при  приоритетном
 
   уровне, поднятом до IPL$_POWER. Высокий уровень  приоритета
 
   предохраняет процессор от любых прерываний, пока выполняет-
 
 
                            - 302 -
 
                        00152-01 97 07-1
 
 
   ся инициализация. Программы инициализации не  должны  пони-
 
   жать приоритетный уровень. Система вызывает программы  ини-
 
   циализации с помощью инструкции JSB; эти  программы  выпол-
 
   няют возврат через инструкцию RSB.
 
 
        Программы инициализации контроллера являютя зависимыми
 
   от устройств. Например,  контроллер  считывателя  перфокарт
 
   имеет программу инициализации, которая может разрешить пре-
 
   рывания от устройства, устанавливая бит разрешения прерыва-
 
   ний в регистре команд  и  состояния  устройства.  Программа
 
   инициализации контроллера диска, с  другой  стороны,  может
 
   разрешить прерывания и  инициализацию  регистров  состояния
 
   для всех устройств.
 
 
        Во время обращения к программе инициализации  контрол-
 
   лера, регистры содержат следующую информацию:
 
 
   Регистр            Значение
 
      R4         Адрес регистра команд и состояния.
 
      R5         Адрес блока данных прерывания, который опи-
 
                 сывает контроллер.
 
      R6         Адрес блока данных устройства, связанного с
 
                 контроллером.
 
      R8         Адрес блока запроса канала для контроллера.
 
 
        Программы инициализации устройств полезны при  инициа-
 
   лизации зависимых от устройства полей  в  блоке  управления
 
   устройством. Например, программы инициализации диска  могут
 
   также установить параметры диска (такие, как число  цилинд-
 
   ров) в блоке управления устройством и ожидать, когда  подк-
 
   люченные к системе диски наберут требуемую скорость  враще-
 
   ния. Программы инициализации устройств должны устанавливать
 
 
                            - 303 -
 
                        00152-01 97 07-1
 
 
   бит подключения к системе в  блоке  управления  устройством
 
   (UCB$V_ONLINE) для об'явления устройства принадлежащим сис-
 
   теме.
 
 
        Если устройство  нуждается  в  постоянном  закреплении
 
   ресурсов адаптера общей шины, программа инициализации  уст-
 
   ройства может вызывать программы управления ресурсами адап-
 
   тера общей шины (это программы  операционной  системы)  для
 
   назначения этих  ресурсов.  Затем  программа  инициализации
 
   может установить биты в полях  описания  ресурсов  адаптера
 
   общей   шины   в   CRB,    например,    VEC$V_PATHLOCK    в
 
   CRB$L_INTD+VEC$B_DATAPATH.
 
 
        Во время вызова  программы  инициализации  устройства,
 
   регистры содержат следующие значения:
 
 
   Регистр                 Значение
 
      R3           Адрес основного регистра управления и
 
                   состояния.
 
      R4           Адрес второстепенного регистра управления
 
                   и состояния; если второстепенный CSR от-
 
                   сутствует, содержимое R4 равно содержимому
 
                   R3.
 
      R5           Адрес блока управления устройством.
 
 
        Если драйверные программы  инициализации  модифицируют
 
   содержимое регистров от R4 до RII, программы должны  сохра-
 
   нять содержимое этих регистров перед  использованием  их  и
 
   восстанавливать их содержимое  перед  возвратом  управления
 
   операционной системе.
 
 
 
 
 
 
                            - 304 -
 
                        00152-01 97 07-1
 
 
        13.2. Программа отмены ввода/вывода
 
 
 
        Программы  операционной  системы  вызывают   программу
 
   отмены ввода/вывода в  драйвере  устройства  при  следующих
 
   обстоятельствах:
 
 
        - когда процесс задает отмену ввода/вывода в системную
 
   службу канала;
 
 
        - когда процесс освобождает устройство и для  него  не
 
   назначено никаких каналов ввода/вывода процесса;
 
 
        - когда процесс отсоединяет канал от устройства;
 
 
        - когда интерпретатор команд выполняет операции  наве-
 
   дения порядка (уборки) как часть окончания образа,  отменяя
 
   все ожидающие запросы ввода/вывода для образа,  и  закрывая
 
   все файлы,  относящиеся  к  образу,  открытые  для  каналов
 
   ввода/вывода процесса.
 
 
        EXE$CANCEL находит UCB устройства, связанного с  кана-
 
   лом ввода/вывода процесса, по  указателю  в  блоке  запроса
 
   канала:
 
 
        Индексный номер канала ---> CCB ---> адрес UCB
 
 
        При этом она выполняет следующие действия:
 
 
        1) повышает IPL до форк-уровня;
 
 
        2) извлекает все пакеты запросов ввода/вывода, связан-
 
   ные с  процессом,  из  очереди  ожидания  пакетов  запросов
 
   ввода/вывода на устройстве;
 
 
 
 
 
                            - 305 -
 
                        00152-01 97 07-1
 
 
        3)   устанавливает   код   состояния   SS$_CANCEL    в
 
   IRP$L_MEDIA;
 
 
        4) сбрасывает  бит  функции  буферизированного  чтения
 
   (IRP$V_FUNC) в  IRP$W_STS  для  операции  буферизированного
 
   чтения;
 
 
        5) помещает пакеты ввода/вывода, извлеченные из очере-
 
   ди ожидания пакетов, в очередь постобработки ввода/вывода;
 
 
        6) если очередь постобработки ввода/вывода пуста, зап-
 
   рашивает программное прерывание.
 
 
        Программа вызывает программу отмены ввода/вывода, ука-
 
   занную в диспетчерской  таблице  драйвера  соответствующего
 
   драйвера устройства. EXE$CANCEL  определяет  местоположение
 
   программы следующим образом:
 
 
        UCB ---> DDT ---> адрес программы отмены ввода/вывода
 
 
        Программа отмены ввода/вывода  дает  драйверу  возмож-
 
   ность предотвратить в дальнейшем  зависящую  от  устройства
 
   обработку запроса ввода/вывода, который  был  обработан  на
 
   устройстве в текущий моментн.
 
 
 
        13.2.1. Контекст программы отмены ввода/вывода
 
 
 
        Когда    EXE$CANCEL    вызывает    программу    отмены
 
   ввода/вывода, приоритетный уровень прерывания находится  на
 
   уровне драйверного форк-IPL, так что программа может читать
 
   и модифицировать  блок  управления  устройством.  Во  время
 
   вызова регистры содержат следующую информацию:
 
 
 
 
                            - 306 -
 
                        00152-01 97 07-1
 
 
     Регистр       Значение
 
        R2    Индексный номер канала
 
        R3    Адрес текущего пакета запроса ввода/вывода.
 
        R4    Адрес блока управления процессом того процесса,
 
              для которого системной службой канала должна
 
              выполниться отмена ввода/вывода.
 
        R5    Адрес блока управления устройством.
 
        R8    Причина запроса отмены ввода/вывода. Код причины
 
              определяется макрокомандой $CANDEF. Возможные
 
              значения R8 включают:
 
              CAN$C_CANCEL   вызвана системными службами
 
                             $CANCEL или SDALLOC.
 
              CAN$C_DASSGN   вызвана системной службой
 
                             $DASSGN.
 
 
        Если программа отмены ввода/вывода использует регистры
 
   помимо регистров R0 - R3, она должна сохранить их  содержи-
 
   мое и восстановить его перед выходом.
 
 
        Драйверы устройств могут пожелать основывать свои опе-
 
   рации отмены  ввода/вывода  по  причине  запроса  отмены  в
 
   результате освобождения канала. Например, драйвер терминала
 
   отменяет не связанные (OUT-OF-BAND) запросы  AST  только  в
 
   том случае, если вызов его  программы  отмены  ввода/вывода
 
   является результатом вызова системной  службы  освобождения
 
   канала ввода/вывода.
 
 
 
        13.2.2. Драйверы,  которые   не   нуждаются   в
 
                программе отмены ввода/вывода
 
 
 
 
 
 
                            - 307 -
 
                        00152-01 97 07-1
 
 
        Драйверы не нуждаются в зависящей от устройства  обра-
 
   ботке, выполняемой по запросу ввода/вывода. Можно отпустить
 
   аргумент CANCEL в макрокоманде DDTAB. В таком случае,  мак-
 
   рорасширение DDTAB  загружает  адрес  программы  IOC$RETURN
 
   операционной системы в соответствующую позицию  диспетчерс-
 
   кой  таблицы  драйвера.  Программа  выполняет  единственную
 
   инструкцию - RSB.
 
 
 
        13.2.3. Программа не  зависящей  от  устройства
 
                отмены ввода/вывода
 
 
 
        При вызове макрокоманды DDTAB драйверы могут указывать
 
   в качестве значения аргумента CANCEL программу IOC$CANCELIO
 
   операционной системы.  Программа  отменяет  ввод/вывод  для
 
   устройства следующим не зависящим от устройства образом:
 
 
        1) убеждается, что устройство занято. Для этого прове-
 
   ряется бит  занятости  устройства  слова  состояния  в  UCB
 
   (UCB$V_BSY в UCB$W_STS);
 
 
        2)  находит  поле  идентификации  процесса  в   пакете
 
   ввода/вывода,  обрабатываемом  на  устройстве   в   текущий
 
   момент. Используется следующая цепочка указателей:
 
 
          UCB ---> IRP ---> поле идентификации процесса
 
 
        IOC$CANCELIO  убеждается,  что  это  поле  (IRP$L_PID)
 
   содержит ту же величину, что и соответствующее поле в блоке
 
   управления процессом (PCB$L_PID);
 
 
        3) убеждается, что указанный номер (индексный)  канала
 
   тот же самый, что и значение, запомненное в пакете  запроса
 
 
 
                            - 308 -
 
                        00152-01 97 07-1
 
 
   ввода/вывода, поле индекса канала (IRP$W_CHAN);
 
 
        4) устанавливает бит отмены ввода/вывода в слове  сос-
 
   тояния UCB (UCB$V_CANCEL в UCB$W_STS).
 
 
        Другие драйверные программы, такие как программа  тай-
 
   маута устройства, проверяют  бит  отмены  ввода/вывода  для
 
   определения - повторного запуска операции, или  прекращения
 
   ее выполнения.
 
 
 
        13.2.4. Зависимые   от   устройства   программы
 
                отмены ввода/вывода
 
 
 
        Драйверы, которые включают свои собственные  программы
 
   отмены ввода/вывода, должны выполнять первые  три  действия
 
   программы IOC$CAN_CELIO, перечисленные  в  п.  I3.2.3,  для
 
   опеределения, является ли  выданные  для  обработки  запрос
 
   ввода/вывода порождением процесса, отменяющего ввод/вывод в
 
   канале. Если три эти  проверки  успешны,  программа  отмены
 
   может выполнять действия, специфические для устройства.
 
 
 
        13.3. Программы регистрации ошибок
 
 
 
        Операционная система содержит две  программы,  которые
 
   могут вызываться драйвером для выделения и заполнения буфе-
 
   ров регистрации ошибок после появления в устройстве  ошибки
 
   или таймаута:
 
 
                    -  ERL$DEVICERR
 
                    -  ERL$DEVICTMO

 
 
                            - 309 -
 
                        00152-01 97 07-1
 
 
        Обе  программы  расчитывают  обнаружить  адрес   блока
 
   управления устройством в регистре R5. Драйверы должны вызы-
 
   вать их на уровне форк-IPL. Каждая  из  программ  выполняет
 
   следующие действия:
 
 
        1) выделяет буфер регистрации ошибок, имеющий  размер,
 
   указанный в таблице  диспетчеризации  драйвера  устройства.
 
   Они  используют  для  определения  длины  буфера  следующую
 
   цепочку указателей:
 
 
        UCB ---> DDT ---> длина буфера регистрации ошибки
 
 
        2) загружает пакет запроса ввода/вывода и блок  данных
 
   устройства из блока управления устройством в поля буфера;
 
 
        3) загружает адрес буфера сообщения об ошибке, в кото-
 
   ром должно быть сохранено содержимое регистров устройства.
 
 
        4) вызывает программу  выгрузки  (дампа)  регистров  в
 
   драйвере устройства. Эта программа определяется по  следую-
 
   щей цепочке указателей:
 
 
        UCB ---> DDT ---> адрес программы дампа регистров
 
 
        Адрес программы дампа регистров указывается  значением
 
   аргумента REGDMP в вызове макрокоманды DDTAB.
 
 
        Программа дампа регистров может полагать  загруженными
 
   следующие регистры:
 
 
    Регистры     Содержимое
 
        R0  Адрес буфера
 
        R4  Адрес регистра управления и состояния, если
 
            драйвер использовал для ожидания макрооператор
 
 
 
                            - 310 -
 
                        00152-01 97 07-1
 
 
            WFIKPCH (для ожидания прерывания или таймаута).
 
        R5  адрес блока управления устройством.
 
 
        Программа дампа  должна  сохранять  и  восстанавливать
 
   содержимое регистров от R3 до RII, если  программа  требует
 
   их использования.
 
 
        Драйверная программа дампа регистров должна  заполнять
 
   буфер следующим образом:
 
 
        1) писать  значение  двойного  слова,  представляющего
 
   число регистров устройства, которые должны быть загружены в
 
   буфер;
 
 
        2) переслать двухсловное значение регистра  устройства
 
   в буфер вслед за двойным словом счета регистров.
 
 
        Программа должна сохранить содержимое  каждого  выгру-
 
   жаемого регистра устройства в  двухсловной  ячейке  буфера.
 
   Например, следующая инструкция сохраняет содержимое регист-
 
   ра устройства:
 
 
              MOVZWL  TD_STATUS(R4),(R0)+
 
                               
        Драйвер,  поддерживающий  регистрацию  ошибок,  должен
 
   удовлятворять следующим требованиям:
 
 
        - должен использовать расширение регистрации ошибок  в
 
   блоке управления устройством;
 
 
        - должен быть уверен, что DDT$W_ERRORBUF имеет  доста-
 
   точно большой размер для помещения  EMB$L_DV_REGSAV+4  плюс
 
   одно двойное слово для каждого выгружаемого регистра;
 
 
                            - 311 -
 
                        00152-01 97 07-1
 
 
        - прологовая таблица такого драйвера должна установить
 
   характеристику DEV$V_ELG устройства в UCB$_DEVCHAR.
 
 

 
 
                            - 312 -
 
                        00152-01 97 07-1
 
 
             ПЕРЕЧЕНЬ ССЫЛОЧНЫХ ДОКУМЕНТОВ
 
 
        1. Операционная система МОС ВП. Подсистема  системного
 
   программиста.  Программа  генерации  системы.   Руководство
 
   пользователя. 00152-01 92 07
 
 
        2. Операционная система МОС ВП. Подсистема  системного
 
   сервиса.  Программы  системного  обслуживания.   Справочный
 
   материал. 00152-01 97 06
 
 
        3. Операционная система МОС ВП. Подсистема  системного
 
   сервиса.   Разработка   драйверов.   Справочный   материал.
 
   00152-01 97 07-02
 
 
        4. Операционная система МОС ВП. Подсистема  системного
 
   программиста. Программа анализа аварийного состояния систе-
 
   мы. Руководство оператора. 00152-01 34 16
 
 
        5. Операционная система МОС ВП.  Подсистема системного
 
   сервиса. Управление вводом/выводом. Руководство программис-
 
   та. 00152-01 33 03
 
 
        6. Архитектура и система машинных инструкций. Справоч-
 
   ный материал. 00152-01 97 01
 
 
        7. Операционная система МОС ВП. Система программирова-
 
   ния на языке макроассемблер. Описание языка. 00152-01 35 01
 
 
        8. Операционная система МОС ВП. Подсистема  системного
 
   программиста. Установка и запуск компонент  системы.  Руко-
 
   водство системного программиста. 00152-01 32-01
 
 
 
 
 
 
 
 
                            - 312K -
 
                        00152-01 97 07-1
 
 
             ПЕРЕЧЕНЬ ССЫЛОЧНЫХ ДОКУМЕНТОВ
 
 
        1. Операционная система МОС ВП.  Подсистема системного
 
   программиста.  Программа  генерации  системы.   Руководство
 
   пользователя. 2б.00152-01 92 07
 
 
        2. Операционная система МОС ВП. Подсистема  системного
 
   сервиса.  Программы  системного  обслуживания.   Справочный
 
   материал. 2б.00152-01 97 06
 
 
        3. Операционная система МОС ВП. Подсистема  системного
 
   сервиса.   Разработка   драйверов.   Справочный   материял.                
  
   2б.00152-01 97 07-02
 
 
        4. Операционная система МОС ВП. Подсистема  системного
 
   программиста. Программа анализа аварийного состояния систе-
 
   мы. Руководство оператора. 2б.00152-01 34 16
 
 
        5. Операционная система МОС ВП.  Подсистема системного
 
   сервиса. Управление вводом/выводом. Руководство программис-
 
   та. 2б.00152-01 33 03
 
 
        6. Архитектура и система машинных инструкций. Справоч-
 
   ный материал. 2б.00152-01 97 01
 
 
        7. Операционная система МОС ВП. Система программирова-
 
   ния на языке макроассемблер. Описание языка. 2б.00152-01
 
   35 01
 
 
        8. Операционная система МОС ВП. Подсистема  системного
 
   программиста. Установка и запуск компонент  системы.  Руко-
 
   водство системного программиста. 2б.00152-01 32-01
 
  
                         - 313K -

                      00152-01 97 07-01
  
  ------------------------------------------------------------
  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
 
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!