Главная · Поиск книг · Поступления книг · Top 40 · Форумы · Ссылки · Читатели

Настройка текста
Перенос строк


    Прохождения игр    
Demon's Souls |#13| Storm King
Demon's Souls |#11| Мaneater part 2
Demon's Souls |#10| Мaneater (part 1)
Demon's Souls |#9| Heart of surprises

Другие игры...


liveinternet.ru: показано число просмотров за 24 часа, посетителей за 24 часа и за сегодня
Rambler's Top100
Образование - Различные авторы Весь текст 2311.07 Kb

Программирование и кодирование

Предыдущая страница Следующая страница
1 ... 54 55 56 57 58 59 60  61 62 63 64 65 66 67 ... 198
         также сохраняет текущие значения SS:SP в текущем PSP со смещением
         16h. DOS использует стековые величины в PSP для обработки  крити-
         ческой  ошибки;  он использует эти величины как общие переменные,
         когда он возвращает управление и должен восстановить первоначаль-
         ный  стек.
              Подпрограмма диспетчера использует  три  собственных  стека:
         внешний  стек,  пользовательский  стек и стек ввода/вывода диска.
         Сохранив программный стек,  диспетчер делает безусловное переклю-
         чение  на внешний стек и разрешает прерывания.  Если запрос нахо-
         дится в диапазоне от 01h до 0Сh, и диспетчер не обрабатывает кри-
         тическую ошибку, то он переходит на стек ввода/вывода. Все другие
         запросы, кроме Get Extended Error (AH=59h), диспетчер обслуживает
         стеком ввода/ вывода диска.
              Если запрос должен быть обслужен стеком ввода/вывода диска и
         breaks разрешены, то перед выполнением запроса диспетчер выполня-
         ет проверку на break. Функции от 01h до 0ch явно проверяют breaks
         при необходимости.  (Некоторые из них явно игнорируют breaks; все
         другие проверяют breaks. Информация для выполнения описания таких
         запросов приведена в "IBM Technical Reference Manual").
              Диспетчер int  21h  использует  код  функции AH как индекс в
         таблице действующих подпрограмм,  перезапоминает DS:BX и передает
         управление работающей подпрограмме. После ее выполнения диспетчер
         запрещает breaks,  уменьшает флаг критического интервала, переза-
         поминает регистры SS:SP,  перезапоминает значения регистров перед
         int 21h и выходит из прерывания через IRET.  Действующая подпрог-
         рамма,  которая нуждается для возврата значений в модификации ин-
         дексных регистров,сохраняет значения регистров в стеке программы.

                             Подпрограммы в/в символов

               Функции BIOS  в диапазоне 01 - 0ch известны как функции в/в
         символов,  потому что это следует из  способа  их  использования.
         Операции  в/в символов занимают относительно много времени.  BIOS
         может ожидать ввод, чтобы удовлетворить запрос чтения. Вывод сим-
         волов  также  занимает  относительно  много времени.  Большинство
         функций ввода символов вызывают подпрограмму  опроса  клавиатуры.
         Подпрограмма  опроса  клавиатуры неоднократно проверяет консоль и
         устройство стандартного ввода на наличие прерываний и затем  про-
         веряет устройство ввода на наличие символов.Если символов в нали-
         чии нет,то подпрограмма опроса клавиатуры всегда вызывает диспет-

                                      - 4-25 -
         чер фонового раздела.  Функция вывода на дисплей (AH=2)  вызывает
         фоновый диспетчер каждый раз, когда она записывает 4 символа. Фо-
         новый диспетчер выполняет прерывание int 28h.
             Подпрограммы обработки прерывания (ISR) для int 28h при фоно-
         вой обработке играют важную роль.  В целях  повышения  надежности
         обработки прерываний ISR int 28h выполняет запросы BIOS, обслужи-
         ваемые в стеке дискового в/в. Все прерывания функций int 21h, но-
         мер которых больше номера 0Ch (за исключением функций,  обрабаты-
         ваемых без переключения стека), DOS обслуживает в стеке дискового
         в/в.

                             Глобальные переменные DOS

             Для сохранения  информации о состоянии функционирования и для
         поддержки контекста запросов BIOS операционная  система  DOS  ис-
         пользует  многие глобальные переменные.  DOS обеспечивает рабочую
         область буферизованного ввода и для поддержки буферизованного ре-
         дактирования  входной  строки сохраняет дорожку текущего столбца.
         Одни переменные управляют  протоколированием  экрана,  алгоритмом
         распределения памяти и текущим переключением символов. Глобальные
         переменные включают флажки критической ошибки и критической  сек-
         ции,  текущую PSP и текущую дисковую область передачи (DTA - disk
         transfer area).  Другие глобальные переменные описывают  операции
         обработки в/в; они записывают адреса входов SFN, JFT и много дру-
         гой важной и полезной информации о запросе.
             DTA является "коварной" структурой данных, потому что DOS ис-
         пользует ее в непредсказуемых случаях. Для грамматического разбо-
         ра имен файлов и поиска каталогов DOS поддерживает свою собствен-
         ную  DTA,  а  результаты  этих  операций  она  копирует   в   DTA
         пользователя.  DOS замещает адрес DTA адресом буфера для чтения и
         записи обрабатываемого файла.  Такие операции как find first/find
         next  (найти  первый/найти  следующий) осуществляют запись непос-
         редственно в текущий DTA.
             Запросы, выполняемые с помощью TSR, как "побочный" эффект мо-
         гут изменить глобальные переменные DOS.  Операционная система DOS
         не ожидает,  что другая программа будет просматривать ее глобаль-
         ные переменные,  и,  вероятно,  придет в замешательство, если эти
         глобальные переменные будут изменены.

                                  Обработка break

             DOS проверяет наличие break в двух случаях.  Если запрос дол-
         жен быть обработан в дисковом стеке и если проверка break  разре-
         шена, диспетчер прерывания int 21h вызывает подпрограмму проверки
         break. Подпрограмма опроса клавиатуры (вызываемая с помощью функ-
         ций в/в символов) во время ожидания ввода и во время ожидания вы-
         вода на stdOut проверяет break.
             Подпрограмма проверки break проверяет текущее устройство кон-
         соли.DOS идентифицирует устройство консоли путем проверки атрибу-
         тов драйверов устройства, когда она загружает их (см.  главу  6).
         В своем заголовке устройство текущей консоли будет иметь установ-
         ленные биты IsStdIn и IsStdOut. Адрес устройства текущей  консоли
         DOS  записывает  в список списков. DOS будет проверять устройство
         консоли на break,  даже  если  некоторые программы  переназначают
         stdin.  Существует  неявное  предположение о том,  что устройство
         консоли было объявлено сервисной подпрограммой прерывания int 1Bh
         и может  получать уведомление о break асинхронно. Побочный эффект
         такого объявления состоит в том, что если  stdin  переназначается

                                      - 4-26 -
         на файл и программа выполняет его чтение с помощью функции преры-
         вания int 21h,  номер которых больше 0Ch, то клавиша Control-C не
         имеет своего обычного предназначения.
             Подпрограмма опроса  клавиатуры сначала вызывает подпрограмму
         проверки break и затем проверяет  стандартный  ввод.  Когда  идут
         операции в/в символов,  DOS обнаруживает break либо от устройства
         консоли,  либо от стандартного ввода;  но когда DOS  работает  со
         стеком дискового в/в, то проверяется только устройство консоли.
             Подпрограмма DOS, обрабатывающая break, устанавливает SS:SP в
         значение, записываемое с помощью диспетчера int 21h, восстанавли-
         вает все регистры в состояние, предшествующее прерыванию int 21h,
         сбрасывает флажки критической секции и критической ошибки,  и вы-
         полняет инструкцию int 23h. ISR int 23h может возвратить управле-
         ние  в  подпрограмму обработки break DOS либо по инструкции IRET,
         либо по инструкции RET. Выполнение инструкции IRET удаляет 6 бай-
         тов  из  стека,  в то время как выполнение возврата far (далекий)
         удаляет только 4 байта.  Путем выполнения сравнения значений в SP
         до и после выполнения инструкции int 23h,  подпрограмма break мо-
         жет сообщить, какая инструкция (RET или IRET) возвратила управле-
         ние.
             Если ISR int 23h сохраняет используемые ею регистры,  то  она
         может &продолжать выполнение с помощью инструкции IRET.  Если ISR
         возвращает управление с помощью возврата far (далекий), то, будет
         или нет продолжено выполнение,  определяется состоянием флага пе-
         реноса.  Если флаг переноса очищен, то выполнение будет продолже-
         но,  иначе  -  программа  будет аварийно завершена.  Подпрограмма
         break DOS вынуждает выполнить аварийное завершение путем загрузки
         в регистр AX значения 4C00h. Во всех случаях управление возвраща-
         ется в начало диспетчера int 21h. Затем диспетчер повторно выпол-
         няет  запрос  int  21h,  или выполняет запрос завершения в случае
         аварийного завершения.
             По умолчанию  ISR  int  23h  содержит  инструкцию IRET.  Файл
         COMMAND.COM устанавливает свою собственную ISR int  23h,  которая
         аварийно завершает текущую программу.  Другие программы могут ус-
         танавливать свои собственные подпрограммы обслуживания int 23h.

                           Обработка критической ошибки

             Многие запросы прерываний  int  21h  вызывают  операции  в/в.
         Большинство  запросов  на  в/в BIOS передает драйверу устройства.
         Если драйвер устройства не может завершить запрос, он сообщает об
         этом в BIOS.  BIOS отвечает на ошибки устройства  объявлением со-
         стояния критической ошибки. В  ответ  на  ошибку  устройства  DOS
         уменьшает значение флажка критической секции и увеличивает значе-
         ние флажка критической ошибки.  Порча блоков FAT  также  вызывает
         состояние критической ошибки.
             При обнаружении критической ошибки DOS выполняет одно из сле-
         дующих четырех действий:  игнорирует ошибку;  повторяет операцию,
         вызвавшую ошибку; завершает текущую программу или выполняет отказ
         текущему  вызову.  Однако,  все  эти  четыре опции имеют место не
         всегда. Для выбора образа действий DOS использует флажок.
             Если DOS уже обрабатывает критическую ошибку, то подпрограмма
         обработки критической ошибки отвергает отказ вызова, который при-
         вел ко второй критической ошибке.  Чтобы увидеть,  находится ли в
         обработке описатель запроса на в/в, подпрограмма обработки крити-
         ческой ошибки проверяет некоторую глобальную переменную DOS. Если
         это так,  то DOS выбирает адрес входа JFT этого описателя из дру-
         гой глобальной переменной и помечает этот описатель как  неправи-

                                      - 4-27 -
         льный; это действие предотвращает другую  критическую  ошибку  от
         того же самого описателя.
             В случае блокировки прерывания подпрограмма обработки  крити-
         ческой  ошибки  увеличивает  значение  флажка критической ошибки,
         уменьшает значение  флажка  критической  секции,  восстанавливает
         значения SS:SP, сохраненные диспетчером int 21h, и выполняет инс-
         трукцию int 24h.  Когда ISR int 24h осуществляет возврат управле-
         ния,  подпрограмма  обработки  критической ошибки восстанавливает
         пару SS:SP (т.к. ISR int 24h может изменить ее), увеличивает зна-
         чение флажка критической секции и устанавливает начальное состоя-
         ние флажка критической ошибки.
             Подпрограмма обработки  критической ошибки ожидает ISR преры-
         вания int 24h,  для того чтобы возвратиться к обработке. Если ISR
         запрашивает приемлемое действие, то подпрограмма обработки крити-
         ческой ошибки выполняет его.  Если подпрограмма обработки  крити-
         ческой ошибки пометила описатель как неправильный, то перед выхо-
         дом она восстанавливает SFN из глобальной переменной DOS. Запросы
Предыдущая страница Следующая страница
1 ... 54 55 56 57 58 59 60  61 62 63 64 65 66 67 ... 198
Ваша оценка:
Комментарий:
  Подпись:
(Чтобы комментарии всегда подписывались Вашим именем, можете зарегистрироваться в Клубе читателей)
  Сайт:
 

Реклама