Шлюз виклику (англ. call gate) — механізм у процесорній архітектурі x86, призначений для зміни рівня привілеїв задачі, і реалізований за допомогою механізму CALL FAR.

Призначення ред.

Призначення шлюзів виклику — дозволити менш привілейованому коду (такому, як звичайний застосунок) викликати код, що виконується з вищим рівнем привілеїв. Це може бути, наприклад, ядро операційної системи, або спеціальні системні бібліотеки чи драйвери, що працюють у кільцях захисту 0, 1 або 2.

Кожен шлюз виклику має відповідний селектор, що обирає відповідний дескриптор у GDT чи LDT. Схожий механізм має у архітектурі x86 обслуговування переривань.

Використання ред.

Якщо шлюз виклику коректно встановлений ядром ОС, прикладна програма здійснює інструкцію CALL FAR з потрібним селектором сегмента як аргументом. Поле «зміщення» (offset) при цьому ігнорується. Після успішної перевірки привілеїв процесор завантажує пару CS: EIP з дескриптора сегмента, і записує до стеку нового рівня привілеїв всю інформацію, потрібну для коректного відновлення програми після виклику (регістри SS, ESP, CS і EIP перерваної задачі, у вказаному порядку. При потреби зі стеку перерваної задачі копіюються параметри, їх кількість вказується у дескрипторі шлюзу.

Після закінчення обробки виклику виконання повертається назад до перерваної задачі за допомогою інструкції RET FAR.

Формат ред.

31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
offset 31..16 P DPL 0 type
1 1 0 0
0 0 0 count
selector offset 15..0
typedef struct _CALL_GATE
{
	USHORT OffsetLow;
	USHORT Selector;
	UCHAR NumberOfArguments:5;
	UCHAR Reserved:3;
	UCHAR Type:5;
	UCHAR DPL:2;
	UCHAR Present:1;
	USHORT OffsetHigh;
}CALL_GATE;

Див. також ред.

Джерела ред.

Помилка цитування: Тег <ref> з назвою "xen_blog", визначений у <references>, не використовується в попередньому тексті.

Посилання ред.