Interested Article - Дескриптор шлюза

Дескриптор шлюза — служебная структура данных , служащая для различных переходов. Используется только в защищённом режиме . В реальном режиме некоторым аналогом может служить дальний адрес. Длина дескриптора стандартна и равна восьми байтам .

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

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

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

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

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

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

Шлюз вызова ( англ. Call Gate )

см также

Нельзя использовать в IDT .

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

Шлюз задачи ( англ. Task Gate )

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

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

Шлюз прерывания ( англ. Interrupt Gate )

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

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

Шлюз ловушки ( англ. Trap Gate )

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

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

См. также

Ссылки

Источник —

Same as Дескриптор шлюза