Переключение задач. При переключении задач по прерываниям и ловушкам дескрипторы шлюзов задач или TSS должны находиться в таблице дескрипторов прерываний IDT. В случае использования команды CALL типа FAR сохраняется адрес возврата, но параметры не передаются. С точки зрения взаимодействия программ, переключение программ равнозначно завершению одной программы с сохранением на магнитном диске данных и запуску следующей программы. Но при переключении задач запоминается текущее значение указателя команд IP. Поэтому при ее повторном запуске задача запускается не с начальной точки, а продолжает выполнение с прерванной точки. Обработка ловушек - это обработка события, непосредственно связанная с выполнением текущей программы. Следовательно, обработчик прерывания должен попадать в контекст выполняемой программы. В общем случае, смена контекста здесь противопоказана. Но в некоторых случаях механизм переключения задач и при обработке ловушек может быть полезен. Прерывания служат для обработки некоторого внешнего события, явно не связанного с прерываемой программой. Для этих случаев целесообразно использовать переключение задач. Выход из подпрограмм (обратное переключение) производится командой IRET. Механизм выполнения команды IRET определяется способом вызова процедуры обработки прерывания. Если переход на программу обработки был произведен с использованием механизма переключения программ, то и возврат на исходную программу производится переключением задач. Если переключение задач вызывается командами CALL, командой вызова прерываний, например, INT n, или прерыванием, то процессор устанавливает бит вложенности NT в регистре флагов FLAGS и бит занятости B в поле прав доступа дескриптора. Затем записывает селектор дескриптора TSS прерываемой программы в специальное поле "селектора возврата" TSS принимающей программы. После этого обе задачи становятся занятыми. Это запрещает применение рекурсивных процедур и реентерабельных программ. Если переключение задач вызывает команда JMP,то селектор возврата, бит вложенности и бит занятости не устанавливаются. При выполнении команды возврата процессор проверяет бит вложенности (NT) и выбирает механизм перехода. В случае использования переключения задач читается селектор TSS программы возврата. Процедура обработки прерывания при каждом вызове должна начинаться с начального адреса. Но при выходе сохраняется адрес, следующий за командой выхода IRET. Эта проблема может быть решена чисто программным путем. Для возможности использования вызываемой процедуры переключением задач процедура должна быть зациклена и начальная команда процедуры должна следовать непосредственно или через безусловный переход за командой возврата. |