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


Категории:

ДомЗдоровьеЗоологияИнформатикаИскусствоИскусствоКомпьютерыКулинарияМаркетингМатематикаМедицинаМенеджментОбразованиеПедагогикаПитомцыПрограммированиеПроизводствоПромышленностьПсихологияРазноеРелигияСоциологияСпортСтатистикаТранспортФизикаФилософияФинансыХимияХоббиЭкологияЭкономикаЭлектроника






Проверка корректности использования отдельных команд.

К привилегированным командам относятся те, на выполнение которых влияет уровень привилегий программы или привилегии устройств ввода/вывода. Микропроцессор имеет три группы привилегированных команд, степени привилегий которых различны. Это: 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)

Из приведенных выражений для условий доступа видно, что значение RPL может только усилить неравенство (1), т.е. уменьшить возможности обращения текущей программы к сегментам данных. Например, пусть CPL=RPL=2. Тогда EPL=2 и текущей программе с CPL=2 разрешено обращение к сегментам данных, расположенным на втором и третьем уровнях привилегий. Если RPL=3, а CPL=2, то EPL=3 и текущая программа, имеющая CPL=2, уже не сможет обратиться к сегментам данных второго уровня привилегий, и ей доступны сегменты только третьего уровня привилегий. Таким образом, за счет RPL можно настраивать механизм защиты на нужный режим работы. Это основное назначение параметра RPL.

 

Защита программ.

 

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

Рассмотрим работу механизма защиты программ на примере межсегментных передач управления без изменения уровня привилегий. Существуют две разновидности таких передач управления. Это – переходы на программы сегмента того же уровня привилегий и переходы на программы подчиненных сегментов.

Среди сервисных программ операционной системы имеется ряд программ, которые используют другие программы на каждом уровне привилегий. Обычно такие программы просты по конструкции, требуют обращения только к своему параметру и возвращают результат вызывающей программе. Для упрощения обращения к таким программам можно было бы разместить их на уровне пользовательских программ. Но их используют на всех уровнях. Следовательно, такие программы нужны либо дублировать для каждого уровня привилегий, либо использовать более сложные межсегментные переходы с увеличением уровня привилегий. Для таких ситуаций в процессоре 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 можно было легко изменять, все остальные средства защиты оказались бы бессмысленными.

Но передача управления на программы ОС необходима. Для решения этой проблемы в микропроцессоре предусмотрены особые системные объекты – шлюзы. Шлюзы являются ключевыми объектами для организации межсегментных переходов с увеличением уровня привилегий, т.е. на программы ОС. Любые переходы с увеличением уровня привилегий производятся только с использованием шлюза. Дескриптор шлюза вызова действует как посредник между программными сегментами, находящимися на различных уровнях привилегии.

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

Доступность шлюза аналогично доступности данных. Шлюз доступен, если его уровень привилегий DPL шл не выше текущего уровня привилегий CPL вызывающей программы и уровня привилегий RPL запроса. Таким образом, механизм защиты проверяет условие: (CPL<DPLшл)&(RPL<DPLшл) (2)

В результате получается следующий алгоритм проверок при использовании шлюзов. На первом этапе вызывающая программа производит чтение дескриптора шлюза вызова и проверяется условие его доступа (2). Уровень привилегий шлюза DPLшл выбирается из дескриптора шлюза. Если условие (2) выполняется, то на втором этапе производится чтение дескриптора программного сегмента из локальной LDT или глобальной GDT таблиц дескрипторов. Обращение к этим таблицам производится с помощью селектора, заданного в дескрипторе шлюза вызова. После этого проверяется условие доступности программного сегмента. Межсегментная передача управления допустима только на программы своего или более высоких уровней привилегий DPL. Таким образом, на втором этапе проверяется условие (CPL>DPL) (3). Если условие (3) выполняется, то значение DPL из дескриптора вызываемого программного сегмента заносится в поле уровня привилегий CPL сегментного регистра CS. После сохранения в стеке параметров вызывающей программы, таких как точки возврата, и проведения необходимых проверок управление передается вызываемой программе.

 

Конвейер команд

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

 

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

Рассмотрим синхронный конвейер команд, который обычно применяется в большинстве современных микропроцессорах.

Пусть рабочий цикл выполнения команды состоит из шести этапов, т.е. К=6:

1) Выборка команды (ВК). На этом этапе проводится чтение очередной команды программы из памяти и запись ее в регистр команд процессора.

2) Декодирование команды (ДК). На втором этапе проводится определение кода операции команды и способы адресации операндов.

3) Вычисление адресов операндов (ВА). Вычисляются физические адреса каждого из операндов в соответствии со способом его адресации.

4) Выборка операндов (ВО). Чтение операндов из памяти и запись их в регистры процессора (РОНы).

5) Исполнение команды (ИК). Выполнение самой команды. Большинство арифметических и логических команд выполняется в АЛУ.

6) Запись результата (ЗР). Запись результата выполнения операции в память.

Некоторые команды могут выполняться за меньшее количество этапов. Например, для команд типа “регистр-регистр” не требуется 4-ый и 6-ой этапы.

Временная диаграмма выполнения девяти команд на конвейере (N=9):

Рис.1

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

При отсутствии конвейера выполнение 9 команд заняло бы 9*6=54 такта. Использование конвейера позволяет сократить время обработки до 14 тактов.

 

 

Конфликты в конвейере команд

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

1) попыткой нескольких команд одновременно обратиться к одному и тому же ресурсу (структурный риск);

2) взаимосвязью команд по данным (риск по данным);

3) неоднозначностью при выборке следующей команды в случае команд перехода (риск по управлению).

Структурный риск возникает тогда, когда несколько команд, находящихся на разных ступенях конвейера, пытаются одновременно использовать один и тот же ресурс, например, память. В рассмотренном примере сразу три этапа ВК, ВО, ЗР связаны с обращением к памяти, которые могут выполняться одновременно. Для устранения таких коллизий используется модульный принцип построения памяти. В этом случае оперативная память состоит из нескольких независимых модулей, обращение к которым может происходить одновременно. Для уменьшения структурного риска используется также и разделенная кэш- память, т.е. когда используются два КЭШа: кэш команд и кэш данных. В этом случае одновременно можно производить чтение команд и данных, которые находятся в разных КЭШах. В некоторых случаях конфликты из-за одновременного обращения к памяти могут и не возникать, поскольку некоторые команды не требуют этапов выборки операндов и записи результатов. В целом, влияние структурного риска на производительность конвейера по сравнению с другими видами риска невелико.

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

Пусть две команды на конвейере i-ая и j-ая предусматривают обращение к одной и той же переменной x, а команда i предшествует команде j. Тогда между этими командами возможны три типа конфликта по данным.

а) Чтение после записи (ЧПЗ). Для правильного выполнения программы команд j-ая должно прочитать переменную x после ее изменения предшествующей командой i. Если же команда j читает x до того, как команда i успела записать новое значение x, т.е. команда j ошибочно читает старое значение x вместо нового, то возникает конфликт, нарушающий правило: “Чтение после записи”.

Это наиболее частый тип конфликта по данным, поскольку операция чтения (этап ВО) предшествует операции записи (этап ЗР).

в) Запись после чтения (ЗПЧ). Конфликт такого типа возникает в том случае, если команда j записывает новое значение x раньше, чем предшествующая команда i успела прочитать старое значение x, т.е. команда i ошибочно получает новое значение переменной x вместо ее старого значения. Таким образом, возникает конфликт, нарушающий правило “Запись после чтения”.

Если команды на конвейере следуют в порядке, определенном программой, то конфликты такого типа не возможны, поскольку запись результата всегда идет после чтения операнда. Однако конфликты такого типа возникают в случае, если команды на конвейере выполняются не в том порядке, как это определено программой. Например, выполнение команды i приостановлено из-за какого-то конфликта, и в результате команда j будет выполнена раньше, чем команда i. Тогда и возможен конфликт типа ЗПЧ.

с) Запись после записи (ЗПЗ). Конфликт такого типа возникает в том случае, если команда j записывает новое значение переменной x прежде, чем команда i успела записать свое значение x. Тогда в памяти ЭВМ будет ошибочно содержаться старое значение переменной x вместо нового, поскольку команда i на место нового значения x записало старое значение.

Конфликты типа ЗПЗ в случае выполнения команд в порядке, определенном программой, не возможны, поскольку запись результата всегда производится на последнем этапе, а не раньше. В случае нарушения естественного порядка выполнения команд конфликты такого типа возможны, если одна команда догоняет другую из-за ее приостановки.

 

Последнее изменение этой страницы: 2016-07-23

lectmania.ru. Все права принадлежат авторам данных материалов. В случае нарушения авторского права напишите нам сюда...