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

37.Шлюзы и их применение

Таблицы GDT и LDT представляют собой массивы дескрипторов - описателей сегментов. Кроме дескрипторов, описывающих сегменты памяти, таблица GDT может содержать специальные типы дескрипторов - шлюзы вызова (call gate), задач (task gate) и ловушек (trap gate). Шлюзы определяют точки входа в соответствующие процедуры. Например, шлюз вызова описывает адрес подпрограммы, вызываемой, например, по команде CALL. При вызове подпрограммы через шлюз в качестве операнда для команды CALL используется селектор, адресующий соответствующий дескриптор в таблице GDT (или в таблице LDT). Шлюз прерываний содержат не только логический адрес обработчика прерывания, но и поле доступа. Программа может вызвать прерывание только в том случае, если она имеет для этого достаточный уровень доступа. Таким образом, операционная система, работающая в защищенном режиме, может запретить прикладным программам вызывать некоторые или все программные прерывания. Для обеспечения защиты данных процессор назначает отдельные стеки для каждого кольца защиты. Когда задача вызывает подпрограмму из другого кольца через шлюз вызова, процессор вначале загружает указатель стека SS:SP адресом нового стека, взятого из соответствующего поля TSS.

Затем в новый стек копируется содержимое регистров SS:SP задачи (т.е. адрес вершины старого стека задачи). После этого в новый стек копируются параметры, количество которых задано в шлюзе вызова и адрес возврата.

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

Включение адресов стеков в TSS позволяет разделить стеки задач и обеспечивает их автоматическое переключение при переключении задач.

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

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

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

Шлюз задач—элемент таблицы IDT. Имеет следующий формат:

0—16—не используются;16—31—селектор состояния задачи+ байт права доступа

Структура дескриптора шлюза:

В первых 2х байтах—смещение--16 разрядов.В 5ом байте счетчик(5 разрядов)

В 6ом байте—смещение.Всегда 32 .Поле min 4—7 С,F

Дескриптор шлюза используется для обращения к данным, уровень привелегий которых отличается от предыдущих. Поле тип=5(шлюз задач).Записано=Е(шлюз прерываний). Записано=F(шлюз ловушек)

Счетчик.

Операции счета 5бит.

Подсчитывает колличество параметров, копируемых из стека вызывающей проги в стек вызываемой. Т.к. 32битный тип, то длина параграфа=32.

Селектор TSS.

Индекс сегмента состояния шлюза ловушки или шлюза прерываний.

Существует физический предел числа дескрипторов, которыйе можно создать(13бит)=>213

Шлюз прерываний.

Если шлюз задач обеспечивает обработку прерываний в режиме переключения задач, то шлюз прерываний предоставляет собой элемент таблицы IDT.

Первые 5 байт—пустой счетчик.Селектор остается и байт прав доступа в поле мин число—14 байт.Припередаче управления в случае обработки прерывания нужно обязательно установить 9й флаг в в регистре флагов. Только соответствующее прерывание можно обработать. 9й бит регистрафлагов при переключении задач не нужно т.к. он переключается принудительно. Проверка 9го бита является аппаратной защитой от ненужных прерываний.Шлюз ловушек(элемент IDT)

Форат похож на формат шлюза прерываний. 6й байт прав доступа одинаков, 5й байт пустой, смещение и сегмент одинаковы. В поле типа для этого дескриптора все 1. Формат селектора одинаков.

Замечания:

  1. Отличие таблицы IDT от таблицы глобальных и локальных в следующем:

--0й дескриптор используется для оценки возникновенияисключительных ситуаций связанных с операцией деления. А в таблице сегм. Глобальной 0й дескриптор не используется.

2)Порядок перечисления дескрипторов важен в таблице IDT для глобальной и локальной таблицы не имеет значения.