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


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



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

Под контекстом мы понимаем все системные переменные, указатели и т.п., значения которых определяют выполняемую (активную) в данный момент программу. Фактически контекст содержит описание ресурсов, выделенных данной программе, так как в его составе - стек программы, таблица файлов задачи, дисковая передаточная область.

При инициализации функция main обращается к функции get_context, которая запоминает переменные контекста.

Запоминается содержимое стековых регистров программы (содержимое регистра SP запоминается с уменьшением на 200, так как часть стека используется при инициализации TSR-программы; в случае, если размер оставляемой в памяти части TSR-программы уменьшается, следует перевычислить значение SP в соответствии с устанавливаемым размером). Если TSR-программа не будет при активизации переключаться на свой стек, она будет использовать стек фоновой программы; даже при аккуратной работе с этим стеком (TSR-программа не должна в нем ничего "забывать" или наоборот - выбирать лишнее) это может привести к аварии, если размер стека фоновой программы будет невелик.

Запоминается адрес дисковой передаточной области, назначенной программе. Это, как правило, не обязательно и необходимо только в том случае, если TSR-программа использует функции, работающие с DTA.

Запоминается адрес PSP программы. Не все TSR-программы это делают, но это совершенно необходимо, если TSR-программа использует функции файлового ввода-вывода метода дескрипторов DOS. Поскольку PSP содержит ссылку на таблицу файлов задания, переключение на свой PSP дает TSR-программе возможность работать с собственной таблицей файлов. Использование таблицы файлов фоновой программы в большинстве случаев рисковано, и оно совершенно невозможно в тех случаях, когда TSR -программе необходимо сохранять свои файлы открытыми между свими активизациями.

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


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