- •Тема 7. Архітектурні особливості мікропроцесорів Intel 80x86.
- •1. Реальний і захищений режими роботи процесора.
- •Мал. 3.1 Схема визначення фізичної адреси для процесора 8086.
- •2. Нові системні регістри мікропроцесорів і80x86.
- •Мал. 7.2 Основні системні регістри мікропроцесорів і80x86.
- •3. Підтримка сегментного способу організації віртуальної пам'яті.
- •Мал. 7.3 Дескриптор сегменту.
- •Мал. 7.4. Селектор сегменту.
- •Мал. 7.5 Сегмент стану задачі (tss).
- •Мал. 7.6 Процес отримання лінійної адреси команди.
- •4. Підтримка сторінкового способу організації віртуальної пам'яті.
- •Мал. 7.7 Дескриптор сторінки.
- •Мал. 7.8 Трансляція лінійної адреси в мікропроцесорах і80x86.
- •5. Режим віртуальних машин для виконання додатків реального режиму.
- •6. Захист адресного простору задач.
- •Рівні привілеїв для захисту адресного простору задач.
- •Якщо цільовий сегмент є сегментом стека, то правило перевірки має вид
- •7. Механізм шлюзів для передачі керування на сегменти коду з іншими рівнями привілеїв.
- •Мал. 7.9 Механізм шлюзів для переходу на другий рівень привілеїв.
- •Мал. 7.10 Перехід на сегмент більш привілейованого коду.
- •Мал. 7.11 Формат дескриптора шлюзу.
Мал. 7.10 Перехід на сегмент більш привілейованого коду.
Мал. 7.11 Формат дескриптора шлюзу.
Уведено наступні правила використання шлюзів:
-
значення DPL шлюзу виклику повинне бути більше чи дорівнювати значенню поточного рівня привілеїв CPL;
-
значення DPL шлюзу виклику повинне бути більше чи дорівнювати значенню поля RPL селектора шлюзу;
-
значення DPL шлюзу виклику повинне бути більше чи дорівнювати значенню DPL цільового сегмента коду;
-
значення DPL цільового сегмента коду повинне бути менше чи дорівнювати значенню поточного рівня привілеїв CPL.
Вимога наявності і доступності шлюзу виклику для переходу на більш привілейований код обмежує менш привілейований код заданим набором точок входу в код з більшим привілеєм. Тому що шлюзи виклику є елементами в дескрипторних таблицях (а ми говорили, що їх не тільки можна, але і бажано там розташовувати), то менш привілейована програма не може створити додаткових (а виходить, і неконтрольованих) шлюзів. Таким чином, розглянутий механізм шлюзів дає наступні переваги в організації середовища для виконання надійних обчислень:
-
привілейований код надійно захищений і визиваючі його програми не можуть його зруйнувати. Природньо, що такий системний код повинний бути особливо ретельно налагодженим, не містити помилок, бути максимально ефективним;
-
шлюзи міжсегментних переходів для виклику системних функцій роблять ці самі системні функції невидимими для програмних модулів, розташованих на зовнішніх (більш низьких) рівнях привілеїв;
-
оскільки викликаюча програма безпосередньо адресує тільки шлюз виклику, реалізовані викликаючим модулем (сегментним кодом) функції можна змінити чи перемістити в адресному просторі, не торкаючись інтерфейсу зі шлюзом;
-
програмні модулі викликаються з більш привілейованого рівня.
Викладений коротко апаратний механізм захисту по привілеях виявляється досить складним і жостким.
Основний ризик зв'язаний з передачею керування через шлюз виклику більш привілейованій процедурі. Не можна надавати викликаючій програмі ніяких переваг, що випливають через тимчасове підвищення привілеїв. Це зауваження особливо важливе для процедур нульового рівня привілеїв (PL0-процедур).
Викликаюча програма може порушити роботу процедури, передаючи їй «погані» параметри. Тому доцільно якомога раніше проконтролювати передані процедурі параметри. Шлюз виклику сам по собі не перевіряє значень параметрів, що копіюються в новий стек, тому вірогідність кожного переданого параметра повинна контролювати викликана процедура. От деякі способи контролю переданих параметрів.
-
Варто перевіряти лічильники циклів і повторень на мінімальні і максимальні значення.
-
Необхідно перевірити 8- і 16-бітні параметри, передаваємі в 32-бітних регістрах. Коли процедурі передається короткий параметр, його варто розширити з знаком чи нулем для заповнення всього 32-бітного регістра.
-
Потрібно прагнути звести до мінімуму час роботи процесора з забороненими перериваннями. Якщо процедурі потрібно заборонити переривання, необхідно, щоб викликаюча програма не могла впливати на час перебування процесора з забороненими перериваннями (флаг IF=0).
-
Процедура ніколи не повинна сприймати як параметр чи код покажчик коду.
-
В операціях процесора варто явно задавати стан флагця напрямку DF для ланцюгових команд.
-
Заключна команда RET чи RETn у процедурі повинна точно відповідати полю лічильника WC шлюзу виклику; при цьому n= 4x(WC), тому що лічильник задає число подвійних слів, а n відповідає байтам.
-
Не слід застосовувати шлюзи викликів для функцій, яким передається змінне число параметрів. При необхідності потрібно скористатися лічильником і покажчиком параметрів.
-
Функції не можуть повертати значення в стеці, тому що після повернення стеки процедури і викликаючої програми знаходяться точно в такому стані, у якому вони були до виклику.
-
У процедурі варто зберігати і відновлювати всі сегментні регістри. Інакше, якщо який-небудь сегментний регістр залучався для адресації даних, недоступних викликаючій програмі, процесор автоматично завантажить у нього порожній селектор.
Рекомендується контролювати всі звертання до пам'яті. Неважко уявити собі, що PL3-програма передасть PL0-процедурі покажчик селектор:зсув і запросить зчитування чи запис декількох байтів по цій адресі. Типовим прикладом може служити процедура дискового введення/виведення, що сприймає як параметр системний номер файлу, лічильник байт і адреса, по якому записуються дані з диска. Хоча PL0-процедура має привілеї для здійснення такої операції, але в PL3-програми дозволу на це може не бути.