На главную
Подписка
Новости










Главная / MS-DOS / MS-DOS. РУКОВОДСТВО РАЗРАБОТЧИКА / Глава 4 / Диспетчер BIOS, Int 21h Сделать домашней страницей Добавить в избранное Написать писмо

НАЗАД СОДЕРЖАНИЕ ВПЕРЁД

Диспетчер BIOS, Int 21h

Когда загружается DOS, IBMDOS инициализирует для int 21h вход IVT, чтобы указать на код внутри загрузочного модуля IBMDOS. ISR обрабатывает все запросы int 21h. Так как эта программа переключает стеки и использует статические переменные, она нереентерабельна. Если TSR запрашивает обслуживание BIOS в неподходящее время, она испортит сохраненную DOS информацию о программе перед него плана. Результаты этого разрушения обычно катастрофические. Если Вам повезет, Ваша система гробанется, не испортив Ваш диск.


Обработка Int 21h начинается с прерываний, запрещенных в результате команды INT. Диспетчер содержит таблицу действующих подпрограмм, которые завершают обработку различных запросов BIOS. Она содержит точки входа для каждой действующей функции int 21h. Каждой строке этой таблицы непосредственно предшествует байт, содержащий номер входа таблицы. В конечном счете DOS использует код функции в AH, как индекс в этой таблице и сначала проверяет значение, переданное в AH. Если запрос не выполнен, то диспетчер возвращает ошибку.


Диспетчер Int 21h немедленно обслуживает запросы функций:


AH=51h (недокументированная - получить текущий PSP),


AH=62h (документированная - получить текущий PSP),


AH=50h (недокументированная - получить текущий PSP),


AH=33h (получить/установить прерывание).


Так как диспетчер не переключает стеки и не сохраняет контекстную информацию в статических переменных, эти запросы всегда безопасны.


Все по-другому, если запрос не является одним из этих четырех немедленно обслуживаемых запросов (почти все остальные функции Int 21h). DOS cохраняет все регистры в текущем стеке, сохраняет текущее содержание DS:BX в статической переменной и увеличивает флаг критического интервала (известный также, как InDOS). Для продолжения обработки запроса BIOS диспетчеру нужны регистры DS и BX; DOS будет перезагружать эти регистры перед передачей управления подпрограмме, которые будут завершать обработку запроса.


В это время регистры SS:SP все еще содержат адрес стека программы переднего плана. DOS записывает в статических переменных значения SS:SP для текущего и предшествующего входа (то есть соответствующие последние значения SS:SP диспетчера). Диспетчер также сохраняет текущие значения 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. Действующая подпрограмма, которая нуждается для возврата значений в модификации индексных регистров,сохраняет значения регистров в стеке программы.


НАЗАД СОДЕРЖАНИЕ ВПЕРЁД

Hosted by uCoz