|
|
|
|
Обработка критической ошибки
Многие запросы прерываний int 21h вызывают операции в/в. Большинство запросов на в/в BIOS передает драйверу устройства. Если драйвер
устройства не может завершить запрос, он сообщает об этом в BIOS. BIOS отвечает на ошибки устройства объявлением состояния критической ошибки. В ответ
на ошибку устройства DOS уменьшает значение флажка критической секции и увеличивает значение флажка критической ошибки. Порча блоков FAT также
вызывает состояние критической ошибки.
При обнаружении критической ошибки DOS выполняет одно из следующих четырех действий: игнорирует ошибку; повторяет операцию, вызвавшую ошибку;
завершает текущую программу или выполняет отказ текущему вызову. Однако, все эти четыре опции имеют место не всегда. Для выбора образа действий
DOS использует флажок.
Если DOS уже обрабатывает критическую ошибку, то подпрограмма обработки критической ошибки отвергает отказ вызова, который привел ко второй
критической ошибке. Чтобы увидеть, находится ли в обработке описатель запроса на в/в, подпрограмма обработки критической ошибки проверяет некоторую
глобальную переменную DOS. Если это так, то DOS выбирает адрес входа JFT этого описателя из другой глобальной переменной и помечает этот описатель как
неправильный; это действие предотвращает другую критическую ошибку от того же самого описателя.
В случае блокировки прерывания подпрограмма обработки критической ошибки увеличивает значение флажка критической ошибки, уменьшает значение
флажка критической секции, восстанавливает значения SS:SP, сохраненные диспетчером int 21h, и выполняет инструкцию int 24h. Когда ISR int 24h
осуществляет возврат управления, подпрограмма обработки критической ошибки восстанавливает пару SS:SP (т.к. ISR int 24h может изменить ее),
увеличивает значение флажка критической секции и устанавливает начальное состояние флажка критической ошибки.
Подпрограмма обработки критической ошибки ожидает ISR прерывания int 24h, для того чтобы возвратиться к обработке. Если ISR запрашивает приемлемое
действие, то подпрограмма обработки критической ошибки выполняет его. Если подпрограмма обработки критической ошибки пометила описатель как
неправильный, то перед выходом она восстанавливает SFN из глобальной переменной DOS. Запросы на завершение проходят через обработчик прерываний,
который заставляет диспетчер int 21h выполнить запрос на завершение.
Когда инициируется файл COMMAND.COM, он устанавливает свою собственную ISR int 24h; она является той подпрограммой, которая выдает сообщение
"Abort, retry or ignore ?" (Завершить аварийно, повторить или игнорировать ?). Другие программы также могут объявлять свои собственные подпрограммы
ISR int 24h.
|
|