Информатика и технология программирования


Реентерабельность и проблемы резидентных программ в DOS - часть 2


Эти разрозненные переменные и составляют контекст текущей выполняемой программы (задачи). В то же время резидентная программа, хотя и вызывается по прерыванию, при выполнении функций DOS, должна быть заявлена как отдельный процесс (задача). Самым естественным для нее является наследование состояния собственного основного процесса ( main ) перед его завершением. Тогда в резидентную программу должны быть включены средства переключения задач, создающих более или менее полный режим мультипрограммирования, и она должна самостоятельно:



- в функции main() определить ряд ячеек сегмента данных DOS, которые содержат параметры текущей выполняемой программы (указатель на PSP, указатель на DTA, индикатор занятости DOS и др.);



- определить значения перечисленных параметров для собственной программы;



- при необходимости организовать собственную область стека в программе;



- перед выполнением функции DOS в программе обработки прерывания необходимо убедиться в том, что DOS не занята
обработкой программного прерывания от текущей выполняемой (прерванной) программы. Если это так, то необходимо отложить вызов до появления программного прерывания 28h (DOS свободна) или проверять занятость DOS по таймеру. Аналогичные действия необходимы также для ROM BIOS;



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



- аналогичные действия необходимо выполнять и со стеком.

Приведенный ниже пример демонстрирует реальные трудности оформления процесса обработки прерывания в виде полноправной задачи в DOS.


//------------------------------------------------------bk63-02.cpp


&#35include &#60stdio.h&#62
&#35include &#60io.h&#62
&#35include &#60dos.h&#62
&#35include &#60alloc.h&#62
&#35include &#60string.h&#62



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



Книжный магазин