
- •Замковец с.В. Левин н.А. Попкова е.Я. Архитетура микропроцессоров
- •Удк 681.3.06
- •Классификация микропроцессоров по архитектуре
- •Архитектура микропроцессоров 80х86
- •2.1. Используемые типы данных
- •2.2. Регистры микропроцессоров
- •2.3. Режимы адресации
- •2.4. Управление стеками
- •2.5. Сегментная организация памяти
- •Система команд микропроцессоров
- •3.2.Команды передачи данных
- •Команды двоичной арифметики
- •Команды десятичной арифметики
- •Логические команды
- •Команды сдвигов
- •Команды обработки бит и байт
- •Команды обработки цепочек
- •Команды передачи управления
- •3.9.1. Команды условных переходов
- •3.9.2 Команды безусловных переходов
- •3.9.3 Команды вызова подпрограмм
- •3.9.4 Команды возврата из подпрограмм
- •4. Прерывания
- •4.1. Прерывания в реальном режиме
- •Защита по привилегиям
- •5.1. Определение уровней привилегий
- •Вычисления с плавающей запятой
- •6.1. Форматы чисел с плавающей запятой
- •6.3. Регистры сопроцессора
- •Mmx архитектура
- •7.1. Форматы представления данных
- •7.2. Арифметика с насыщением
- •7.3. Mmx регистры
- •7.4. Система команд mmx
- •1. Классификация микропроцессоров по архитектуре ... 8
- •2. Архитектура микропроцессоров 80х86 ………………...10
Защита по привилегиям
Защита по привилегиям работает только в защищенном режиме. Механизм защиты микропроцессоров основан на описании различных системных объектов при помощи дескрипторов. В каждом дескрипторе в байте AR имеется двухбитное поле уровня привилегий сегмента, описанного данным дескриптором. Это поле называется DPL и оно определяет, каким программам разрешается доступ к данному сегменту.
Термин “привилегия” подразумевает права или возможности, которые обычно не разрешаются. Микропроцессоры семейства Intel поддерживают четыре уровня привилегий от нулевого до третьего. При этом предполагается, что чем меньше номер уровня, тем более он привилегирован, т.е. уровень 0 наиболее привилегирован, а уровень 3 – наименее привилегирован.
На наиболее привилегированном уровне 0 обычно располагается ядро операционной системы, которое можно назвать ядром безопасности. Ядро безопасности осуществляет управление памятью, защиту и управление доступом. В ядре сосредоточены все функции безопасности, и оно защищено от остальной части операционной системы. Ядро безопасности должно быть разработано таким образом, что если оно полностью безопасно, то и вся операционная система безопасна.
Разработка операционной системы с небольшим ядром безопасности обеспечивает несколько преимуществ. Например, для повышения уверенности в корректности программ ядра можно применить дорогие методы, которые неэкономичны для больших программ. Эти методы предполагают интенсивное тестирование ядра, анализ его целыми группами программистов, математические доказательства корректности программ.
Сама операционная система располагается на следующем уровне, который обозначается как уровень привилегий 1. Пользовательские прикладные программы обычно располагаются на уровне привилегий 3. Кандидатами для уровня 2 оказываются специализированные подсистемы программирования, которые необходимо защищать, поскольку они реализуют собственные механизмы безопасности. Примерами подобных подсистем являются системы управления базами данных, автоматизации управленческой деятельности и разработки программ.
При выполнении почти каждой команды микропроцессор осуществляет проверку защиты по привилегиям. При этом контроль заключается в том, что выполняемая программа должна быть достаточно привилегированна для того, чтобы:
- выполнять некоторые команды;
- обращаться к данным других программ;
- передавать управление внешнему по отношению к самой программе коду командами передачи управления.
5.1. Определение уровней привилегий
Основным системным объектом, которым оперирует процессор, является сегмент памяти. В связи с этим привилегии и назначаются сегментам. С каждым сегментом кода, данных или стека ассоциируется уровень привилегий и все, что находится внутри этого сегмента, имеет этот уровень привилегий.
Уровень привилегий сегмента определяет поле DPL уровня привилегий дескриптора в байте прав доступа AR.
Уровень привилегий выполняющегося кода называется текущим уровнем привилегий CPL и он задается полем RPL селектора в регистре CS.
ПРИВИЛЕГИРОВАННЫЕ КОМАНДЫ
К привилегированным командам в первую очередь относятся те команды, которые изменяют сегментацию или влияют на сам механизм защиты. Примерами таких команд являются команды загрузки регистров дескрипторных таблиц LGDT, LIDT и LLDT. Таким образом, можно отметить, что имеется группа особо важных привилегированных команд, которые влияют на функционирование процессора и такие команды можно выполнять только программам, которые обладают нулевым уровнем привилегий.
ЗАЩИТА ДОСТУПА К ДАННЫМ
Микропроцессор осуществляет контроль по привилегиям при обращении к данным. Для работы любой программе требуются адресные пространства данных и стека. Микропроцессор не разрешает обращаться к данным, которые являются более привилегированными, чем выполняющаяся программа. Основное правило защиты доступа к данным имеет следующий вид:
CPL (т.е. PL программы) <= DPL (т.е. PL данных)
Представленное правило означает, что значение DPL дескриптора сегмента кода должно быть не больше значения DPL дескриптора сегмента данных (программа не должна быть менее привилегированна, чем данные, к которым она обращается). Когда программа пытается осуществить обращение с нарушением этого правила, процессор отказывается произвести это обращение и сообщает о нарушении общей защиты.
Контроль реализуется двумя способами. Во-первых, проверка привилегий осуществляется при загрузке селектора в один из сегментных регистров данных. Если значение DPL того сегмента, который выбирает селектор, численно меньше CPL, процессор не загружает селектор и формирует нарушение общей защиты.
Во-вторых, после успешной загрузки селектора при его использовании для фактического обращения к памяти микропроцессор контролирует, чтобы выполняемая операция (считывание или запись) для этого сегмента была разрешена. На этом этапе обнаруживаются и отвергаются попытки записи в сегмент кода или только в считываемые сегменты данных, а также считывание из сегмента кода, для которого разрешено только выполнение. Такие ситуации невозможно выявить при загрузке селектора, так как процессор не может знать заранее о неправильном использовании сегмента.
ЗАЩИТА СЕГМЕНТОВ КОДА
Для поддержки защиты процессор должен запрещать менее привилегированным процедурам вызывать более привилегированные. Таким образом, он предотвращает выполнение пользовательской программой тех операций, которые должны выполняться только операционной системой. Однако пользовательская программа должна иметь допустимые обслуживания, которые ей нужны от операционной системы. Поэтому процессор разрешает менее привилегированной процедуре вызывать более привилегированную, но разрешает доступ разрешенными точками входа. Следовательно, пользовательская программа получает от операционной системы только те обслуживания, которые системе разрешено оказывать пользовательской программе.
Допустимые точки входа идентифицируются в процессоре специальными дескрипторами, называемыми шлюзами вызова. Вызывающая программа выполняет косвенную передачу управления через шлюз вызова. Команда CALL в вызывающей программе обращается к шлюзу вызова, а он определяет точку входа в вызываемой программе.
Для доступа пользовательской программы к конкретной процедуре операционной системы необходимо иметь шлюз вызова (привилегия которого достаточно низка для доступа пользовательской программе) и заставить этот шлюз обратиться в точку входа сильно защищенной операционной системы.
Дескриптор шлюза вызова содержит виртуальный адрес нужной точки входа в более привилегированном сегменте. Команда вызова содержит виртуальный адрес, селектор которого адресует шлюз вызова, а смещение в самой команде вызова игнорируется.
Как системный объект шлюз вызова имеет собственный дескриптор. Формат этого шлюза содержит полный указатель селектор:смещение (48 бит), и этот указатель определяет полный адрес точки входа той процедуры, которой шлюз передает управление. Дескриптор шлюза вызова действует как посредник между сегментами кода, находящимися на различных уровнях привилегий. Шлюзы вызова идентифицируют разрешенные точки в более привилегированном коде, которым может быть передано управление, и являются единственным средством смены уровней привилегии.
В отличие от дескрипторов сегментов кода, данных или стека дескрипторы шлюзов вызова не определяют никакого адресного пространства, поэтому в них нет полей базы и предела. По существу дескрипторы шлюзов вызова не являются дескрипторами, но их удобно размещать в дескрипторных таблицах. Селекторы, которые выбирают дескрипторы шлюзов вызова, нельзя загружать в сегментные регисты данных и стека, а их необходимо загружать в сегментный регистр CS для передачи управления сегменту кода на другом уровне привилегий.
Адресовать шлюз вызова можно только при помощи команды межсегментного вызова FAR CALL, а команды безусловного перехода JMP запрещены. Сама команда CALL должна адресовать шлюз вызова, а не сегмент кода назначения. Программам никогда не разрешается прямо адресоваться к сегментам кода на других уровнях привилегий.
Шлюз вызова определяет сегмент, которому передается управление, и точное смещение в этом сегменте, где начинается выполнение процедуры. По существу, в команде FAR CALL, которая обращается к шлюзу вызова, имеющееся смещение игнорируется, а селектор только определяет шлюз вызова. Загружаемый в регистр CS селектор берется из шлюза вызова. Задание в шлюзе вызова полного указателя селектор:смещение обеспечивает вход только в определенных точках. Каждая точка входа от менее привилегированного кода должна иметь соответствующий ей шлюз вызова.
Реализованный в микропроцессоре косвенный вызов привилегированных процедур имеет несколько преимуществ:
- привилегированный код сильно защищен и вызывающие процедуры не могут его разрушить;
- шлюзы вызова делают код процедуры невидимым для программ на внешних уровнях привилегий;
- так как вызывающая программа прямо адресует только шлюз, реализуемые процедурой функции можно изменить или переместить ее в адресном пространстве, не затрагивая интерфейс со шлюзом.
Шлюзы вызова, передающие управление более привилегированному сегменту кода, сами имеют определенные ограничения на использование. При осуществлении доступа к шлюзу вызова необходимо учитывать:
- значение DPL самого шлюза вызова;
- значение DPL дескриптора вызываемого сегмента кода;
- значение RPL селектора в команде FAR CALL;
- значение CPL текущей (вызывающей) программы.
В этом случае правило разрешения вызова через шлюз имеет следующий вид:
DPL целевого сегмента <= max(RPL,CPL) <=DPL шлюза.
Если, например, процессор выполняет PL2-программу (т.е. CPL=2) и ей требуется вызвать PL0-процедуру (целевой DPL=0), необходимо использовать шлюз вызова со значением DPL равным 2 или 3. Если дескриптор шлюза вызова имеет значение DPL=1, шлюз доступен сегментам кода со значениями DPL=0 или 1, а сегментам кода со значениями DPL=2 или 3 шлюз не доступен.
Суммарные правила для использования шлюза вызова имеют следующий вид:
- значение DPL шлюза вызова должно быть больше или равно значению текущего уровня привилегий CPL;
- значение DPL шлюза вызова должно быть больше или равно значению поля RPL селектора шлюза;
- значение DPL шлюза вызова должно быть больше или равно значению DPL целевого сегмента кода;
- значение DPL целевого сегмента кода должно быть меньше или равно значению текущего уровня привилегий CPL.