Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
asm.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
694.27 Кб
Скачать

23. Система привілеїв та її застосування.

Всі нерівності тут арифметичні, тобто А  >  В означає, що рівень привілеїв А менше, ніж У:

  • при завантаженні регістра DS, ES, FS або GS повинна виконуватися умова: DPL  >=  max(RPL,CPL);

  • при завантаженні регістрів SS повинна виконуватися умова: DPL  = CPL  = RPL;

  • при дальніх JMP, CALL, RET на непідлеглий сегмент коду повинна виконуватися умова: DPL  = CPL (RPL ігнорується);

при дальніх JMP, CALL, RET на підлеглий сегмент коду повинна виконуватися умова: CPL  >=  DPL. При цьому CPL не змінюється;

при дальньому CALL на шлюз виклику повинні виконуватися умови: CPL  =<  DPL шлюзу, RPL  =<  DPL шлюзу, CPL  >=  DPL сегмента;

  • при дальньому JMP на шлюз виклику повинні виконуватися умови: CPL  =<  DPL шлюзу, RPL  =<  DPL шлюзу, CPL  >=  DPL сегмента, якщо він підлеглий, CPL  =  DPL сегмента, якщо він непідлеглий.

При виклику процедури через шлюз на непідлеглий сегмент коду з іншим рівнем привілеїв процесор виконує перемикання стека. В сегменті TSS поточної задачі завжди зберігаються значення SS:ESP для стеків рівнів привілеїв 0, 1 і 2 (стек для рівня привілеїв 3, тому що не можна виконувати передачу управління на рівень 3, окрім як за допомогою команд RET/IRET). При перемиканні стека в новий стек поміщаються, до зворотної адреси, параметрів (їхнє число указано в дескрипторі шлюзу виклику), прапорів або коду помилки (у разі INT), старі значення SS:ESP, які команда RET/IRET використовує для зворотного перемикання. Те, що треба виконати повернення з процедури, RET визначає так: RPL селектора, залишеного в стеку, більше (менш привілейований), ніж CPL.

Навіть якщо операційна система не підтримує багатозадачність, вона повинна оформити сегмент TSS з дійсними SS:ESP для стеків всіх рівнів, якщо вона збирається використовувати рівні привілеїв.

Виконання привілейованих команд

  • Команди LGDT, LLDT, LTR, LIDT, MOV  CRn, LMSW, CLTS, MOV  DRn, INVD, WBINVD, INVLPG, HLT, RDMSR, WRMSR, RDPMC, RDTSC, SYSEXIT можуть виконуватися, тільки якщо CPL  = 0 (хоча біти РСЕ і TSD регістра CR4 дозволяють використання команд RDPMC і RDTSC з будь-якого рівня).

  • Команди LLDT, SLDT, LTR, STR, LSL, LAR, VERR, VERW і ARPL можна виконувати тільки в захищеному режиме  — в реальному і V86 виникає виключення #UD.

  • Команди CLI і STI виконуються, тільки якщо CPL  =<  IOPL (IOPL  — це двухбитная область в регістрі прапорів). Якщо встановлений біт PVI в регістрі CR4, ці команди виконуються з любим CPL, але управляють прапором VIF, а не IF.

  • Команди IN, OUT, INSB, INSW, INSD, OUTSB, OUTSW, OUTSD виконуються, тільки якщо CPL  =<  IOPL і якщо біт в бітовій карті введення-висновку, відповідний даному порту, рівний нулю. (Ця карта  — бітове поле в сегменті TSS, кожний біт якого відповідає за один порт введення-висновку. Ознакою її кінця служить слово, в якому всі 16 біт встановлено в 1.)

24. Захист пам’яті.

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

Якщо процесор знаходиться в захищеному режимі, перевірки привілеїв виконуються завжди і їх не можна відключити, але можна використовувати у всіх дескрипторах і селекторах один і той же максимальний рівень привилегий  — нульовій, і створиться видимість відсутності захисту. Саме так ми і поступали у всіх прикладах до сих пор  — всі поля DPL і RPL ініціалізувалися нулями. Щоб зробити непомітною перевірку прав на рівні сторінкової адресації, треба встановити біти U і W у всіх елементах таблиць сторінок, що ми також робили в програмі pm3.asm.

За механізм захисту відповідають наступні біти і поля:

в дескрипторах сегментів:

біт S (системний сегмент)

поле типу (тип сегмента, включаючи заборони на читання/запис)

поле ліміту сегмента

поле DPL, визначальне привілеї сегмента або шлюзу, указує, принаймні, який рівень привілеїв повинна мати програма, щоб звернутися до цього сегмента або шлюзу

в селекторах сегментів:

поле RPL, визначальне запрошувані привілеї, дозволяє програмам, що виконуються на високих рівнях привілеїв, звертатися до сегментів, неначе їхній рівень привілеїв нижче

поле RPL селектора, завантаженого в CS, називається CPL і є поточним рівнем привілеїв програми

в елементах таблиць сторінок:

біт U (визначає рівень привілеїв сторінки)

біт W (разрешает/запрещает запис)

Рівні привілеїв в процесорах Intel визначені як:

0  — максимальний (для операційної системи);

1 і 2  — проміжні (для допоміжних програм);

3  — мінімальний (для призначених для користувача додатків).

Перед зверненням до пам'яті процесор виконує декілька типів перевірок, що використовують всі указані прапори і поля. Розглянемо їх по порядку.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]