также сохраняет текущие значения 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. Запросы