logo
АВМиС - бывшее АПЭВМ / apvem / всякаявсячина

45.Шлюз задач

Аналогично тому, как можно вызвать подпрограмму через шлюз вызова, для вызова задачи командой CALL можно использовать шлюз задачи. Формат шлюза задачи представлен на рис. 16.

Рис. 16. шлюз задачи.

Шлюзы задач, вызываемых по команде CALL, могут располагаться в таблицах GDT или LDT.

Существенное различие между вызовом подпрограммы и вызовом задачи. После возврата из подпрограммы при её повторном вызове мы войдём в процедуру в начальной точке входа. В аналогичном случае при возврате из задачи и её повторном вызове управление будет передано команде, находящейся сразу за командой IRET.

Это происходит потому, что при переключении задачи в сегменте TSS записывается содержимое регистров CS:IP на момент переключения задачи. Если задача была вызвана при помощи команды CALL и возврат (обратное переключение) было выполнено по команде IRET, в TSS записывается адрес CS:IP, указывающий на следующую после IRET команду. Вы можете поместить там команду безусловного перехода JMP на начало задачи и таким образом зациклить задачу. После этого вызов задачи станет похож на вызов подпрограммы.

Существует ещё одна очень интересная возможность для переключения задач - переключение задач по прерыванию.

Эту возможность можно легко реализовать, если поместить шлюз задачи в дескрипторную таблицу прерываний IDT. Например, можно сделать отдельные задачи для обработки исключений или аппаратных прерываний. В последнем случае обработчикам аппаратных прерываний не нужно использовать стек прикладных задач, так как они будут иметь свой собственный стек.