Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Организация вычислительных систем на базе микропроцессоров с архитектурой x86. Учебное пособие
.pdf
31
CS
Селектор
Резерв
Базовый адрес
Размер
Доступ
SS
Селектор
Резерв
Базовый адрес
Размер
Доступ
ES
Селектор
Резерв
Базовый адрес
Размер
Доступ
DS
Селектор
Резерв
Базовый адрес
Размер
Доступ
INDEX
TI RPL
15 3 2 1 0
Поле IOPL – уровень привилегий ввода/вывода. Показывает наивысшее значение текущего уровня привилегий программы CPL, позволяющее выполнять операции ввода/вывода, не приводя к обработке соответствующего прерывания. Это поле задает также наивысшее значение
CPL, которое позволяет изменять бит IF (разрешение маскируемых пребываний).
В зависимости от режима работы изменяется назначение сегментных
регистров DS, ES, SS, CS. В реальном режиме они служат для хранения базовых адресов соответствующих сегментов. В защищенном режиме эти регистры содержат значения селекторов сегментов.
Селекторы указывают на текущие адресуемые сегменты памяти. С
ними связаны программно-недоступные регистры дескрипторов сегментов
(см. рис. 3.3).
15 0 15 0 23 0 15 0 7 0
63 48 47 24 23 8 7 0
Регистр сегментов Регистр дескрипторов
Рис. 3.3
Каждый дескриптор относится только к одному сегменту и описывает: физический базовый адрес сегмента; размер (предел) сегмента, который
может быть от 1 байта до 64 КБ; права доступа к сегменту.
В байте прав доступа (доступ) задаются биты и поля, которые определяют: наличие соответствующего сегмента в ОП; уровень привилегий
дескриптора сегмента; роль дескриптора в системе; тип дескриптора. Оставшиеся 16 разрядов (резерв) зарезервированы под 32-разрядный защищенный режим (х86/32).
Дескрипторы сегментов организуются в дескрипторные таблицы: локальную дескрипторную таблицу LDT и глобальную дескрипторную таблицу GDT. Эти таблицы хранятся в памяти.
Обращение к необходимому дескриптору осуществляется с помощью селектора. Селектор, хранящийся в одном из сегментных регистров,
имеет структуру, приведенную на рис. 3.4.
Поле RPL – уровень привилегий инициатора запроса.
Рис. 3.4

32
GDTR
База GDT
Размер GDTR
IDTR
База IDT
Размер IDTR
15 0
MSW
15 0
23 0 15 0
7 0
LDTR
Селектор База LDT
Размер LDT
Доступ
TR
Селектор База TSS
Размер TSS
Доступ
…….
Конец сегмента
…….
Адресуемая ЯП
…….
Начало сегмента
База
Размер
Доступ
Дескриптор
Сегмент
Селектор
Смещение
ФА ЯП
ОП
15 0 15 0
Бит TI – индикатор таблицы. Определяет, какая из таблиц - LDT (при
TI=0) или GDT (при TI=1) - используется.
Поле INDEX задает номер для выбора одного из дескрипторов, со-
держащихся в таблице.
При загрузке нового селектора в сегментный регистр соответствующий дескриптор из памяти автоматически загружается в регистр дескрипторов. Такие регистры являются кэшированными.
В защищенном режиме, так же как и в реальном, физический адрес
(ФА) ячейки памяти (ЯП) определяется путем сложения базового адреса
(базы) сегмента и смещения от этого адреса. Но логический адрес представляется в другом виде: селектор: смещение.
При таком задании логического адреса формирование физического
адреса будет осуществляться по схеме, приведенной на рис. 3.5.
Рис. 3.5
3.2.2. Системные регистры
При работе в защищенном режиме в МП используются следующие
системные регистры: GDTR, IDTR, MSW, TR, LDTR.
Структура регистров приведена на рис. 3.6.
23 0 15 0
Рис. 3.6

33
15 4 3 2 1 0
Резерв Intel
TS
EM
MP
PE
Рассмотрим назначение этих регистров.
Регистр глобальной дескрипторной таблицы GDTR содержит ин-
формацию о местонахождении таблицы GDT. Эта таблица определяет
глобальную часть виртуальной памяти (0,5 ГБ), доступную задаче, выполняемой МП в защищенном 16-разрядном режиме.
Регистр дескрипторной таблицы прерываний IDTR адресует таблицу
точек входа обработки прерываний (256 отдельных процедур обработки
прерываний).
Слово состояния машины MSW. Этот регистр используется только в
16-разрядном защищенном режиме. В других режимах MSW входит в состав одного из регистров управления. MSW содержит информацию о конфигурации МП и его общем состоянии. Формат регистра показан на рис.
3.7.
Рис. 3.7
РЕ – бит разрешения защиты. При РЕ =1 осуществляется инициализация защищенного режима.
МР – бит мониторинга сопроцессора. Показывает присутствие сопроцессора I80287.
ЕМ – бит эмуляция микропроцессора. Установка этого разряда позволяет осуществлять программную эмуляцию математического СП.
TS – бит «задача переключена». Относится к переключению задачи и
сопроцессору. Показывает, соответствует ли содержимое математического
сопроцессора контексту текущей задачи.
Регистр задачи TR содержит информацию о сегменте состояния задачи TSS, где TSS – это специальный сегмент памяти, в котором сохраняется содержимое текущей задачи при переключении задач.
Регистр локальный дескрипторной таблицы LDTR адресует локальную дескрипторную таблицу LDT для текущей задачи. Эта таблица определяет локальную часть виртуальной памяти (0,5 ГБ), доступную только
текущей задаче.
Системные регистры рассмотрены в той последовательности, в которой они инициализируются при переводе МП из реального режима в защищенный 16-разрядный режим.
3.3. Управление памятью МПС в защищенном
шестнадцатиразрядном режиме
В этом режиме МП позволяет задаче полагать, что она имеет доступ
к адресному проcтранству оперативной памяти объемом 1 ГБ. Для управления этим пространством предназначено адресное устройство.

34
15 8
7 0
Резерв
Права доступа
Базовый
сегмента
адрес
Размер сегмента
Благодаря адресному устройству сегменты кода и данных можно
хранить не во внутренней (оперативной) памяти, а на жестком диске до тех
пор, пока они не потребуются для выполнения задачи.
Адресное устройство опирается на таблицы дескрипторов LDT и
GDT. Они содержат по одному дескриптору для каждого имеющегося в
памяти сегмента кода или данных. Формат такого несистемного дескриптора (в стиле МП I80286) имеет вид, представленный на рис. 3.8.
Рис. 3.8
Рассмотрим, как определяется размер виртуального адресного пространства. Предельное количество сегментов, которое может использоваться одной задачей, определяется величиной поля INDEX селектора
(разряды 3…15). Следовательно, размер виртуального адресного пространства одной задачи будет составлять 213 216=229 или 0,5 ГБ для глобальной
памяти и столько же для локальной памяти. Таким образом, общее пространство памяти для одной задачи составит 1 ГБ.
Управление памятью прозрачно для прикладных программ, т.е. на их
работу не влияет то, что часть кодов или данных может храниться во
внешней памяти. МП автоматически вызывает диспетчер программ ОС,
когда сегмент виртуального пространства нужно передать из внешней памяти во внутреннюю. Наличие сегмента физической памяти указывает бит
присутствия Р в байте прав доступа.
Рассмотрим, как осуществляется первоначальный доступ к сегменту.
Когда задаче необходимо обратиться к ячейке памяти, расположенной вне
пределов текущего сегмента, то для выбора дескриптора виртуального
сегмента используется значение селектора. Значение поля TI селектора
указывает, какая таблица будет использоваться - LDT или GDT.
Рассмотрим сначала случай использования GDT (TI=1). Для того
чтобы МП мог найти в физической памяти GDT, ее начальный адрес и
размер хранятся в регистре GDTR. Для извлечения нужного дескриптора
из таблицы МП складывает базовый адрес таблицы GDT из регистра
GDTR со сдвинутым на 3 разряда влево значением поля INDEX селектора
(такой сдвиг соответствует умножению на 8, так как дескриптор занимает
8 байт). Таким образом, получается физический адрес нужного дескриптора в оперативной памяти. МП извлекает по этому адресу информацию о
сегменте и заносит ее во внутренний регистр дескрипторов, связанных с
рассматриваемым селектором.

35
INDEX
1
RPL
Базовый адрес GDT
Размер GDT
Конец GDT
…
Дескриптор
сегмента
…
Начало GDT
- 0 -
Базовый адрес
Размер
Доступ
GDTR
Рг дескрипторов
15 0
23 0
15 0
Селектор
ФА дескриптора
сегмента
GDT (ОП)
000
Схематично этот процесс может представить так, как показано на
рис. 3.9.
Рис. 3.9
Далее проверяется законность доступа к виртуальному сегменту. Ес-
ли уровень привилегий селектора поля RPL (CPL для регистра CS) выше
или равен уровню привилегий дескриптора сегмента (поля DPL байта прав
доступа), то доступ считается законным. В противном случае происходит
прерывание. Затем проверяется наличие сегмента в физической памяти по
значению бита Р в том же байте доступа. Если сегмент отсутствует, то
происходит прерывание. При наличии сегмента в памяти вычисляется физический адрес ячейки памяти путем сложения базы сегмента и смещения.
В случае когда селектор указывает на таблицу LDT, т.е. бит TI=0,
виртуальный адрес преобразуется в физический аналогичным образом, но
для доступа к таблице LDT добавляется еще один этап. Он связан с тем,
что регистр LDTR указывает на размещение таблицы LDT не прямо, а косвенно. Сам LDTR имеет размер шестнадцать бит и содержит селектор дескриптора таблицы GDT. Дескриптор описывает расположение LDT рассматриваемой задачи в физической памяти. Поэтому при доступе к ячейке
памяти через таблицу LDT происходит двукратное преобразование виртуальных адресов в физические. Схема этого процесса в целом показана на
рис. 3.10.
Рассмотренные выше действия МП выполняет в случае, когда изменяется адресуемый сегмент памяти. Если используется текущий сегмент,
информация о его расположении выбирается непосредственно из регистра
дескрипторов.

36
INDEX
1
RPL
15 0
Cелектор
ФА дескриптора
_ LDT
000
Размер GDT
23 0
База GDT
LDTR GDTR
Cелектор
15 0
Доступ
Конец GDT
…
Дескриптор
LDT
Начало GDT
…
GDT (ОП)
LDT (ОП)
Размер GDT
Базовый адрес LDT
Доступ
Конец LDT
…
Дескриптор
сегмента
Начало LDT
...
ФА дескриптора
сегмента
Регистр дескрипторов
Размер сегмента
Базовый адрес
Резерв
000
Рис. 3.10
3.4. Организация защиты в микропроцессоре
Для защиты информации, хранящейся в сегментах памяти, использу-
ется система привилегий. Привилегии – это свойство, которое определяет,
какие операции разрешаются МП и какие доступы к памяти законны при
выполнении текущей задачи. Уровень привилегий PL изменяется от нуля
до трех, т.е. PL=00, 01, 10, 11. Нулевой уровень считается самым высшим,
третий – самым низшим.
Нулевой уровень присваивается сегментам памяти, где располагает-
ся ядро операционной системы (ОС), обеспечивающее инициализацию работы, диспетчеризацию памяти, реализацию командного процессора. Первый уровень присваивается утилитам ОС (системному сервису), второй
уровень – расширениям ОС (драйверам внешних устройств), а также сис-

37
темам управления базами данных, подсистемам программирования, третий
уровень – прикладным программам.
В соответствии с уровнями привилегий, а значит и защищенности,
установлены следующие основные правила доступа для сегментов кода и
данных.
Правило 1. Данные из сегмента, имеющего уровень привилегий (защиты) PL, могут быть выбраны программой, имеющей такой же или более
высокий уровень привилегий.
Правило 2. Сегмент программы (процедура), имеющий уровень привилегий (защиты) PL, может быть вызван программой, имеющей такой же
или более низкий уровень привилегий.
Уровни защиты и привилегий определяются двумя битами, значение
которых указывает номер кольца защиты или уровня привилегий. В зависимости от их месторасположения эти биты имеют различное назначение.
RPL – уровень привилегий запросов. Он определяет уровни привилегий инициатора запроса к дескриптору сегмента данных и задается двумя
младшими битами селектора, хранящимися в одном из сегментных регистров SS, DS, ES.
DPL – уровень привилегий дескриптора. Определяет наименьший
уровень, на котором задача может получить доступ к данному дескриптору
и связанному с ним сегменту. Находится в байте прав доступа.
CPL – текущий уровень привилегий. Определяет уровень привилегий
выполняемого в настоящий момент сегмента кода. Задается двумя младшими битами селектора, хранящимися в сегментном регистре СS.
IOPL – уровень привилегий ввода/вывода. Поле расположено в регистре флагов и определяет способ обращения к внешним устройствам и
возможность обработки прерываний.
Основные средства защиты сегмента памяти связаны с полем «Размер сегмента» и байтом прав доступа дескриптора. Рассмотрим подробнее
содержимое байта прав доступа. В зависимости от назначения сегмента
этот байт может иметь разные форматы. Однако ряд полей и битов у него
является одинаковым.
Р - бит присутствия. Определяет наличие соответствующего сегмен-
та в ОП.
DPL - уровень привилегий дескриптора.
S - системный бит. Определяет роль выбираемого дескриптора в сис-
теме. При S=1 дескриптор обеспечивает обращение к сегменту данных и
кодов, при S=0 дескрипторы служат для обращения к таблице LDT, сегменту состояния задачи TSS и шлюзам (вентилям) для входа в другие задачи или программы, включая программы обслуживания прерываний. Такие дескрипторы называются системными.
Оставшиеся поля определяют тип дескриптора. Поэтому обобщенный формат байта прав доступа имеет следующий вид (рис. 3.11).

38
P
DPL
1
E
7 6
5 3 0
4
C R A
2
1
P
DPL
1 E ED W A
Для сегмента данных
Для сегмента кода
P
DPL
S
7 6 5 4 3 0
Тип
Форматы байтов прав доступа дескрипторов кода и данных приведе-
ны на рис. 3.12.
Рис. 3.11
Рис. 3.12
Общими у этих форматов являются биты Е и А, где Е – бит выполняемости. Если Е=0, то это байт сегмента данных, если Е=1 – байт сегмента кода. Бит обращения A устанавливается в 1 при обращении к сегменту.
ОС, реализующие виртуальную память на уровне сегментов, могут следить
за частотой исполнения сегмента путем периодической проверки и очистки этого бита.
Назначение битов 1 и 2 зависит от типа сегмента. Биты R и С вводятся для сегмента кодов.
R – бит разрешения считывания. При R=1 разрешается производить
считывание содержимого соответствующего сегмента. При R=0 допускается только выборка содержимого этого сегмента для выполнения через
регистр CS. Попытка считывания в этом случае вызовет соответствующее
прерывание, как и попытка записи в сегмент кода. Причем последнее прерывание возникает независимо от значения R.
С – бит согласования (подчинения). Определяет дополнительное
правило обращения, которое обеспечивает защиту сегментов кода. При
С=1 сегмент подчиняется правилу 2, а при С=0 - нет.
Биты W и ED вводятся для сегмента данных.
W – бит разрешения записи. Разрешает при W=1 или запрещает при
W=0 изменение содержимого этих сегментов. При W=0 разрешается толь-
ко считывание данных. При попытке записи производится прерывание.
ЕD – бит направления расширения. Определяет порядок размещения
информации в сегменте данных. При ЕD=0 (расширение вверх) данные
размещаются в направлении возрастания адресов, а при ЕD=1 (расширение
вниз) данные располагаются в направлении уменьшения адресов, что характерно для сегмента стека.
Байт доступа (рис. 3.11) для системного дескриптора имеет S=1.
Можно выделить три основных класса системных дескрипторов: дескриптор LDT обеспечивает обращение к локальной дескрипторной таблице для

39
выбора сегментов, используемых при выполнении текущей задачи; дескриптор сегмента TSS используется при переключении задач в многозадачном режиме; дескриптор шлюза используется для обращения к программам и задачам, а также при обработке прерываний и исключений.
Аспекты защиты. Защита на уровне сегментов может осуществ-
ляться по семи аспектам. Рассмотрим наиболее важные из этих аспектов.
1. Проверка поля ТИП байта прав доступа. Известно, что это поле
различно для дескрипторов разного формата и определяет желаемый способ использования сегмента. МП проверяет информацию о типе в двух
случаях: а) если команда явно или неявно обращается к сегментному регистру; б) если селектор дескриптора загружается в сегментный регистр.
2. Проверка границы сегмента. Контроль размера сегмента действует всегда, гарантируя, что все обращения к памяти физически находятся в
пределах сегмента. В каждом цикле чтения или записи смещение сравнивается со значением в поле Размер дескриптора сегмента. Контроль границ
физически защищает соседние сегменты от нежелательных взаимодействий и искажений.
3. Ограничение доступа к данным. Перед тем как МП сможет адресовать операнды в памяти, он загружает селектор сегмента данных в один
из сегментных регистров DS или ES. Затем МП сравнивает уровень привилегий для того, чтобы оценить возможность доступа к этим данным. В эту
проверку входят три различных уровня привилегий: CPL (текущий уровень привилегий), DPL (уровень привилегий дескриптора) и RPL (уровень
привилегий инициатора запроса).
Командам разрешается загружать регистр сегмента данных и полу-
чать доступ к соответствующему сегменту только в том случае, если выполняется условие: DPLmax (CPL, RPL). Этот механизм предотвращает
чтение или изменение таблиц операционной системы прикладными программами. Для сегмента стека SS должно выполняться правило
DPL = CPL = RPL при условии, что в байте доступа бит W=1.
4. Ограничение точек входа в процедуру. Межсегментная передача
управления в микропроцессорах реализуется при выполнении команд перехода JMP, вызова CALL, возврата RET, прерывания INT и возврата из
прерывания IRET.
Правила обращения к сегментам кодов зависят от значения бита
подчиненности C в байте доступа дескриптора. Обращение к подчиненным
сегментам (C=1) допускается только из программ, имеющих такой же или
более низкий уровень привилегий, т.е. CPL≥DPL. При такой передаче значение CPL сохраняется, то есть сохраняется уровень исходной (вызывающей) программы. Обращение к неподчиненным сегментам кода, т.е.
имеющим C=0, допускается, только когда CPL равен DPL сегмента.
Кроме того, предусмотрен механизм вызова сегментов программ с
более высоким, чем текущий, уровнем привилегий. Это осуществляется

40
Вызываемая программа (С=0)
Шлюз
Текущая программа (CALL)
Уровень 0
Уровень 1
Уровень 2
Уровень 3
CPL≥DPL шлюза
15 8
7 0
- 0 -
Доступ
000 Счетчик
Селектор
Смещение
командой CALL с использованием специально установленных точек входа,
которые называются шлюзами вызова. В этом случае менее привилегированная процедура может вызвать более привилегированную, обращаясь к
ней через дескрипторы шлюза вызова, определяющие доступную точку
входа. Этот процесс показан на рис. 3.13.
Рис. 3.13
Этот способ позволяет прикладным программам обращаться за об-
служиванием к ОС. При этом есть доступ только к определенным процедурам, для которых введены шлюзы. Для вызова более привилегированной
программы команда CALL должна обратиться к хранящемуся в LDT дескриптору шлюза вызова, формат которого показан на рис 3.14, где в поле
ТИП байта доступа установлен код 0100. В поле Счетчик указывается количество параметров (от нуля до тридцати одного), которые переносятся
из стека текущей программы в стек вызываемой программы.
Рис. 3.14
После вызова командой CALL дескриптора шлюза в регистр CS загружается селектор. Этот селектор из LDT выбирает дескриптор вызываемого сегмента программы. В указатель команд IP загружается смещение.
Микропроцессор начинает выполнять вызываемую программу с адреса,
равного сумме базы из дескриптора сегмента кода CS и смещения. Схематично процесс вызова процедуры Progr_A представлен на рис. 3.15.
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
