перемикання стека

При виклику процедури більш привілейованого рівня виконується наступне:

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

Процесор знаходить місце для створення нових стеків за допомогою сегмента стану завдання (TSS), як показано на рисунку 6-8. Кожне завдання має власний TSS. TSS містить вихідні покажчики стека для внутрішніх кілець захисту. Операційна система відповідає за створення кожного TSS і ініціалізацію відповідних їм покажчиків стека. Вихідний покажчик стека складається з селектора сегмента і вихідного значення регістра ESP (вихідне зміщення в сегменті). Вихідні покажчики стеків є значення, призначені виключно для читання. Процесор не змінює їх під час виконання завдань. Ці покажчики стеків використовуються тільки для створення нових стеків при виконанні викликів процедур з більш високим рівнем привілейованості. При поверненні з викликаних процедур ці стеки зникають. При наступному виклику процедури відбувається створення нового стека з використанням для цього вихідного покажчика стека.

Якщо потрібно передати в спричинюється процедуру більш 31 подвійного слова даних, то один з параметрів можна зробити покажчиком на структуру даних, або збережені в ньому значення регістрів SS і ESP можуть використовуватися для доступу до параметрів у старій області стека. Під час виклику процедури з іншим рівнем привілейованості процесор виконує наступні пов'язані зі стеком дії:

На рисунку 6-9 показані кадри стека до, під час і після успішного виклику і повернення між процедурами з різними рівнями привілейованості.

TSS не має покажчика стека для стека з рівнем привілейованості 3, оскільки процедура з рівнем привілейованості 3 не може бути викликана процедурою з ще більш низьким рівнем. Стек для рівня привілейованості 3 охороняється вмістом регістрів SS і EIP, які зберігаються в стеці привілейованого рівня, викликаного з рівня 3.

Виклик, який використовує шлюз виклику, не перевіряє значень слів, що копіюються в новий стек. Викликана процедура повинна перевіряти допустимість кожного параметра. У наступних розділах обговорюється використання команд ARPL, VERR, VERW, LSL і LAR для перевірки значень покажчиків.

Схожі статті