Мал. 7.11 Формат дескриптора шлюзу.


Уведенонаступні правила використання шлюзів:

· значення DPL шлюзу виклику повинне бути більше чи дорівнювати значенню поточного рівня привілеїв CPL;

· значення DPL шлюзу виклику повинне бути більше чи дорівнювати значенню поля RPLселектора шлюзу;

· значення DPL шлюзу виклику повинне бути більше чи дорівнювати значенню DPL цільового сегмента коду;

· значення DPL цільового сегмента коду повинне бути менше чи дорівнювати значенню поточного рівня привілеїв CPL.

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

· привілейований код надійно захищений і визиваючі його програми не можуть його зруйнувати. Природньо, що такий системний код повинний бути особливо ретельно налагодженим, не містити помилок, бути максимально ефективним;

· шлюзи міжсегментних переходів для виклику системних функцій роблять ці самі системні функції невидимими для програмних модулів, розташованих на зовнішніх (більш низьких) рівнях привілеїв;

· оскільки викликаюча програма безпосередньо адресує тільки шлюз виклику, реалізовані викликаючим модулем (сегментним кодом) функції можна змінити чи перемістити в адресному просторі, не торкаючись інтерфейсу зі шлюзом;

· програмні модулі викликаються з більш привілейованого рівня.

Викладений коротко апаратний механізм захисту по привілеях виявляється досить складним і жостким.

Основний ризик зв'язаний з передачею керування через шлюз виклику більш привілейованій процедурі. Не можна надавати викликаючій програмі ніяких переваг, що випливають через тимчасове підвищення привілеїв. Це зауваження особливо важливе для процедур нульового рівня привілеїв (PL0-процедур).

Викликаюча програма може порушити роботу процедури, передаючи їй «погані» параметри. Тому доцільно якомога раніше проконтролювати передані процедурі параметри. Шлюз виклику сам по собі не перевіряє значень параметрів, що копіюються в новий стек, тому вірогідність кожного переданого параметра повинна контролювати викликана процедура. От деякі способи контролю переданих параметрів.

1. Варто перевіряти лічильники циклів і повторень на мінімальні і максимальні значення.

2. Необхідно перевірити 8- і 16-бітні параметри, передаваємі в 32-бітних регістрах. Коли процедурі передається короткий параметр, його варто розширити з знаком чи нулем для заповнення всього 32-бітного регістра.

3. Потрібно прагнути звести до мінімуму час роботи процесора з забороненими перериваннями. Якщо процедурі потрібно заборонити переривання, необхідно, щоб викликаюча програма не могла впливати на час перебування процесора з забороненими перериваннями (флаг IF=0).

4. Процедура ніколи не повинна сприймати як параметр чи код покажчик коду.

5. В операціях процесора варто явно задавати стан флагця напрямку DF для ланцюгових команд.

6. Заключна команда RET чи RETn у процедурі повинна точно відповідати полю лічильника WC шлюзу виклику; при цьому n= 4x(WC), тому що лічильник задає число подвійних слів, а n відповідає байтам.

7. Не слід застосовувати шлюзи викликів для функцій, яким передається змінне число параметрів. При необхідності потрібно скористатися лічильником і покажчиком параметрів.

8. Функції не можуть повертати значення в стеці, тому що після повернення стеки процедури і викликаючої програми знаходяться точно в такому стані, у якому вони були до виклику.

9. У процедурі варто зберігати і відновлювати всі сегментні регістри. Інакше, якщо який-небудь сегментний регістр залучався для адресації даних, недоступних викликаючій програмі, процесор автоматично завантажить у нього порожній селектор.

Рекомендується контролювати всі звертання до пам'яті. Неважко уявити собі, що PL3-програма передасть PL0-процедурі покажчик селектор:зсув і запросить зчитування чи запис декількох байтів по цій адресі. Типовим прикладом може служити процедура дискового введення/виведення, що сприймає як параметр системний номер файлу, лічильник байт і адреса, по якому записуються дані з диска. Хоча PL0-процедура має привілеї для здійснення такої операції, але в PL3-програми дозволу на це може не бути.



Дата добавления: 2016-07-27; просмотров: 1735;


Поиск по сайту:

Воспользовавшись поиском можно найти нужную информацию на сайте.

Поделитесь с друзьями:

Считаете данную информацию полезной, тогда расскажите друзьям в соц. сетях.
Poznayka.org - Познайка.Орг - 2016-2024 год. Материал предоставляется для ознакомительных и учебных целей.
Генерация страницы за: 0.008 сек.