
- •Мп и их роль в современных компьютерах, cisc, risc и epic мп:
- •Поэтому, для risc – процессоров характерно:
- •К преимуществам мп с risc – архитектурой можно отнести:
- •Краткая история развития мп семейства х86:
- •4. Перспективы развития микропроцессорной техники.
- •Основные причины и результаты усовершенствования мп семейства х86:
- •Системные регистры мп семейства х86:
- •Дескрипторные таблицы Дескрипторные таблицы
- •Назначение и структура дескрипторов кода и данных:
- •Назначение и структура системных дескрипторов:
- •Назначение и структура дескрипторов шлюзов:
- •Теневые регистры и их назначение:
- •Регистр флагов и назначение его отдельных битов:
- •Принцип формирования линейных адресов в реальном режиме работы мп семейства х86:
- •Принцип формирования линейных адресов в защищенном режиме работы мп в семействе х86:
- •Страничное преобразование адресов, ее назначение и принцип реализации:
- •Источники и разновидности запросов прерываний процессора:
- •Организация системы прерываний в реальном режиме работы процессоров семейства х86:
- •Организация системы прерываний в защищенном режиме работы процессоров семейства х86:
- •Организация общей (базовой) защиты в мп х86:
- •Защита по привилегиям сегментов и ее организация:
- •Защита по привилегиям команд:
- •Принципы организации многозадачного режима работы:
- •Сегмент состояния задачи, его структура и назначение:
- •Принципы, лежащие в основе использования кэш-памяти, и организация кэш-памяти прямого отображения:
- •Принципы организации полностью ассоциативной и множественно-ассоциативной кэш-памятей:
- •Принципы организации целостности данных в подсистеме памяти с кэшированием:
- •Описание блок-схем алгоритмов обслуживания запросов в подсистеме памяти с кэшированием:
- •4. Двухуровневое кэширование.
- •Принципы организации конвейерной обработки сигналов в мп х86:
- •Циклы шины и режимы работы мп х86:
- •2. Реальный режим (r86)
- •3. Защищенный режим (p – режим)
- •4. Виртуальный режим (v86)
- •5. Режим smm
- •Принципы организации пакетного режима обмена информацией:
- •Основные особенности микроархитектуры Intel Sandy Bridge и ее структурная схема:
- •Сущность принципа «динамического исполнения команд»:
- •Структурная схема ядер мп Sandy Bridge и их функционирование:
- •Необходимость и общие принципы функционирования блока предсказаний ветвлений:
- •Необходимость предварительного и основного декодирования инструкций х86 в мп микроархитектуры Sandy Bridge:
- •Функционирование системы обнаружения программных циклов и суть работы блока pcu в мп микроархитектуры Sandy Bridge:
- •Сущность технологий макро- и микрослияний инструкций и микрокоманд в мп микроархитектуры Sandy Bridge:
Защита по привилегиям сегментов и ее организация:
Основное назначение защиты по привилегиям сегментов заключается в том, чтобы предотвратить случайный или несанкционированный доступ к тем сегментам, которые содержат особо важные и ответственные блоки программного обеспечения системы. К ним относятся программы операционных систем, а также некоторые специальные массивы данных. Поэтому этот вид защиты в некоторых источниках носит название методов защиты операционной системы.
В основе защиты по привилегиям сегментов лежит принцип иерархической структуры привилегий. Иерархическая структура дает возможность защитить высокопривилегированные сегменты от сегментов менее привилегированных. Эта структура в процессорах семейства Х86 включает в себя четыре уровня привилегий, которые могут присваиваться используемым сегментам. Таким образом, все объекты программного обеспечения распределены по четырем областям, каждой из которых присваивается свой уровень привилегий. Обычно эти уровни изображают в виде кольцевой диаграммы, почему они получили название колец защиты (рис.VI.2). Уровень защиты обозначается цифрами 0, 1, 2, 3, причем наивысший уровень присвоен кольцу 0, а наиболее низкий – кольцу 3. Таким образом, наиболее важные программы – операционная система или ее ядро, обычно располагаются на нулевом уровне привилегий, в нулевом кольце, а такие, как пользовательские программы обычно имеют низший, третий уровень привилегий.
Такая защищенность операционной системы ведет к существенно большей надежности работы системы обработки информации в целом. Например, надежность системы обработки информации с процессором, не имеющим системы защиты, например на основе процессора 8086, ограничена наименее надежными программами; она подвержена ошибкам или несанкционированным алгоритмам в любом блоке исполняемой программы. Надежность же системы обработки с процессором, имеющим средства защиты, не зависит от ошибок в пользовательской программе, а зависит только от надежности программ операционной системы.
Рис.VI.2. Изображение уровней привилегий процессоров семейства Х86.
Заметим, что не все операционные системы поддерживают все четыре уровня привилегий, которые предусматривают процессоры семейства Х86 в защищенном режиме работы. Так, операционная система Unix поддерживает только два уровня привилегий: 0 и 3 (Супервизор/пользователь). Операционная система OS/2 поддерживает три уровня привилегий: 0 – ядро операционной системы; 2 – специальные процедуры для обращения к устройствам ввода/вывода; 3 – прикладные программы пользователя.
Операционная система Windows поддерживает все четыре уровня.
Если же процессор семейства Х86 используется для создания специализированного контроллера, в котором пользовательская программа не изменяется или изменяется очень редко, то достаточно задействовать один уровень привилегий – 0, разместить там и пользовательскую программу, разрешив ей, тем самым, доступ ко всем командам процессора, включая команды ввода/вывода и загрузки/сохранения системных регистров.
Возможные распределения программного обеспечения компьютера по уровням привилегий приведено в табл. VI.1.
Таким образом, защита программного обеспечения, в основном программ операционной системы, при помощи разделения всего программного обеспечения компьютера по уровням привилегий (кольцам защиты), заключается в жестко определяемых правилах связи между программными объектами, расположенными на разных уровнях, т.е.в разных кольцах защиты. При этом наиболее привилегированные программные объекты расположены в кольце 0,а наименее привилегированные – в кольце 3.
Атрибуты привилегий, т.е. указатели уровня привилегий данного объекта присваивается таким объектам как задачи, дескрипторы и селекторы.
Таким образом, в системе защиты определены:
Атрибут уровня привилегий текущей задачи (процесса) –
CPL (Current Privilege Level).
Атрибут уровня привилегий дескриптора –
DPL (Descriptor Privilege Level).
Атрибут уровня привилегий селектора (или запроса) –
RPL (Request Privilege Level).
Атрибут уровня привилегий задачи (CPL).
CPL – определяет уровень привилегий выполняемой в данный момент процессором задачи, т.е. процесса. Поэтому, иногда говорят, что CPL является уровнем привилегий процессора. Он идентифицируется состоянием двух младших разрядов сегментного регистра CS. При передаче управления сегменту кода с другим уровнем привилегий процессор будет работать на новом уровне привилегий, соответствующим новому состоянию младших битов сегментного регистра. Таким образом, CPL задачи может измениться только при передаче управления к новому кодовому сегменту через дескриптор шлюза. Задача, выполняемая на нулевом уровне привилегий, имеет доступ ко всем сегментам данных, описанным в глобальной дескрипторной таблице, и является самой привилегированной.
Атрибут уровня привилегий дескриптора (DPL).
Правильнее говорить про уровень привилегий сегмента, описываемого этим дескриптором, поскольку сам дескриптор уровня привилегий не имеет.
Атрибут уровня привилегий дескриптора (сегмента) идентифицируется битами поля DPL в его байте прав доступа. Если дескриптор описывает сегмент данных, то все данные внутри сегмента имеют уровень привилегий, содержащийся в поле DPL. В случае сегмента кода, весь код в сегменте также находится на уровне привилегий, определяемом полем DPL байта прав доступа. Значения битов DPL определяют наименьший уровень привилегий, с которым возможен доступ к данному дескриптору (а, следовательно, и к содержимому сегмента, которого он определяет). Заметим, что в системном дескрипторе, описывающем сегмент локальной дескрипторной таблицы, поле DPL не используется.
Атрибут уровня привилегий селектора (RPL).
Уровень привилегий селектора идентифицируется полем RPL – двумя младшими битами селектора. Эти два бита селектора определяют максимальный запрашиваемый уровень привилегий дескриптора сегмента данных или стека, к которому происходит обращение. Если же данный селектор требует обращения к сегменту, уровень привилегий которого выше, чем запрашиваемый уровень привилегий, то обращения не происходит и процессор уходит на прерывание, т.е. возникает особый случай (исключение). Формируется нарушение общей защиты. Другими словами, значение поля RPL численно должно быть всегда меньше или равно значению поля DPL выбираемого дескриптора.
Основные правила защиты по привилегиям сегментов.
Защита сегментов данных.
Основное правило защиты доступа к данным заключается в том, что процессор не разрешает обращаться к данным, которые более привилегированны, чем выполняющаяся программа. Это правило, следовательно, может быть представлено в виде выражения: DPL ≥ CPL.
Когда программа пытается осуществить обращение к данным с нарушением этого правила, процессор отказывается выполнять эту команду, уходит на прерывание и сообщает о нарушении общей защиты. Проверка этого правила осуществляется при загрузке селектора в один из сегментных регистров данных DS, ES, FS или GS. Если DPL того сегмента, который выбирает селектор, численно меньше CPL, процессор не загружает селектор и формирует нарушение общей защиты.
Однако это правило, практически, несколько расширяется. Дело в том, что уровень привилегий вызываемого сегмента должен быть в то же время ниже или равен запрашиваемому селектором уровню привилегий RPL. Следовательно, уровень привилегий вызываемого сегмента должен быть равен или меньше как уровня привилегий текущей задачи, так и запрашиваемого уровня привилегий. Таким образом, выражение, определяющее правила доступа к сегментам данных приобретает вид:
DPL ≥ max (CPL, RPL) = EPL
где EPL (Effective Privilege Level) – эффективный уровень привилегий.
Отсюда следует, что, задавая определенное значение RPL в селекторе, можно управлять доступом текущей программы к сегментам данных, имеющим различный уровень защиты. Например, при RPL = 0 доступ к данным будет определяться только значением CPL, т.е. уровнем привилегий текущей программы. Если же задать RPL = 3, то при любом CPL программа может обратиться только к наименее защищенным сегментам данных, размещенных в кольце 3 системы защиты.
При загрузке селектора в сегментный регистр стека SS правила защиты ужесточаются еще больше. Загрузка разрешается только в том случае, если значение DPL сегмента стека точно равна значению CPL. Напомним к тому же, что загрузка селектора в регистр SS допускается, кроме этого, только тогда, когда выбираемый сегмент допускает операции, как считывания, так и записи.
Защита сегментов кода.
Защита сегментов кода основывается на том, что прямая передача управления сегменту кода, находящемуся на другом уровне привилегий запрещена, независимо от того, на более низком или на более высоком уровне привилегий он находится.
Следовательно, непосредственные обращения между сегментами кода, а также между сегментами кода и сегментами данных, в пределах колец защиты и между ними может быть иллюстрирована рис. VI.3.
Рис.VI.3. Правила обращения в пределах колец защиты и между ними.
Однако в процессе выполнения программ процессор обязательно должен иметь возможность передавать управление программам, находящимся в сегментах, расположенных на разных уровнях привилегий. Например, при выполнении пользовательских программ, которые размещаются на наименее привилегированном уровне (PL3 –программы), процессор должен всегда иметь доступ к процедурам обслуживания, располагающихся на уровне PL1. Даже операционная система MS-DOS через прерывание INT21h предоставляет программам пользователя более 150 разнообразных функций обслуживания.
Поэтому в процессорах семейства Х86 предусматриваются два разных способа передачи управления к сегментам кода, находящихся на другом уровне привилегий. Первый заключается в использовании возможности перевода сегментов кода в режим подчиненности, а второй – в использовании для передачи управления специальных дескрипторов – шлюзов вызова.
Напомним, что межсегментная передача управления осуществляется командами типа FAR, такими как команды безусловного перехода JMP, вызова процедур CALL и возврата из процедур RET, а также командами прерывания INT и возврата из прерывания IRET. Адресная часть таких команд представляет собой 48 – битный указатель «селектор:смещение». Этот указатель при прямой передаче управления содержится в самой команде, а в случае косвенной передачи – извлекается из памяти.
а) Подчиненные сегменты кода.
Сегмент кода становится подчиненным (или согласованным), если в байте прав доступа его дескриптора бит C (Conforming) установлен в состояние 1. Подчиненный сегмент не имеет своего индивидуального уровня привилегий. Его уровень привилегий становится тем уровнем привилегий, который имеет сегмент, где находится программа, передающая ему управление. Поэтому, в этом случае, обычные правила защиты по значениям CPL и DPL не действуют. При передаче управления подчиненному сегменту, биты поля RPL регистра CS не изменяются на значение битов поля DPL дескриптора сегмента кода, в котором находится исполняемая программа (процесс), как это обычно бывает. Эти биты поля RPL регистра CS сохраняют значение поля DPL предыдущего последнего выполнявшегося неподчиненного сегмента кода.
Подчиненным сегментом, например, делают сегмент кода, включающий процедуру преобразования двоичных чисел в символьные коды ASCII, которую используют программы на каждом уровне привилегий. В качестве подчиненных удобно также делать сегменты, включающие разделенные библиотеки, которые также могут использовать программы, размещенные на разных уровнях привилегий.
Следует отметить, что в связи с такой легкой изменчивостью своего уровня привилегий, подчиненные сегменты не должны содержать привилегированные команды, например команды ввода/вывода.
При использовании подчиненных сегментов существует все же одно ограничение: значение DPL дескриптора подчиненного сегмента всегда должно быть меньше или равно текущему значению CPL. Таким образом, передача управления в подчиненные сегменты разрешается только на более привилегированные уровни, т.е. во внутренние кольца защиты. Передавать же управление менее привилегированной программе не разрешается никогда.
б) Передача управления с помощью шлюзов вызова.
Другим способом обращения к программным сегментам, находящихся на других уровнях привилегий является использование шлюзов вызова (Call Gates). Команда передачи управления CALL в вызывающей программе обращается к шлюзу вызова, а шлюз вызова осуществляет косвенную передачу управления непосредственно на конкретную команду в программе целевого кодового сегмента. Чаще всего, , такая передача управления происходит от выполняемой пользовательской программы к конкретной процедуре сильно защищенной операционной системы.
Как уже говорилось ранее, дескрипторы шлюза вызова являются системными объектами, величиной 8 байт, которые могут размещаться как в глобальной, так и в локальных дескрипторных таблицах. Напомним формат дескриптора шлюза вызова (рис.VI.4).
Как видно из рисунка, дескриптор шлюза вызова включает в себя селектор, по которому определяется базовый адрес сегмента, и смещение в этом сегменте, т.е. содержит полный 32 – разрядный адрес назначения. В этом его принципиальное отличие от дескрипторов сегментов, которые содержат только базовый адрес сегмента и его размер. Таким образом, дескриптор сегмента служит механизмом отображения области памяти, а дескриптор шлюза является механизмом перенаправления.
Рис.VI.4. Формат дескриптора шлюза вызова
В дескрипторе шлюза вызова предусмотрено 5 бит счетчика слов (Word count). Эти биты позволяют передать до 32 параметров из старого стека в новый, который образуется на новом уровне привилегий, куда передается управление. Необходимость организации стека на новом уровне определяется тем, что одно из правил защиты по привилегиям требует, чтобы уровень привилегий стека должен быть всегда равен уровню CPL.
Отметим, что в процессорах Pentium + вызов через шлюз может осуществляться командами как CALL, так и JMP, тогда как в более ранних моделях процессоров семейства Х86, такой вызов производился только командой CALL.
Подчеркнем, что сама команда CALL или JUMP должна адресовать шлюз
вызова, а не сегмент кода назначения. Программам никогда не разрешается прямо обращаться к сегментам кода на других уровнях привилегий. Смещение в целевом сегменте, которое указывает конкретный адрес начала вызываемой процедуры, записывается заранее в дескриптор шлюза, и может быть изменен только системным программистом. Этим гарантируется избежание таких ошибок, как передача управления в середину процедуры или даже в середину команды.
Схема передачи управления вызываемой процедуре при помощи шлюзов вызова изображена на рис.VI.5. В команде FAR CALL, которая обращается к шлюзу вызова, имеющееся в ней смещение игнорируется, а селектор используется для определения дескриптора шлюза вызова. После того, как дескриптор шлюза вызова найден, из него берется селектор, помещается в кодовый регистр CS, и по нему, через дескрипторные таблицы, находится базовый адрес целевого сегмента CS. Затем, из дескриптора шлюза выбирается смещение в этом сегменте, которое, суммируясь с базовым адресом сегмента, образует конкретный физический адрес начала искомой процедуры.
Таким образом, задание в шлюзе вызова полного указателя адреса «селектор:смещение» обеспечивает вход только в строго определенных точках программного сегмента. Каждая точка входа в программный сегмент от менее привилегированного кода должна иметь соответствующий ей шлюз вызова.
Такой косвенный вызов привилегированных процедур имеет следующие преимущества.
Привилегированные программы сильно защищены и вызывающие программы не могут их исказить.
Шлюзы вызова делают программу процедуры невидимой для программ на внешних уровнях привилегий.
При использовании новой версии операционной системы не требуется корректировать старые пользовательские программы. Дело в том, что пользовательская программа при вызове процедур операционной системы обращается всегда только к шлюзам, которые могут оставаться по старым адресам. Следовательно, при изменении адресов процедур обслуживания операционных систем, достаточно только изменить их виртуальный адрес (селектор и смещение) в дескрипторах шлюзов вызова, что выполняется достаточно легко.
Как это уже было отмечено выше, передача управления через шлюзы вызова может осуществляться только к тем сегментам, уровень привилегий которых выше или равен уровню привилегий текущей программы. Однако, при этом, уровень привилегий самих использованных шлюзов должен быть ниже или равен уровню привилегий текущей программы. Таким образом, правила разрешения вызова через шлюз имеет вид:
1. DPL целевого сегмента кода ≤ CPL;
2. DPL целевого сегмента кода ≤ DPL шлюза;
3. max (RPL, CPL) ≤ DPL шлюза.
Иллюстрация этого правила отображена на рис.VI.6.
Рис.VI.6. Разрешенные варианты передачи управления через шлюзы.
Если все указанные выше правила соблюдаются, то после вызова дескриптора шлюза в сегментный регистр CS из него загружается селектор, который хранится во 2 и 3 байте этого дескриптора. По этому селектору из соответствующей дескрипторной таблицы (чаще всего LDT) выбирается дескриптор требуемого сегмента. При этом младшие два бита (поле RPL) селектора игнорируются, а вместо них в регистр CS в качестве CPL заносится значение DPL из дескриптора вызываемого сегмента.
Заметим, что правила передачи управления через шлюз включает в себя случай, когда сегмент вызываемой процедуры имеет тот же уровень привилегий, что и сегмент текущей выполняемой программы. Но в таких случаях использовать шлюзы нет никакой необходимости, так как гораздо проще передать управление непосредственно по адресу процедуры, причем в этом случае можно использовать не только команды FAR CALL, но и команды безусловного перехода FAR JMP во всех моделях процессоров семейства Х86.