Интернет магазин китайских планшетных компьютеров



Компьютеры - Сегментная защита памяти - Взаимодействие уровней привилегий

23 января 2011


Оглавление:
1. Сегментная защита памяти
2. Взаимодействие уровней привилегий



Взаимодействие четырёх уровней между собой осуществляется посредством шлюзов. Дескриптор шлюза так же, как и дескриптор сегмента имеет поле PL. Обращение к шлюзу подчинено вышеописанным правилам, но существуют дополнительные правила, накладывающие естественные ограничения на сегмент кода/TSS, указанный в шлюзе:

  • DPL вызываемого сегмента не должен быть численно больше CPL;
  • DPL шлюза не должен быть численно меньше DPL указанного в нём сегмента;
  • В шлюзе должен быть указан только сегмент кода или TSS;

Если посредством шлюза происходит обращение к неподчинённому сегменту с таким же уровнем привилегий, или к подчинённому сегменту кода с таким же или численно меньшим уровнем привилегий, то происходит простой переход:

Push Flags ; Только для шлюзов прерывания и ловушки
Push CS
Push IP
Jmp FAR Gate_Address

Переключение стека

Если же происходит переход к неподчинённому сегменту кода с численно меньшим уровнем привилегий, то происходит переключение стека во избежание его переполнения на верхних уровнях. Напр. если происходит ошибка стека на нулевом уровне, то процессор останавливается.

Сегмент TSS содержит три дальних адреса стека — для уровней привилегий 0 – 2.

При переходе с больших на меньшие уровни через шлюзы происходит смена привилегий, и, соответственно, переключение стеков.

Алгоритм переключения выглядит несколько сложнее:

  • Из соответствующих полей TSS загружаются новые значения SS,SP;
  • В новый стек сохраняются предыдущие значения SS,SP;
  • Если шлюз является шлюзом вызова, то в новый стек копируются WC слов/двойных слов из стека вызывающей программы;
  • Если это шлюз прерывания или ловушки, то сохраняется значениеFlags;
  • Сохраняется текущее значение CS,IP;
  • Из дескриптора шлюза в регистры CS:IP загружается новый дальний адрес, указанный в соответствующих полях дескриптора;

При выполнении команды RetF/IRet:

  • Процессор извлекает из стека дальний адрес возврата;
  • Если у команды RetF есть параметр, то увеличивает значениеSP на его значение;
  • Анализирует RPL селектора CS: если он численно больше CPL, то извлекает из стека дальний адрес прежней вершины стека и загружает его в SS:SP. Таким образом происходит возврат к старому стеку;


Просмотров: 2041


<<< Сегментная адресация памяти
Страничная память >>>