Автор работы: Пользователь скрыл имя, 23 Октября 2011 в 17:51, лекция
Высокопроизводительный 32-х разрядный микропроцессор 80i86 ориентирован на эффективное выполнение программ в среде многозадачных ОС (типа Windows). Микропроцессор имеет 32-разрядные регистры и 32-х разрядные раздельные шины адреса и данных.
Наименее защищенными являются прикладные программы пользователя, которым присваивается уровень с номером 3. Остальные уровни отводятся для системных программ, которые разделяются на 3 уровня в зависимости от требований к их защищенности. Наиболее защищенная часть - это ядро ОС, которой присвоен уровень 0. В ядро входит часть ОС, обеспечивающая инициализацию работы, а также управление доступом к памяти и другие функции, нарушение которых может полностью вывести ОС из строя. Основная часть программ ОС имеет уровень 1. К этому уровню, в частности, относятся драйверы устройств и утилиты.
На
втором и третьем уровнях
Проверка защиты по уровням привилегий осуществляется при выполнении почти каждой машинной команды во время работы микропроцессора в защищенном режиме (Р – режиме).
Операционная
система необязательно должна поддерживать
все четыре уровня привилегий. Например,
система UNIX имеет всего 2 уровня: операционной
системе присвоен номер 0, а программам
пользователей – уровень 3. Система OS/2
поддерживает три уровня: программы ОС
работают на 0 уровне, специальные процедуры
для обращения к устройствам ввода/вывода
действуют на уровне 2, а прикладные программы
пользователей выполняются на уровне
3.
Основными объектами механизма защиты по привилегиям являются сегменты программ и данных, а также шлюзы. Именно им назначаются уровни привилегий. Уровень привилегий относительно содержимого сегмента следует считать глобальным, т.е. не может быть, чтобы какая-то часть сегмента данных была более привилегированной, чем другие части. Но ОС имеет возможность определять один сегмент несколькими дескрипторами с разными уровнями привилегий и даже с разными размерами самого сегмента.
Уровень привилегий сегмента или шлюза определяет поле DPL , которое находится в байте прав доступа AR соответствующего дескриптора. Таким образом, каждый сегмент или шлюз имеет свой персональный уровень привилегий DPL.
Кроме уровня привилегий сегмента DPL существует понятие текущего уровня привилегий CPL (от англ. Current Privilege Level или Code Privilege Level). Текущий уровень привилегий CPL определяется полем DPL дескриптора текущего программного сегмента. После загрузки программного сегмента в ОЗУ и передачи на него управления значение DPL копируется в поле CPL регистра программного сегмента CS. После этого уровень привилегий программного сегмента DPL становится текущим уровнем привилегий CPL. Таким образом, текущий уровень привилегий является уровнем привилегий исполняемого программного сегмента.
Кроме уровней привилегий DPL и CPL , механизм защиты использует понятие уровня привилегий запроса RPL (Requested Privilege Level). Этот уровень привилегий задается двумя младшими разрядами селектора.
Формат селектора:
Уровень
привилегий запроса RPL селекторов сегментов
данных сохраняется в соответствующих
сегментных регистрах SS, DS, ES, FS, GS. Понятие
уровня привилегий запроса RPL служит для
защиты программ и данных операционной
системы от ошибок программ, изменивших
уровень привилегий при межуровневых
передачах управления.
К привилегированным командам относятся те, на выполнение которых влияет уровень привилегий программы или привилегии устройств ввода/вывода. Микропроцессор имеет три группы привилегированных команд, степени привилегий которых различны. Это: PLO – команды; IOPL – чувствительные команды; команды, модифицируемые в соответствии с текущим уровнем привилегий.
PLO – команды – это команды, выполнение которых разрешено только на уровне привилегий 0. При попытке выполнить их на другом уровне привилегий генерирует сигнал нарушения общей защиты и вызывает прерывание программы, в которой эта команда встретилась (прерывание 13). В эту группу команд входят команды останова процессора и команды загрузки системных объектов, в которых источником или получателем данных выступают системные регистры управления CRn, отладки DRn и проверки TPn.
IOPL – чувствительные команды (Input – Output PL команды). Это команды, которые изменяют состояние флажка прерываний IF, выполняют захват шины или операцию ввода/вывода. В микропроцессоре есть специальный регистр флагов EFLAGS, в котором есть двухразрядное поле IOPL , определяющее уровень привилегий операций ввода/вывода. Для выполнения этих команд программа необязательно должна иметь уровень привилегий CPL равный нулю. Достаточно, чтобы уровень привилегий программы CPL был выше уровня, определяемого полем IOPL в регистре EFLAGES, т.е. необходимо выполнение условия CPL< IOPL. При попытке выполнения этих команд при CPL> IOPL генерируется нарушение общей защиты и происходит прерывание текущей программы (прерывание 13).
Команды, модифицируемые в соответствии с текущим уровнем привилегий. Это всего две команды:
POPFD – загрузка 4-хбайтного регистра флагов EFLAGS из стека;
POPF – загрузка 2-х байтного регистра флагов EFLAGS из стека.
Команды
POPFD и POPF сами по себе не являются привилегированными
и любая программа их может содержать.
Эти команды могут изменять любые биты
в регистрах флагов, кроме битов IOPL и флага
IF. Двухразрядное поле IOPL в регистрах флагов
может быть изменено (модифицировано),
если эти команды встретятся в программах
ОС нулевого уровня. Флаг IF модифицируется
только при выполнении условия CPL< IOPL.
При нарушении указанных условий прерывание
не производится, т.к. процессор просто
не модифицирует биты IOPL и флаг IF, если
это не разрешено.
Все прикладные программы в многопрограммном режиме выполняются на одном третьем уровне привилегий. Механизм виртуальной памяти обеспечивает их защиту от взаимных помех. Всем программам разрешено обращаться к любым данным на своем уровне привилегий. Логика сервисных функций современных ОС предусматривает работу с данными программ менее защищенных режимов. Поэтому программам разрешено обращаться к данным и на менее привилегированных уровнях. Однако программам не разрешается чтение/запись элементов данных, которые имеют более высокий уровень привилегий, т.е. движение к данным внутрь колец защиты запрещается. Любая такая попытка приводит к фиксации нарушения общей защиты. Это общее правило доступа к данным можно записать в виде следующего условия: CPL<DPL (1), т.е. PL текущей программы должен быть меньше или равен PL данных. Условие допустимых схем обращения графически можно представить в следующем виде:
∆ - сегмент программы (CPL)
□ – сегменты данных (DPL)
Здесь стрелками без перекрещивания указаны разрешенные схемы доступа. В приведенном примере запрещено обращение к сегменту данных находящему на 1 уровне привилегии, а остальные обращения разрешены. Однако, программы менее защищенных уровней, используя сервисные программы более защищенных уровней, могут выполнять разные процедуры на уровне этих сервисных программ, в том числе процедуры изменения данных. Поэтому возникает опасность несанкционированного нарушения данных на более защищенном уровне привилегий PL. Для блокирования этой опасности механизм защиты использует более сложную схему проверки условий доступа. В условие проверки вводится параметр – эффективный уровень привилегий (Effective Privilege Level – EPL) как функция уровня привилегий запросчика RPL:
EPL=max(CPL,RPL)
Параметр EPL используется в условии проверки разрешения доступа к сегментам данных вместо параметра CPL. С учетом RPL условие проверки доступа к данным имеет следующий вид:
EPL<DPL или max(CPL,RPL)<DPL или (CPL<DPL)&(RPL<DPL)
Из
приведенных выражений для
4.3
Защита программ.
Стратегии защиты программ и защиты данных имеют много общего , но имеются и различия. При этом защита, как программ, так и данных на одном уровне привилегий производится на основе разделения адресных пространств механизмом виртуальной памяти при помощи локальных таблиц дескрипторов, каталогов и страниц. При обращении к программам также производятся проверки на выход за пределы сегмента и таблиц, проверки соответствия типа сегмента и проверки прав использования содержимого сегмента или страницы. Различия в защите программ и данных проявляются при межсегментных передачах управления.
Рассмотрим работу механизма защиты программ на примере межсегментных передач управления без изменения уровня привилегий. Существуют две разновидности таких передач управления. Это – переходы на программы сегмента того же уровня привилегий и переходы на программы подчиненных сегментов.
Среди сервисных программ операционной системы имеется ряд программ, которые используют другие программы на каждом уровне привилегий. Обычно такие программы просты по конструкции, требуют обращения только к своему параметру и возвращают результат вызывающей программе. Для упрощения обращения к таким программам можно было бы разместить их на уровне пользовательских программ. Но их используют на всех уровнях. Следовательно, такие программы нужны либо дублировать для каждого уровня привилегий, либо использовать более сложные межсегментные переходы с увеличением уровня привилегий. Для таких ситуаций в процессоре Intel предусмотрено альтернативное чтение – использование подчиненных программных сегментов.
Программный сегмент определяется, как подчиненный установкой бита C – conforming в байте прав доступа AR дескриптора программного сегмента. Обычные правила защиты по значениям CPL и DPL не действуют, если бит подчиненности С установлен в единицу (С=1). В этом случае используются другие правила.
С подчиненными программными сегментами, у которых С=1, не ассоциируется конкретный уровень привилегий, так как эти программы подчиняются уровню привилегий той программы, которая передает им управление. Например, если программа, у которой PL=3, передает управление подчиненному программному сегменту, то такая подчиненная программа будет работать с CPL=3, если же этот сегмент вызывает программа с PL=0, то подчиненная программа из этого сегмента будет выполняться, имея CPL=0. Когда управление передается подчиненному программному сегменту, то биты поля CPL регистра кодов CS не принимает значение поля DPL дескриптора нового программного сегмента, а сохраняют значение DPL последнего выполнявшегося неподчиненного программного сегмента. Таким образом, переход на подчиненные программные сегменты являются переходом без изменения текущего уровня привилегий PL.
Но даже для подчиненных программных сегментов имеются ограничения по их использованию. Передавать управление подчиненному сегменту может только та программа, уровень привилегий которой CPL не выше уровня привилегий DPL подчиненного программного сегмента, т.е. проверяется условие CPL>DPL. Чтобы программа подчиненного сегмента была доступна на всех уровнях привилегий, она должна иметь наивысший уровень привилегий, т.е. DPL=0. Такое условие соответствует общему правилу использования сервисных программ: любая программа может быть сервисом только для программ более низкого уровня иерархии.
При переходе на программы сегментов того же уровня привилегий механизм защиты контролирует соблюдение равенства уровней привилегий, вызывающей CPL и вызываемой DPL программ, а также, чтобы значение поля RPL в селекторе было меньше или равно значению CPL, т.е. в этом случае должно выполняться условие (CPL<DPL)&(RPL<DPL).
Рассмотренная модель взаимодействия программ проста по реализации, но имеет минимум защиты программ от возможных ошибок.
В процессоре Intel запрещена передача управления обычным средствам, программному сегменту, находящемуся на другом уровне привилегий. Ограничивая передачу управления в пределах одного кольца защиты, процессор тем самым предотвращает произвольное изменение уровней привилегий. Если бы значение CPL можно было легко изменять, все остальные средства защиты оказались бы бессмысленными.