Дескриптор шлюза — служебная структура данных, служащая для различных переходов. Используется только в защищённом режиме. В реальном режиме некоторым аналогом может служить дальний адрес. Длина дескриптора стандартна и равна восьми байтам. frame|Структура дескриптора шлюза вызова (курсивом обозначены поля, которых не было в 80286 Смещение (, жёлтые поля) — смещение процедуры в сегменте кода; Селектор (, оранжевое поле) — селектор сегмента процедуры, на который происходит переход. Может быть сегментом кода или TSS; Количество параметров (, голубое поле, биты 32-36) — количество слов (16-разрядный стек) или двойных слов (32-разрядный стек), копируемых из стека вызывающей программы в стек вызываемой процедуры. Актуально только при смене уровня привилегий; используется только в шлюзах вызова (Call Gate) Тип/права доступа (голубые поля, биты 40-47) — права доступа к шлюзу и его тип (см. Дескриптор сегмента — типы системных сегментов).

Селектор и смещение составляют обычный дальний адрес точки входа в процедуру.

При выполнении дальних команд CALL, JMP с указанием селектора шлюза, значение смещения, указываемого в команде игнорируется.

Алгоритм перехода с использованием шлюза:

Если уровень привилегий вызываемого сегмента кода численно меньше CPL, то происходит смена стека: из соответствующих полей TSS загружаются новые значения SS, (E)SP; Если была смена стека, то в новый стек сохраняется предыдущие значения SS, (E)SP (до вызова); Если была смена стека, а шлюз является шлюзом вызова, то в новый стек копируются WC слов/двойных слов из стека вызывающей программы; Если это шлюз прерывания или ловушки, то сохраняется значение (E)Flags; Сохраняется текущее значение CS, (E)IP; Из дескриптора шлюза в регистры CS:(E)IP загружается новый дальний адрес, указанный в соответствующих полях дескриптора;

Теперь подробнее:

Шлюз вызова () см также :en:Call gate Нельзя использовать в IDT.

Характерной особенностью шлюза вызова является наличие поля WC, благодаря которому возможна передача до 25=32 слов/двойных слов вызываемой процедуре через стек. Подробнее данный тип шлюза описан в статье Сегментная защита памяти

Шлюз задачи () Может использоваться в любой из трёх дескрипторных таблиц.

Единственная особенность этого шлюза состоит в том, что в качестве сегмента указан сегмент TSS. Поля смещения не используются и могут иметь любое значение. Шлюз прерывания () Этот шлюз используется только в IDT.

Его особенностью является сброс флага прерываний IF при входе в процедуру обработки. Так как прежнее значение регистра флагов сохраняется в стеке, то при выходе из процедуры обработки флаг IF принимает исходное положение. Это позволяет обрабатывать некоторые прерывания в режиме CLI.

Шлюз ловушки () Этот шлюз используется только в IDT.

Самый простой шлюз. При поступлении прерывания просто переходит на процедуру обработки (при необходимости производится переключение стека).

См. также Дескриптор сегмента Дескрипторные таблицы Регистры пользовательские x86 Сегментная адресация памяти Сегментная защита памяти

Ссылки http://www.intel.com/products/processor/manuals/

Категория:Программирование x86