Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
4семестр / Методичка лр_№5.doc
Скачиваний:
19
Добавлен:
30.04.2013
Размер:
501.76 Кб
Скачать
  1. Защита памяти

Защита памяти, основанная на сегментации, позволяет исключить:

  • использованиесегментов не по назначению (например, пытаться трактовать область данных как коды инструкций и наоборот)

(для этого проверяется поле «тип сегмента» при загрузке дескрипторов в теневую часть сегментных регистров);

  • нарушениеправ доступа (попытки модифицировать сегмент, предназначенный только для чтения и т. п.)

(для этого проверяется поле «тип сегмента» при попытке записи в сегмент);

  • адресациюк элементам, выходящим за границу сегмента

(для этого при формировании линейного адреса проверяется условие - исполнительный адрес данных с учётом их размера должен быть меньше, чем число в поле limit дескриптора. Поле limit - размера сегмента, в дескрипторе указывает номер последнего байта в сегменте)

ИА операнда [310] + ДЛИНА операнда DS.LIMIT [310]

возможно использование любого сегмента данных – ES, FS, GS

ИА команды [310] + ДЛИНА команды CS.LIMIT [310]

ИА вершины стека [310] + 4 SS.LIMIT [310];

  • изменениесодержимого таблиц дескрипторов (т.е. параметров сегментов),чтение, модификацию, исполнение кода, не имея достаточных привилегий

(для этого проверяется поле «привилегии» при межсегментном вызове: CPL RPL, CPL DPL).

  1. Защита по привилегиям

Привилегии служат для защиты областей памяти задачи от других задач. Механизм защиты памяти на уровне сегментов оперирует четырьмя уровнями привилегий доступа: от 0 до 3, причем нулевой уровень является наиболее приоритетным и обычно назначается сегментам ядра операционной системы. Приоритеты 1 и 2 назначаются различным системным службам, а приоритет 3 – пользовательским приложениям.

CPL – текущий уровень привилегий выполняемой задачи (сегмента кода), равен уровню привилегий сегмента кода (поле CS.RPL), который в этот момент выполняется.

У каждого сегмента из ОП есть собственный уровень привилегий – поле DPL дескриптора сегмента, находящегося в таблице дескрипторов.

RPL – запрашиваемый уровень привилегий (при загрузке дескрипторов или при межсегментном вызове), который находится в двух младших битах селектора запрашиваемого сегмента.

Если задача пытается получить доступ к не принадлежащему ей сегменту (селектор которого не загружен в сегментные регистры), т.е. при межсегментном вызове, формируется шлюз вызова – имеющий такую же структуру, как сегментный регистр (селектор шлюза + дескриптор шлюза). В момент запроса текущей задачей доступа к не принадлежащему ей сегменту происходит сравнение текущего уровня привилегий CPL задачи и запрашиваемого уровня привилегий RPL шлюза вызова. При CPL≤RPL доступ разрешается, иначе вырабатывается исключение #GP– общее нарушение защиты.

Аналогично при загрузке селекторов сегментов в сегментные регистры (см. рис.9) текущий уровень привилегий CPL задачи сравнивается с полем DPL дескриптора сегмента в таблице дескрипторов. При совпадении дескриптор загружается в скрытый регистр дескриптора SDC, иначе вырабатывается исключение #GP– общее нарушение защиты.

  1. Переключения задач

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

Глобальная таблица дескрипторов одна, и её адрес и размер всегда находится в регистре GDTRпроцессора. Но локальных таблиц дескрипторов может быть много (в пределе столько же, сколько задач в оперативной памяти). И для обрабатываемой задачи надо иметь информацию о еёLDTв специальном регистре процессораLDTR. Поэтому, первое, что происходит, это загрузка регистраLDTRдескриптором локальной таблицыLDT. Схема загрузки отражена нарис. 5.

Далее происходит загрузка дескрипторов сегментов задачи в теневую часть сегментных регистров – SDC. Выбор локальной (LDT) или глобальной (GDT) таблицы определяется по значению битаTIселектора (1 –LDT), а положение (номер) дескриптора в таблице задается 13-разрядным полемINDEXселектора (формат селектора приведен на рис. 2). Размеры таблиц могут находиться в пределах 8 байт - 64 Кбайт, что соответствует числу элементов в таблице от 1 до 213-1 (по 8 байт каждый). С каждой из этих таблиц связан соответствующий регистр процессора: таблицеGDTсоответствует регистрGDTR, таблицеLDT– регистрLDTR.

Рис. 5. Загрузка теневой части регистра LDTR

Рис. 6. Формирование линейного адреса в защищенном режиме

После выбора дескриптора сегмента (из GDTилиLDT) в скрытый регистр дескриптора – SDC (см.рис. 3), связанный с каждым сегментным регистром, из дескриптора копируются поля базового адреса, лимита и атрибутов. Формат строки дескриптора из таблицы дескрипторов (рис. 7) не совпадает с форматом дескриптора из SDC, поэтому при копировании полей происходит их анализ и перераспределение разрядов.

Рис. 7. Формат строки дескриптора сегмента изGDTилиLDT

Поле базового адреса сегмента в SDCсобирается из двух частей строки таблицы дескрипторов:

SDC.BA[310] = GDT[INDEX[130], [6356]] | GDT[INDEX[130], [3916]]

Поле размера сегмента в SDCтакже собирается из двух частей строки таблицы дескрипторов, но оно составляет 32 разряда вSDCв отличие от 20 разрядов в строке таблицы дескрипторов. Поэтому ещё анализируется 55ыйбит гранулярности (G-granularity):

- если бит гранулярности сброшен (0), то размер сегмента указывается в байтах, и к прочитанному 20-битному значению дописываются 12 незначащих нулей слева, чтобы получить 32-разрядное поле в SDC:

SDC.LIMIT[310] =

Соседние файлы в папке 4семестр