Шлюз виклику — Вікіпедія

Шлюз виклику (англ. 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>, не використовується в попередньому тексті.

Посилання[ред. | ред. код]