
- •ОБразования российской федерации
- •Цель работы
- •Теоретическая часть
- •Сегменты задачи
- •Аппаратные средства защищённого режима
- •Защита памяти
- •Защита по привилегиям
- •Переключения задач
- •000000000000 | Gdt[index[130], [5148]] |gdt[index[130], [150]]
- •Порядок выполнения работы
- •Вопросы для самопроверки (защиты л/р)
- •Список литературы
Защита памяти
Защита памяти, основанная на сегментации, позволяет исключить:
использованиесегментов не по назначению (например, пытаться трактовать область данных как коды инструкций и наоборот)
(для этого проверяется поле «тип сегмента» при загрузке дескрипторов в теневую часть сегментных регистров);
нарушениеправ доступа (попытки модифицировать сегмент, предназначенный только для чтения и т. п.)
(для этого проверяется поле «тип сегмента» при попытке записи в сегмент);
адресациюк элементам, выходящим за границу сегмента
(для этого при формировании линейного адреса проверяется условие - исполнительный адрес данных с учётом их размера должен быть меньше, чем число в поле limit дескриптора. Поле limit - размера сегмента, в дескрипторе указывает номер последнего байта в сегменте)
ИА операнда [310] + ДЛИНА операнда DS.LIMIT [310]
возможно использование любого сегмента данных – ES, FS, GS
ИА команды [310] + ДЛИНА команды CS.LIMIT [310]
ИА вершины стека [310] + 4 SS.LIMIT [310];
изменениесодержимого таблиц дескрипторов (т.е. параметров сегментов),чтение, модификацию, исполнение кода, не имея достаточных привилегий
(для этого проверяется поле «привилегии» при межсегментном вызове: CPL RPL, CPL DPL).
Защита по привилегиям
Привилегии служат для защиты областей памяти задачи от других задач. Механизм защиты памяти на уровне сегментов оперирует четырьмя уровнями привилегий доступа: от 0 до 3, причем нулевой уровень является наиболее приоритетным и обычно назначается сегментам ядра операционной системы. Приоритеты 1 и 2 назначаются различным системным службам, а приоритет 3 – пользовательским приложениям.
CPL – текущий уровень привилегий выполняемой задачи (сегмента кода), равен уровню привилегий сегмента кода (поле CS.RPL), который в этот момент выполняется.
У каждого сегмента из ОП есть собственный уровень привилегий – поле DPL дескриптора сегмента, находящегося в таблице дескрипторов.
RPL – запрашиваемый уровень привилегий (при загрузке дескрипторов или при межсегментном вызове), который находится в двух младших битах селектора запрашиваемого сегмента.
Если задача пытается получить доступ к не принадлежащему ей сегменту (селектор которого не загружен в сегментные регистры), т.е. при межсегментном вызове, формируется шлюз вызова – имеющий такую же структуру, как сегментный регистр (селектор шлюза + дескриптор шлюза). В момент запроса текущей задачей доступа к не принадлежащему ей сегменту происходит сравнение текущего уровня привилегий CPL задачи и запрашиваемого уровня привилегий RPL шлюза вызова. При CPL≤RPL доступ разрешается, иначе вырабатывается исключение #GP– общее нарушение защиты.
Аналогично при загрузке селекторов сегментов в сегментные регистры (см. рис.9) текущий уровень привилегий CPL задачи сравнивается с полем DPL дескриптора сегмента в таблице дескрипторов. При совпадении дескриптор загружается в скрытый регистр дескриптора SDC, иначе вырабатывается исключение #GP– общее нарушение защиты.
Переключения задач
Когда новая задача поступает в процессор для обработки, дескрипторы её сегментов должны находиться в сегментных регистрах, куда они должны быть загружены из соответствующей таблицы дескрипторов, локальной или глобальной.
Глобальная таблица дескрипторов одна, и её адрес и размер всегда находится в регистре 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[310] = GDT[INDEX[130], [6356]] | GDT[INDEX[130], [3916]]
Поле размера сегмента в SDCтакже собирается из двух частей строки таблицы дескрипторов, но оно составляет 32 разряда вSDCв отличие от 20 разрядов в строке таблицы дескрипторов. Поэтому ещё анализируется 55ыйбит гранулярности (G-granularity):
- если бит гранулярности сброшен (0), то размер сегмента указывается в байтах, и к прочитанному 20-битному значению дописываются 12 незначащих нулей слева, чтобы получить 32-разрядное поле в SDC:
SDC.LIMIT[310] =