Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Средства защиты памяти






В процессорах Intel реализованы различные механизмы защиты, но с их основе лежат два основных принципа: разделение адресных пространств процессов и защита по привилегиям.

Разделение адресных пространств процессов реализовано через использование табличных преобразований при переходе от логического адреса, используемого процессом для адресации в своем адресном пространстве (каждому процессу может быть выделено виртуальное адресное пространство размером в 4 Гб (возможность 32-разрядной адресации), реально оно может быть ограничено размером вспомогательной памяти на дисках, используемой для временного хранения кода и данных, вытолкнутых из основной памяти).

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

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

Группа взаимосвязанных задач (потоков), образующих единое задание (процесс), может использовать одну и ту же таблицу LDT. В этом случае все задачи (потоки процесса) будут разделять одно адресное пространство, изолированное от остальной части системы.

При переключении задач старое содержимое регистра LDTR сохраняется в сегменте состояния задачи TSS, а в регистр загружается селектор LDT входящей задачи. Эти действия реализуются аппаратно при выполнении любой команды, вызывающей переключение задач, поэтому “чужие” локальные таблицы задачам просто не видны. Если задача не использует локальную таблицу, то в LDTR загружается пустой селектор, указывающий на первый пустой дескриптор глобальной таблицы (значения 0000h – 0003h), это сообщает процессору, что локальная таблица использоваться не будет.

Защита по уровням привилегий реализуется различными средствами:

– использование привилегированных команд и команд, чувствительных к уровням привилегий;

– защита доступа к данным;

– защита сегментов кода при передаче управления.

Уровни привилегий образуют четыре кольца защиты (рис. 5.8).

В разных ОС могут использоваться различные подходы к использованию возможностей защиты по уровням привилегий: в ОС UNIX реализована традиционная система супервизор/пользователь с двумя кольцами защиты (супервизор (т.е. сама ОС) выполняется на нулевом уровне привилегий, а пользователям назначается кольцо 3), OS/2 поддерживает три уровня привилегий (код ОС работает на нулевом уровне, специальные процедуры для обращения к устройствам ввода/вывода – на уровне 2, а прикладные программы – 3).

Прикладные программы Минимальные
Системы программирования привилегии
Утилиты, драйверы ОС  
Ядро ОС Максимальные привилегии

 

 

Рис. 5.8. Кольца защиты

К привилегированным относятся те команды, которые влияют на работоспособность системы в целом. К ним относятся команды останова процессора, загрузки регистров, базирующих таблицы дескрипторов, а также команды, влияющие на сам механизм защиты (например, изменение флага IOPL, определяющего уровень привилегий ввода/вывода). Эти команды могут выполняться только на нулевом уровне привилегий (PL0-программы). При попытке выполнить их на другом уровне привилегий генерируется нарушение общей защиты и ОС обычно прекращает выполнение программы.

Кроме того, есть команды, для выполнения которых программа не обязательно должна иметь нулевой уровень привилегий, но ограничения существуют и они связаны со значением флага IOPL в регистре флагов (например, модификация состояния флажка прерываний, ввод данных из порта, вывод данных в порт). Эти команды являются чувствительными к уровню привилегий и могут выполняться, если текущий уровень привилегий CPL £ IOPL.

При работе в мультизадачной среде программы обычно разделяют данные. Программам не разрешается считывание или запись элементов данных, которые имеют более высокий уровень привилегий (т.е. обращение за данными внутрь колец защиты запрещено). Общее правило защиты данных выглядит следующим образом:

DPL ³ max (CPL, RPL) = EPL,

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

Процессор Intel запрещает прямую передачу управления сегменту кода, находящемуся на другом уровне привилегий, это ограничение обеспечивает защиту от произвольного изменения уровня привилегий CPL. Но передача управления между уровнями привилегий возможна двумя способами: через использование подчиненных сегментов кода и через использование специальных дескрипторов, называемых шлюзами вызова. При этом обращаться можно только к более привилегированному сегменту кода.

Подчиненные (или подчиняемые, согласованные) сегменты кода используются для реализации процедур, которые часто выполняются всеми программами, при этом их выполнение не требует особых привилегий, но для обращения к нем с любого уровня привилегий необходимо было бы их размещение на нулевом кольце защиты, для обращения же к передаваемым им параметрам они должны иметь тот же уровень привилегий, что и вызывающая их программа. Поэтому в Intel реализован специальный тип сегментов кода, с которыми не ассоциируется конкретный уровень привилегий, так как они подчиняются уровню привилегий того кода, который передает им управление, то есть при вызове такой процедуры не происходит изменение уровня привилегий. Этот механизм позволяет различным программам, выполняющимся на разных уровнях привилегий, разделять код.

Для реализации фактического изменения уровня привилегий (например, при обращении прикладной программы с запросом на выполнение операции ввода/вывода, требующей больших привилегий, чем имеет прикладная программа) используются особые системные объекты, называемые шлюзами вызова. Правило разрешения вызова через шлюз имеет вид:

DPL целевого сегмента кода £ max (RPL, CPL) £ DPL шлюза

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

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

Процесс переключения стека “невидим” для программ. Значения селектора и указателя вершины стека нового, более высокого уровня привилегий выбираются процессором из сегмента TSS задачи, где для них отведены специальные поля (для уровней привилегий 0, 1 и 2).

При переключении стека выполняются дополнительные проверки (контроль правильности указателя стека и соответствие его уровня привилегий, проверка размера стека для размещения в нем старого указателя стека, копируемых параметров, адреса возврата и локальных переменных, которые может поместить в стек процедура). Число передаваемых через стек параметров (количество занимаемых ими двойных слов) задается в специальном поле счетчика в дескрипторе шлюза.

Если нарушений не выявлено, то в новый стек помещаются старые селектор и указатель вершины стека, автоматически копируются из старого стека передаваемые параметры (если счетчик не нулевой) и записывается адрес точки возврата. После этого вызванная через шлюз процедура может начать выполнение.

При возврате из процедуры происходит восстановление стека.

Каждое обращение к памяти контролируется на удовлетворение правил защиты. На уровне страниц тоже выполняются проверки правильности обращения к памяти.

Имеются две разновидности контроля на уровне страниц: ограничение адресуемой области и контроль типа. Доступом к страницам управляют биты PCD, PWT, U/S и R/W элементов таблиц страниц. Причем защита применима как к таблицам страниц первого уровня, так и второго.

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

При контроле типа механизм защиты распознает два типа страниц: с доступом только по считыванию и с доступом по считыванию/записи.

При работе процессора на уровне супервизора при сброшенном бите WP защиты от записи в регистре управления CR0 допускается считывание и запись во все страницы. В старших моделях (с 80486) установка бита защиты от записи позволяет сделать режим супервизора чувствительным к защищенным от записи страницам пользователя. Это дает дополнительные возможности ОС обеспечить разделение данных в памяти.

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

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

Дополнительный механизм реализуется с помощью двоичной карты разрешения ввода-вывода. Эти карты обеспечивают задачам свободный доступ к незащищенным портам ввода/вывода без требования понижения значения в поле IOPL.

В двоичной карте ввода/вывода каждый бит соответствует одному адресу ввода/вывода (байтному порту ввода/вывода). Если соответствующие этим адресам портов биты содержат 0, то операции ввода/вывода разрешаются, а если 1 – запрещаются, а при попытке обращения к такому порту программы, не имеющей достаточных привилегий, генерируется особый случай нарушения общей защиты.

Так как адресное пространство ввода/вывода процессоров Intel составляет 64 Кб, то полная карта может занимать 8 Кб, обычно она усекается по байтной границе, а отсеченные биты считаются равными 1.

Двоичная карта размещается в памяти произвольно, но обязательно вблизи сегмента TSS той задачи, которая этой картой пользуется. Ссылка на карту (смещение) записывается в специальное поле сегмента TSS.

Допускается разделение одной карты несколькими задачами.

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






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.