Системное программное обеспечение персональных ЭВМ


15.4. Переключение контекста - часть 2


В операции по переключению контекста входят: сохранение значений регистров SS, SP, указывающих на стек фоновой программы, и установка собственных значений этих регистров, запомненных в get_context (на время изменения значений в стековых регистрах запрещаются прерывания); перехват вектора прерывания 0x24 - обработки критических ситуаций (прежний вектор сохраняется); получение и сохранение статуса обработки Ctrl+Break, установленного в фоновой программе, и отключение этой обработки (можно также перехватывать вектор прерывания 0x23, устанавливая собственный обработчик Ctrl+Break); сохранение адреса DTA фоновой программы и установка адреса своей DTA; запоминание PID текущей программы и установка собственного PID (с этого момента система "знает", что активной стала наша программа).

После переключения контекстов вызывается функция tsr_exec, выполняющая "прикладные" действия - то, для чего и разрабатывалась TSR-программа. После выполнения прикладной части происходит обратное переключение контекстов - восстановление запомненных адресов, переменных и т.д. фоновой программы, заканчивается функция act_tsr сбросом флага активности TSR-программы.

Прикладная часть нашей TSR-программы (функция tsr_exec) имеет только демонстрационное назначение: она выводит в левый верхний угол экрана сообщение о работе TSR-программы, которое снимается по нажатию любой клавиши. Однако, даже в такой простой функции следует обратить внимание на два важ- ных момента. Во-первых, переключение контекстов как бы продолжается в прикладной части. Мы имеем в виду сохранение образа той части экрана, которая будет перекрыта сообщением TSR-программы и восстановление этого образа перед возвратом из функции. В более общем случае следует, возможно, сохранять и восстанавливать и номер видеорежима, позицию курсора, номер текущей видеостраницы и т.д. Во-вторых, обратите внимание на то, что для вывода информации мы используем здесь прямую запись в видеопамять, а для ввода (ожидание нажатия клавиши) - прерывание BIOS.Это неслучайно: ведь по условиям применения прерывания 0x28 нам запрещено использование функций консольного ввода-вывода DOS.




- Начало -  - Назад -  - Вперед -