Аппаратные средства поддержки мультипрограммирования имеются во всех со­временных процессорах. Несмотря на различия в реализации, дл - shikardos.ru o_O
Главная
Поиск по ключевым словам:
Похожие работы
Название работы Кол-во страниц Размер
Теория счастья для общества потребления 1 96.57kb.
T1877 Необходимо подробное описание всех действий со скиншотами. 1 187kb.
Семинар Изобразительные и выразительные средства языка Термины 1 30.42kb.
Медицинские средства индивидуальной защиты в результате аварий, катастроф... 1 34.93kb.
Перечень лекарственных препаратов, отпускаемых населению в соответствии... 1 141.53kb.
Противопаркинсонические лекарственные средства 1 60.06kb.
Языковые средства реализации концептуальной оппозиции «свой чужой»... 1 344.71kb.
1. История развития воздушного транспорта 1 Летательные аппараты... 2 493.88kb.
4. Лекция: Современные средства и линии связи 2 579.72kb.
Средства оргтехники, применяемые в скс и туризме >11 Копировально-множительные... 1 199.32kb.
Операционная среда Sun Solaris Введение 1 364.37kb.
Конспект к образовательному курсу "Техника оптимизации программ"... 6 1164.44kb.
- 4 1234.94kb.
Аппаратные средства поддержки мультипрограммирования имеются во всех со­временных - страница №1/3



Московский Государственный Институт Электроники и Математики

(Технический университет)

Кафедра ЭВА

«Аппаратная поддержка мульти­программирования на примере

процессора Pentium»
Дисциплина: «Системное программное обеспечение»

Москва, 2005 г.


Содержание


Содержание 2

2



Введение 3

1.Реальный и защищенный режимы работы процессора 3

2.Регистры процессора 3

3.Привилегированные команды 6

4.Средства поддержки сегментации памяти 6

4.1Виртуальное адресное пространство 7

4.2.Преобразование адресов 9

4.3.Защита данных при сегментной организации памяти 11



5.Сегментно-страничный механизм 17

6.Средства вызова процедур и задач 20

6.1Вызов процедур 20

6.2.Вызов задачи 23

7.Система прерываний 32-разрядных микропроцессоров i80x86 25

7.1.Работа системы прерываний в реальном режиме работы процессора 26

7.2.Работа системы прерываний в защищенном режиме работы процессора 29

7.2.1.Обработка прерываний в контексте текущей задачи 30

7.2.2.Обработка прерываний с переключением на новую задачу 31

8.Кэширование в процессоре Pentium 33

8.1.Буфер ассоциативной трансляции 33

8.2.Кэш первого уровня 36

8.3.Совместная работа кэшей разного уровня 37



Выводы 40

Введение


Аппаратные средства поддержки мультипрограммирования имеются во всех со­временных процессорах. Несмотря на различия в реализации, для большинства типов процессоров эти средства имеют общие черты. Это в полной мере относит­ся и к рассматриваемому популярному семейству 32-разрядных процессо­ров Intel: 80386, 80486, Pentium, Pentium Pro, Pentium II, Celeron и Pentium III. Более того, средства поддержки операционной системы во всех этих процессорах построены почти идентично, поэтому далее в тексте для их обозначения используется обобщенный термин «процессоры Pentium».
  1. Реальный и защищенный режимы работы процессора


Широко известно, что первым микропроцессором, на базе которого была создана IBM PC, был Intel 8088. Этот микропроцессор отличался от первого 16-разряд­ного микропроцессора фирмы Intel — 8086 — прежде всего тем, что у него была 8-битовая шина данных, а не
16-битовая (как у 8086). Оба эти микропроцессора предназначались для создания вычислительных устройств, которые бы работали в однозадачном режиме, то есть специальных аппаратных средств для поддерж­ки надежных и эффективных мультипрограммных ОС в них не было.

Однако к тому времени, когда разработчики осознали необходимость включения в микропроцессор специальной аппаратной поддержки для мультипрограммных вычислений, уже было создано очень много программных продуктов. Поэтому для совместимости с первыми компьютерами в последующих версиях микропро­цессоров была реализована возможность использовать их в двух режимах — реальном (real mode — так назвали режим работы первых 16-битовых микропроцессоров) и защищенном (protected mode — означает, что параллельные вычисле­ния могут быть защищены аппаратно-программными механизмами). В реальном режиме процессор Pentium выполняет 16-разрядные инструкции и ад­ресует 1 Мбайт памяти.


  1. Регистры процессора


В организации вычислительного процесса важную роль играют регистры про­цессора. В процессорах Pentium эти регистры делятся на несколько групп:

□ регистры общего назначения;

□ регистры сегментов;

□ указатель инструкций;

□ регистр флагов;

□ управляющие регистры;

□ регистры системных адресов;

□ регистры отладки и тестирования, а также регистры математического сопро­цессора, выполняющего операции с плавающей точкой.

В процессоре Pentium имеется восемь 32-разрядных регистров общего назначе­ния. Четыре из них, которые можно условно назвать А, В, С и D, используются для временного хранения операндов арифметических, логических и других ко­манд. Программист может обращаться к этим регистрам как к единому целому, используя обозначения ЕАХ, ЕВХ, ЕСХ, EDX, а также к некоторым их частям, как это показано на рис. 1. Здесь обозначение AL (L — Low) относится к перво­му, самому младшему байту регистра ЕАХ, АН (Н — High) — к следующему по старшинству байту, а АХ обозначает оба младших байта регистра. Приставка Е в обозначении этих регистров (а также некоторых других) образована от слова extended (расширенный), что указывает на то, что в прежних моделях процессо­ров Intel эти регистры были 16-разрядными, а затем их разрядность была увели­чена до 32 бит.

Остальные четыре регистра общего назначения — ESI, EDI, ЕВР и ESP — пред­назначены для задания смещения адреса относительно начала некоторого сег­мента данных. Эти регистры используются совместно с регистрами сегментов в системе адресации процессора Pentium для задания виртуального адреса, кото­рый затем с помощью таблиц страниц отображается на физический адрес.




Рис. 1. Основные регистры процессора Pentium
Регистры сегментов CS, SS, DS, ES, FS и GS в защищенном режиме ссылаются на дескрипторы сегментов памяти — описатели, в которых содержатся такие па­раметры сегментов, как базовый адрес, размер сегмента, атрибуты защиты и не­которые другие. Регистры сегментов хранят 16-разрядное число, называемое се­лектором, в котором 12 старших разрядов представляют собой индекс в таблице дескрипторов сегментов, 1 разряд указывает, в какой из двух таблиц, GDT или LDT, находится дескриптор, а три разряда поля RPL хранят значение уровня привилегий запроса к данному сегменту. Регистр CS {Code Segment) предназна­чен для хранения индекса дескриптора кодового сегмента, регистр SS {Stack Segment') — дескриптора сегмента стека, а остальные регистры используются для указания на дескрипторы сегментов данных. Все регистры сегментов, кроме CS, программно доступны, то есть в них можно загрузить новое значение селектора соответствующей командой (например, LDS). Значение регистра CS изменяется при выполнении команд межсегментных вызовов CALL и переходов JMP, а также при переключении задач (В этом разделе термин «задача» часто будет употребляться вместо равнозначного (и более распространенного) термина «процесс» в связи с тем, что именно этот термин выбрали в свое время разработчики процессоров Intel x86 и он фигурирует в названиях регистров и структур данных).

Указатель инструкций EIP содержит смещение адреса текущей инструкции, ко­торое используется совместно с регистром CS для получения соответствующего виртуального адреса.

Регистр флагов EFLAGS содержит признаки, характеризующие результат выпол­нения операции, например флаг знака, флаг нуля, флаг переполнения, флаг па­ритета, флаг переноса и некоторые другие. Кроме того, здесь хранятся некоторые признаки, устанавливаемые и анализируемые механизмом прерываний, в част­ности флаг разрешения аппаратных прерываний IF.

В процессоре Pentium имеется пять управляющих регистров — CRO, CR1, CR2, CR3 и CR4, которые хранят признаки и данные, характеризующие общее состоя­ния процессора (рис. 2).

Регистр CR0 содержит все основные признаки, существенно влияющие на ра­боту процессора, такие как реальный/защищенный режим работы, включение/выключение страничного механизма системы виртуальной памяти, а также при­знаки, влияющие на работу кэша и выполнение команд с плавающей точкой. Младшие два байта регистра CR0 имеют название Mashine State Word, MSW«слово состояния машины». Это название использовалось в процессоре 80286 для обозначения управляющего регистра, имевшего аналогичное назначение.

Регистр CR1 в настоящее время не используется (зарезервирован).

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

Рис. 2. Управляющие и системные регистры процессора Pentium
В регистре CR4 хранятся признаки, разрешающие работу так называемых архи­тектурных расширений, например возможности использования страниц разме­ром 4 Мбайт и т. п.

Регистры системных адресов содержат адреса важных системных таблиц и структур, используемых при управлении процессами и памятью. Регистр GDTR {Global Descriptor Table Register) содержит физический 32-разрядный адрес гло­бальной таблицы дескрипторов GDT сегментов памяти, образующих общую часть виртуального адресного пространства всех процессов. Регистр IDTR (Interrupt Descriptor Table Register) хранит физический 32-разрядный адрес таблицы деск­рипторов прерываний IDT, используемой для вызова процедур обработки пре­рываний в защищенном режиме работы процессора. Кроме этих адресов в ре­гистрах GDTR и IDTR хранятся 16-битные лимиты, задающие ограничения на размер соответствующих таблиц.

Два 16-битных регистра хранят не физические адреса системных структур, а зна­чения индексов дескрипторов этих структур в таблице GDT, что позволяет кос­венно получить соответствующие физические адреса. Регистр TR (Task Register) содержит индекс дескриптора сегмента состояния задачи TSS. Регистр LDTR (Local Descriptor Table Register) содержит индекс дескриптора сегмента локаль­ной таблицы дескрипторов LDT сегментов памяти, образующих индивидуаль­ную часть виртуального адресного пространства процесса.



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


Привилегированные команды — это команды, которые могут быть выполнены только при определенном уровне привилегий текущего кода CPL (Current Privi­lege Level). В процессорах Pentium поддерживается четыре уровня привилегий, от самого привилегированного нулевого, до наименее привилегированного третьего. С помощью привилегированных команд осуществляется защита структур опера­ционной системы от некорректного поведения пользовательских процессов, а так­же взаимная защита ресурсов этих процессов. В процессоре Pentium к привилегированным командам относятся:

□ команды для работы с управляющими регистрами CRn, а также для загрузки регистров системных адресов GDTR, LDTR, IDTR и TR;

□ команда останова процессора HALT;

□ команды запрета/разрешения маскируемых аппаратных прерываний CLI/SLI;

□ команды ввода-вывода IN, INS, OUT, OUTS.

Первые две группы команд могут выполняться только при самом высшем уровне привилегий кода, то есть при CPL=0. Для двух последних групп команд, иногда называемых чувствительными, условия выполнения не требуют высшего уровня привилегий кода, а связаны с соотношением уровня привилегий ввода-вывода IOPL и уровня привилегий кода CPL — выполнение этих команд разрешено в том случае, если CPL <= IOPL.


  1. Средства поддержки сегментации памяти


Средства поддержки механизмов виртуальной памяти в процессоре Pentium по­зволяют отображать виртуальное адресное пространство на физическую память размером максимум в 4 Гбайт (этот максимум определяется использованием 32-разрядных адресов при работе с оперативной памятью).

Процессор может поддерживать как сегментную модель распределения памяти, так и сегментно-страничную. Средства сегментации образуют верхний уровень средств управления виртуальной памятью процессора Pentium, а средства стра­ничной организации — нижний уровень. Это означает, что сегментные средства работают всегда, а средства страничной организации могут быть, как включены, так и выключены путем установки однобитного признака РЕ (Paging Enable) в регистре CR0 процессора. В зависимости от того, включены ли средства стра­ничной организации, изменяется смысл процедуры преобразования адресов, которая выполняется средствами сегментации. Сначала рассмотрим случай работы средств сегментации при отключенном механизме управления страницами.


    1. Виртуальное адресное пространство


При работе процессора Pentium в сегментном режиме в распоряжении програм­миста имеется виртуальное адресное пространство, представляемое совокупно­стью сегментов.

Каждый сегмент виртуальной памяти процесса имеет описание, называемое де­скриптором сегмента. Дескриптор сегмента имеет размер 8 байт и содержит все характеристики сегмента, необходимые для проверки правильности доступа к нему и нахождения его в физическом адресном пространстве (рис. 3).



Рис. 3. Формат дескриптора сегмента данных или кода
Структура дескриптора, которая поддерживается в процессоре Pentium, сложилась исторически. Многое в ней связано с обеспечением совместимости с предыдущими процессорами семейства х86. Именно этим объясняется то, что базовый адрес сег­мента представлен в дескрипторе в виде трех частей, а размер сегмента занимает два поля.

Ниже перечислены основные поля дескриптора.

База — базовый адрес сегмента (32 бита).

Размер — размер сегмента (24 бита).

□ G (Granularity) — единица измерения размера сегмента, один бит. Если G=0, то размер задан в байтах и тогда сегмент не может быть больше 64 Кбайт, если 0=1, то размер сегмента измеряется в страницах по 4 Кбайт.

Байт доступа (5-й байт дескриптора) содержит информацию, которая исполь­зуется для принятия решения о возможности или невозможности обращения к данному сегменту. Бит Р (Present) определяет, находится ли соответствующий сегмент в данный момент в памяти (Р=1) или он выгружен на диск (Р=0). Поле DPL (Descriptor Privilege Level) содержит данные об уровне привиле­гий, необходимом для доступа к сегменту. Остальные пять битов байта досту­па зависят от типа сегмента и определяют способ, которым можно использо­вать данный сегмент (то есть читать, писать, выполнять). Различаются три основных типа сегментов:



  • сегмент данных;

  • кодовый сегмент;

  • системный сегмент (GDT, TSS и т. п.).

Дескрипторы сегментов объединяются в таблицы. Процессор Pentium для управ­ления памятью поддерживает два типа таблиц дескрипторов сегментов (Процессор Pentium поддерживает еще один тип таблицы дескрипторов — таблицу деск­рипторов прерываний (Interrupt Descriptor Table, IDT). Эта таблица используется систе­мой прерываний):

глобальная таблица дескрипторов (Global Descriptor Table, GDT), которая пред­назначена для описания сегментов операционной системы и общих сегментов для всех прикладных процессов, например сегментов межпроцессного взаи­модействия;

локальная таблица дескрипторов (Local Descriptor Table, LDT), которая содер­жит дескрипторы сегментов отдельного пользовательского процесса.

Таблица GDT одна, а таблиц LDT столько, сколько в системе выполняется задач (процессов). При этом в каждый момент времени операционной системой и аппа­ратными средствами процессора используется только одна из таблиц LDT, а имен­но та, которая соответствует выполняемому в данный момент пользователь­скому процессу. Таблица GDT описывает общую часть виртуального адресного пространства процессов, a LDT — индивидуальную часть для каждого процесса. Таблицы GDT и LDT размещены в оперативной памяти в виде отдельных сег­ментов. Сегменты LDT и GDT содержат системные данные, поэтому их дескрип­торы хранятся в таблице GDT. Таким образом, таблица GDT наряду с записями о других сегментах содержит запись о самой себе, а также обо всех таблицах LDT.

В каждый момент времени в специальных регистрах GDTR и LDTR хранится информация о местоположении и размерах глобальной таблицы GDT и актив­ной таблицы LDT соответственно. Регистр GDTR содержит 32-разрядный физи­ческий адрес начала сегмента GDT в памяти, а также 16-битный размер этого сегмента (рис. 4). Регистр LDTR указывает на расположение сегмента LDT в оперативной памяти косвенно — он содержит индекс дескриптора в таблице GDT, в котором содержится адрес таблицы LDT и ее размер.


32

6 байт 16

Базовый адрес в физической памяти сегмента GDT

Размер сегмента

в байтах

Рис. 4. Формат регистра GDTR

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

Селектор извлекается из одного из шести 16-разрядных сегментных регистров процессора (CS, SS, DS, ES, FS или GS) в зависимости от типа команды и стадии ее выполнения — выборки кода команды или данных. Например, при обращении к памяти во время выборки следующей команды используется селектор из сег­ментного регистра кода CS, а при записи результатов в сегмент данных процесса селекторы извлекаются из сегментных регистров данных DS или ES, если же данные записываются в стек по команде PUSH, то механизм виртуальной памяти извлекает селектор из сегментного регистра стека SS, и т. п.


Рис. 5. Формат селектора
Селектор состоит из трех полей (рис. 5):

индекса, который задает последовательный номер дескриптора в таблице GDT или LDT(13 бит);

указателя типа используемой таблицы дескрипторов: GDT или LDT (1 бит);

требуемого уровня привилегий — RPL (2 бита), это поле используется меха­низмом защиты данных, который будет рассмотрен ниже.

Виртуальное адресное пространство процесса складывается из всех сегментов, опи­санных в общей для всех процессов таблице GDT, и сегментов, описанных в его собственной таблице LDT. Разрядность поля индекса определяет максимальное число глобальных и локальных сегментов процесса — по 8 Кбайт (213) сегментов каждого типа, всего 16 Кбайт сегментов. С учетом максимального размера сег­мента — 4 Гбайт — каждый процесс при чисто сегментной организации вирту­альной памяти (без включения страничного механизма) может работать в вирту­альном адресном пространстве в 64 Тбайт.

Каждый дескриптор в таблицах GDT и LDT имеет размер 8 байт, поэтому мак­симальный размер каждой из этих таблиц — 64 Кбайт (8 байт × 8 Кбайт дескрип­торов).

Из приведенного описания видно, что процессор Pentium обеспечивает поддерж­ку работы ОС в двух отношениях:

□ поддерживает работу виртуальной памяти за счет быстрого аппаратного спо­соба преобразования виртуального адреса в физический;

□ обеспечивает защиту данных и кодов различных приложений.

    1. Преобразование адресов


Теперь проследим, каким образом виртуальное пространство в 64 Тбайт отобра­жается на физическое пространство размером в 4 Гбайт. Механизм отображения преобразовывает виртуальный адрес, который представлен селектором, находя­щимся в одном из сегментных регистров, и смещением, извлеченным из соответ­ствующего поля машинной инструкции, в линейный физический адрес.

Рис. 6. Механизм преобразования виртуального адреса в физический при работе процессора в сегментном режиме
Рассмотрим сначала случай, когда виртуальный адрес относится к одному из сег­ментов, дескрипторы которых содержатся в таблице GDT (рис. 6).

1. Значение селектора указывает механизму преобразования адресов, что вирту­альный адрес относится к сегменту, описываемому в таблице GDT. Местонахождение таблицы GDT система определяет из регистра GDTR, в котором хранится полный 32-битный базовый физический адрес таблицы. Процессор складывает базовый адрес таблицы, взятый из регистра GDTR, со сдвинутым на 3 разряда влево (умножение на 8 в соответствии с числом байтов в одном дескрипторе сегмента) значением поля индекса из селектора. Результатом яв­ляется физический адрес дескриптора сегмента, к которому относится задан­ный виртуальный адрес.

2. По вычисленному адресу процессор извлекает из памяти дескриптор нужного сегмента.

3. Выполняется проверка возможности выполнения заданной операции доступа по заданному виртуальному адресу:



  • сначала процессор определяет правильность адреса, сравнивая смещение, заданное в виртуальном адресе, с размером сегмента, извлеченным из ре­гистра LDTR (в случае выхода адреса за границы сегмента происходит прерывание);

  • затем процессор проверяет права доступа задачи к данному сегменту па­мяти;

  • далее проверяется наличие сегмента в физической памяти (если бит Р де­скриптора равен 0, то есть сегмент отсутствует в физической памяти, то происходит прерывание).

4. Если все три условия выполнены, то доступ по заданному виртуальному ад­ресу разрешен. Выполняется преобразование виртуального адреса в физиче­ский путем сложения базового адреса сегмента, извлеченного из дескриптора, и смещения, заданного в инструкции. Выполняется заданная операция над элементом физической памяти по этому адресу.

В случае, когда селектор в виртуальном адресе указывает не на таблицу GDT, a на таблицу LDT, процедура вычисления физического адреса несколько услож­няется. Это связано с тем, что регистр LDTR в отличие от GDTR указывает на размещение таблицы сегментов не прямо, а косвенно. В LDTR содержится ин­декс дескриптора сегмента LDT. Поэтому в процедуре преобразования адресов появляется дополнительный этап — определение базового адреса таблицы LDT. На основании базового адреса таблицы GDT, взятого из регистра GDTR, и селектора, взятого из регистра LDTR, вычисляется смещение в таблице GDT, ко­торое и является адресом дескриптора сегмента LDT.

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

Таким образом, для использования сегментного механизма процессора Pentium операционной системе необходимо сформировать таблицы GDT и LDT, загрузить их в память (для начала достаточно загрузить только таблицу GDT), загрузить указатели на эти таблицы в регистры GDTR и LDTR и выключить страничную поддержку.

Операционная система может отказаться от использования средств сегментации про­цессора Pentium, в таком случае ей достаточно назначить каждому процессу только по одному сегменту и занести в соответствующие таблицы LDT по одному дескрип­тору. Виртуальное адресное пространство задачи будет состоять из одного сегмента длиной максимум в 4 Гбайт. Поскольку выгрузка процессов на диск будет осуществ­ляться целиком, виртуальная память вырождается в таком частном случае в свопинг.

    1. Защита данных при сегментной организации памяти


Процессор Pentium при работе в сегментном режиме предоставляет операцион­ной системе следующие средства, направленные на обеспечение защиты процес­сов друг от друга.

□ Процессор Pentium поддерживает для каждого процесса отдельную таблицу дескрипторов сегментов LDT. Эта таблица формируется операционной систе­мой на этапе создания процесса. После активизации процесса в регистр LDTR заносится адрес (селектор) его таблицы LDT. Тем самым система делает не­доступным для процесса локальные сегменты других процессов, описанные в их таблицах LDT.

□ Вместе с тем таблица GDT, в которой хранятся дескрипторы сегментов опе­рационной системы, а также сегменты, используемые несколькими процесса­ми совместно, доступна всем процессам, а, следовательно, не защищена от их несанкционированного вмешательства. Для решения этой проблемы в процес­соре Pentium предусмотрена поддержка системы безопасности па основе при­вилегий. Каждый сегмент памяти наделяется атрибутами безопасности, кото­рые характеризуют степень защищенности данного сегмента. Процессы также наделяются атрибутами безопасности, которые в этом случае характеризуют степень привилегированности процесса. Уровень привилегий процесса опре­деляется уровнем привилегий его кодового сегмента. Доступ к сегменту регу­лируется в зависимости от его защищенности и уровня привилегированности запроса. Это позволяет защитить от несанкционированного доступа сегменты GDT, а также обеспечить дифференцированный доступ к локальным сегмен­там процесса.

□ Само по себе наличие отдельных таблиц дескрипторов для каждого процесса еще не обеспечивает надежной защиты процессов друг от друга. Действитель­но, что мешает одному пользовательскому процессу изменить содержимое регистра LDTR так, чтобы он указывал на таблицу другого процесса? Анало­гично никакие значения атрибутов безопасности не смогут защитить от не­санкционированного доступа сегменты, описанные в таблице GDT, если про­цесс имеет возможность по своей инициативе устанавливать желаемый уровень привилегий для себя. Поэтому необходимым элементом защиты является на­личие аппаратных ограничений в наборе инструкций, разрешенных для выпол­нения процессу. Некоторые инструкции, имеющие критически важное значение для функционирования системы, такие, например, как останов процессора, загрузка регистра GDTR, загрузка регистра LDTR, являются привилегиро­ванными как раз по этой причине — процесс может выполнять их, только об­ладая наивысшим уровнем привилегий.

□ Еще одним механизмом защиты, поддерживаемым в процессоре Pentium, яв­ляется ограничение на способ использования сегмента. В зависимости от того, к какому типу относится сегмент — сегмент данных, кодовый сегмент или системный сегмент, — некоторые действия по отношению к нему могут быть запрещены. Например, в кодовый сегмент нельзя записывать какие-либо дан­ные, а сегменту данных нельзя передать управление, даже если загрузить его селектор в регистр CS.

В процессоре Pentium используется мандатный способ определения прав досту­па к сегментам памяти (называемый также механизмом колец защиты), при ко­тором имеется несколько уровней привилегий и объекты каждого уровня имеют доступ ко всем объектам равного уровня или более низких уровней, но не имеют доступа к объектам более высоких уровней. В процессоре Pentium существует четыре уровня привилегий — от нулевого, который является самым высоким, до третьего — самого низкого (рис. 7). Очевидно, что операционная система может использовать механизм колец защиты по своему усмотрению. Однако предполагается, что нулевой уровень доступен для ядра операционной системы, третий уровень — для прикладных программ, а промежуточные уровни — для утилит и подсистем операционной системы, менее привилегированных, чем ядро.



Рис. 7. Кольца защиты
Система защиты манипулирует несколькими переменными, характеризующими уровень привилегий:

□ DPL (Descriptor Privilege Level) — уровень привилегий дескриптора, задается полем DPL в дескрипторе сегмента;

□ RPL (Requested Privilege Level) — запрашиваемый уровень привилегий, зада­ется полем RPL селектора сегмента;

□ CPL (Current Privilege Level) — текущий уровень привилегий выполняемого кода, задается полем RPL селектора кодового сегмента;

□ EPL (Effective Privilege Level) — эффективный уровень привилегий запроса.

Под запросом здесь понимается любое обращение к памяти независимо от того, произошло ли оно при выполнении кода, оформленного в виде процесса, или вне рамок процесса, как это бывает при выполнении кодов операционной системы.

Поле уровня привилегий является частью двух информационных структур — де­скриптора и селектора. В том и другом случае оно задается двумя битами: 00, 01, 10 и 11, характеризуя четыре степени привилегированности, от самой низкой 11 до самой высокой 00.

Уровни привилегий назначаются дескрипторам и селекторам. Во время загрузки операционной системы в память, а также при создании новых процессов опера­ционная система назначает процессу сегменты кода и данных, генерирует деск­рипторы этих сегментов и помещает их в таблицы GDT или LDT. Конкретные значения уровней привилегий DPL и RPL задаются операционной системой и транслятором либо по умолчанию, либо на основании указаний программиста. Значения DPL и RPL определяют возможности создаваемого процесса.

Уровень привилегий дескриптора DPL является в некотором смысле первичной характеристикой, которая «переносится» на соответствующие сегменты и запро­сы. Сегмент обладает тем уровнем привилегий, который записан в поле DPL его дескриптора. DPL определяет степень защищенности сегмента. Уровень приви­легий сегмента данных учитывается системой защиты, когда она принимает решения о возможности выполнения для этого сегмента чтения или записи. Уровень привилегий кодового сегмента используется системой защиты при про­верке возможности чтения или выполнения кода для данного сегмента.

Уровень привилегий кодового сегмента определяет не только степень защищен­ности этого сегмента, но и текущий уровень привилегий CPL всех запросов к па­мяти (на чтение, запись или выполнение), которые возникнут при выполнении этого кодового сегмента. Другими словами, уровень привилегий кодового сег­мента DPL характеризует текущий уровень привилегий CPL выполняемого ко­да. При запуске кода на выполнение значение DPL из дескриптора копируется в поле RPL селектора кодового сегмента, загружаемого в регистр сегмента ко­манд CS. Значение поля RPL кодового сегмента, собственно, и является теку­щим уровнем привилегий выполняемого кода, то есть уровнем CPL.

От того, какой уровень привилегий имеет выполняемый код, зависят не только возможности его доступа к сегментам и дескрипторам, но и разрешенный ему на­бор инструкций.

Во время приостановки процесса его текущий уровень привилегий сохраняется в контексте, роль которого в процессоре Pentium играет системный сегмент со­стояния задачи (Task State Segment, TSS). Если какой-либо процесс имеет несколь­ко кодовых сегментов с разными уровнями привилегий, то поле RPL регистра CS позволяет узнать значение текущего уровня привилегий процесса. Пользовательский процесс не может изменить значение поля привилегий в дескрипторе, так как необходимые для этого инструкции ему недоступны. В даль­нейшем уровень привилегий процесса может измениться только в случае переда­чи управления другому кодовому сегменту путем использования особого деск­риптора — шлюза.



Контроль доступа процесса к сегментам данных осуществляется на основе со­поставления эффективного уровня привилегий EPL запроса и уровня приви­легий DPL дескриптора сегмента данных. Эффективный уровень привилегий учитывает не только значение CPL, но и значение запрашиваемого уровня при­вилегий для конкретного сегмента, к которому выполняется обращение. Перед тем как обратиться к сегменту данных, выполняемый код загружает селектор, указывающий на этот сегмент, в один из регистров сегментов данных: DS, ES, FS или GS. Значение поля RPL данного селектора задает уровень запрашиваемых привилегий. Эффективный уровень привилегий выполняемого кода EPL опре­деляется как максимальное (то есть худшее) из значений текущего и запраши­ваемого уровней привилегий:

EPL=max{CPL,RPL}

Выполняемый код может получить доступ к сегменту данных для операций чте­ния или записи, если его эффективный уровень привилегий не ниже (а в ариф­метическом смысле «не больше») уровня привилегий дескриптора этого сегмента:



max{CPL.RPL} < DPL

Уровень привилегий дескриптора DPL определяет степень защищенности сег­мента. Значение DPL говорит о том, каким эффективным уровнем привилегий должен обладать запрос, чтобы получить доступ к данному сегменту. Например, если дескриптор имеет DPL=2, то к нему разрешено обращаться всем процессам, имеющим уровень привилегий EPL, равный 0, 1 или 2, а для процессов с EPL, равным 3, доступ запрещен.


ПРИМЕЧАНИЕ--------------------------------------------

Существует принципиальное различие в использовании полей RPL в селекторах, указывающих на кодовые сегменты и сегменты данных. Содержимое поля RPL из селектора, загруженного в регистр CS кодового сегмента, характеризует текущий уровень привилегий CPL выполняемого из этого сегмента кода; значение его никак не связано с сегментами данных, к которым может происходить обращение из этого кодового сегмента. Содержи­мое поля RPL из селектора, загруженного в один из регистров — DS, ES, FS или GS — сег­ментов данных, определяет некую «поправку» к текущему уровню привилегий выполняе­мого кода, вносимую при доступе к сегменту данных, на который указывает этот селектор.


Правило вычисления эффективного уровня привилегий показывает, что он не может быть выше уровня привилегий кодового сегмента. Поэтому загрузка в ре­гистр DS (или любой другой сегментный регистр данных) селектора с высоким уровнем привилегий (например, с RPL = 0) при низком значении уровня CPL (например, 3) ничего нового не даст — если сегмент данных, на который указы­вает DS, имеет высокий уровень привилегий (например, 1), то в доступе к нему будет отказано (так как EPL будет равен max {3,0}, то есть 3). По этой причине команды загрузки сегментных регистров не являются привилегированными.

Если запрос обращен к сегменту данных, обладающему более высоким, чем EPL, уровнем привилегий, то происходит прерывание.

Задавая в поле RPL селекторов, ссылающихся на сегменты данных, различные значения, программист может управлять доступом выполняемого кода к этим сегментам. Так, при RPL=0 эффективный уровень привилегий будет всецело определяться только текущим уровнем привилегий CPL. А если поместить в се­лектор RPL=3, то это означает снижение эффективного уровня привилегий до самого низкого значения, при котором процессу разрешен доступ только к наи­менее защищенным сегментам с DPL=3.

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

Контроль доступа процесса к кодовому сегменту производится путем сопостав­ления уровня привилегий дескриптора этого кодового сегмента DPL с текущим уровнем привилегий выполняемого кода CPL. В зависимости от того, какой спо­соб обращения к кодовому сегменту используется, выполняется внутрисегмент­ная или межсегментная передача управления, вызывается подчиненный или не­подчиненный сегмент — по-разному формулируются правила контроля доступа

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



Рис. 8. Признаки, задающие тип сегмента и права доступа
Способ, с помощью которого разрешено осуществлять доступ к сегменту того или иного типа, определяется несколькими битами байта доступа дескриптора сегмента. Как уже было сказано, старший, седьмой бит байта доступа является признаком Р присутствия сегмента в памяти, а шестой и пятый биты отведены для хранения уровня привилегий DPL. На рис. 8 показаны оставшиеся пять битов байта доступа, смысл которых зависит от типа сегмента.

Поле S занимает 1 бит и определяет, является ли сегмент системным (S=0) или сегментом кода или данных (S=l).

Системные сегменты предназначены для хранения служебной информации опе­рационной системы. Примерами системных сегментов являются сегменты, хра­нящие таблицы LDT, или рассматриваемые ниже сегменты состояния задачи TSS. Конкретный тип системного сегмента указывается в четырех младших битах бай­та доступа, например, если это поле содержит значение 2, это означает, что дан­ный дескриптор описывает сегмент LDT.

Признак Е позволяет отличить сегмент данных (Е=0) от сегмента кода (Е=1). Для сегмента данных определяются следующие поля:

□ ED (Expand Down) — направления распространения сегмента (ED=O для обыч­ного сегмента данных, распространяющегося в сторону увеличения адресов, ED=1 для стекового сегмента данных, распространяющегося в сторону умень­шения адресов);

□ W (Writeable) — бит разрешения записи в сегмент (при W=l запись разрешена, при W=0 — запрещена);

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

Если признак W запрещает запись в сегмент данных, то разрешается только чте­ние сегмента. Выполнение сегмента данных запрещено всегда, независимо от значения признака W.

Для сегмента кода используются следующие признаки:

□ С (Conforming) — бит подчинения, определяет возможность вызова кода на выполнение из других сегментов; при С=1 (подчиненный сегмент) сегмент может выполняться в том случае, если текущий уровень привилегий вызываю­щего процесса CPL не выше уровня привилегий DPL данного кодового сегмен­та, то есть в арифметическом смысле CPL > DPL; после передачи управления новый кодовый сегмент начинает выполняться с уровнем привилегий вызвав­шего сегмента, то есть с более низкими или теми же привилегиями; при С=0 (неподчиненный сегмент) код может быть выполнен только при CPL=DPL;

□ R (Readable) — бит разрешения (R=l) или запрета (R=0) чтения из кодового сегмента;

□ A (Accessed) — признак обращения, имеет смысл, аналогичный полю А сегмен­та данных.

Если признак R запрещает чтение кодового сегмента, то разрешается только его выполнение. Запись в кодовый сегмент запрещена всегда, независимо от значе­ния признака R.

Выполнение многих операций в процессоре Pentium сопровождается проверкой их допустимости для данного типа сегмента. Первый этап проверки выполняется при загрузке селекторов в сегментные регистры. Так, диагностируется ошибка, если в сегментный регистр CS загружается селектор, ссылающийся на дескрип­тор сегмента данных, и наоборот, если в регистр сегмента данных DS загружает­ся селектор, указывающий на дескриптор кодового сегмента. Ошибка возникает также, если в регистр стекового сегмента загружается селектор, ссылающийся на дескриптор сегмента данных, который допускает только чтение.

Вторым этапом является проверка ссылок операндов во время выполнения ко­манд записи или чтения. Прерывания происходят в следующих случаях:

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

□ делается попытка записать данные по адресу, принадлежащему кодовому сег­менту;

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

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


  1. следующая страница >>