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

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

53
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
Рис. 4.10
4.4. Организация защиты в микропроцессоре
Для защиты информации, хранящейся в сегментах памяти, используется система привилегий. Привилегии – это свойство, которое определяет,
какие операции разрешаются МП и какие доступы к памяти законны при
выполнении текущей задачи. Уровень привилегий PL изменяется от нуля
до трех, т.е. PL=00, 01, 10, 11. Нулевой уровень считается самым высшим,
третий – самым низшим.
Нулевой уровень присваивается сегментам памяти, где располагается ядро операционной системы (ОС), обеспечивающее инициализацию работы, диспетчеризацию памяти, реализацию командного процессора. Первый уровень присваивается утилитам ОС (системному сервису), второй
уровень – расширениям ОС (драйверам внешних устройств), а также сис-

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

55
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
Тип
Форматы байтов прав доступа дескрипторов кода и данных приведены на рис. 4.12.
Рис. 4.11
Рис. 4.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 (расширение
вниз) данные располагаются в направлении уменьшения адресов, что характерно для сегмента стека.
Байт доступа (рис. 4.11) для системного дескриптора имеет S=1.
Можно выделить три основных класса системных дескрипторов: дескриптор LDT обеспечивает обращение к локальной дескрипторной таблице для

56
выбора сегментов, используемых при выполнении текущей задачи; дескриптор сегмента 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 сегмента.
Кроме того, предусмотрен механизм вызова сегментов программ с
более высоким, чем текущий, уровнем привилегий. Это осуществляется

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

58
Дескриптор шлюза
вызова (LDT)
- 0 -
Доступ
Счетчик
Селектор
Смещение
CALL Progr_A
Регистр CS
Дескриптор сегмента
кода (LDT)
ОП
Конец сегмента
…
Начальный адрес
Progr_A
Регистр IP
- 0 -
Доступ
Базовый
адрес сегмента
Размер
…
Начало сегмента
Рис. 4.15
5. Ограничение набора команд. Определенные команды могут влиять
на механизм защиты и вмешиваться в обычный порядок работы системы.
Поэтому такие команды могут исполняться только процедурами с достаточно высоким уровнем привилегий. МП с архитектурой х86 имеют два
класса команд ограниченного применения: привилегированные команды и
чувствительные команды. Первые могут выполняться, только когда уровень CPL=0, иначе возникает прерывание. Такими командами являются загрузка регистров дескрипторных таблиц LDTR, GDTR, IDTR, загрузка регистра задач TR, слова состояния машины MSW и другие.
Ко второму классу относятся команды ввода/вывода IN, OUT, INS,
OUTS. Они работают с периферийными устройствами, которые должны
координироваться ОС. Сюда же относятся команды разрешения/запрещения прерывания, определяющие восприятие микропроцессором маскируемых аппаратных запросов на обслуживание. Уровень, на котором программы могут выполнять чувствительные команды, задается полем IOPL регистра флагов. Изменение значения поля IOPL возможно только на уровне CPL=0 привилегированной командой.
4.5. Мультизадачность и переключение задач
Процесс выполнения нескольких задач называется мультизадачностью. МП с архитектурой х86 в любой момент времени выполняет только
одну задачу, которая является активной, остальные пассивные.

59
Переход от одной задачи к другой называется переключением задач.
Он включает в себя смену контекста или состояния задачи, куда относятся
все элементы, которые изменяются при переходе к другой задаче (в основном - содержимое регистров). При переключении задач всегда сохраняется
состояние уходящей задачи, затем загружается состояние приходящей задачи и начинается ее выполнение.
Имеются аппаратные и программные причины переключения задач.
Задача, которая начинает выполняться в результате прерывания, называется планируемой аппаратно. Задача, которая начинает выполняться по требованию ОС, - планируемой программно. Пользовательские задачи планируются программно, обслуживание периферийных устройств в реальном
времени – аппаратно.
Известно, что в МП каждая задача имеет сегменты кода и данных,
расположение которых в памяти определяется LDT. Кроме того, каждая
задача имеет свой специальный сегмент состояния задачи TSS, который
хранит состояние регистров, когда задача пассивна.
Микропроцессор распознает TSS как особый системный сегмент. Он
имеет в GDT специальный дескриптор. Формат его похож на дескриптор
сегментов кода и данных (рис. 3.8), но бит S=0, а поле ТИП содержит код
00B1, где B - бит занятости. Он устанавливается в 1 при переключении на
заданную задачу и используется для обнаружения попытки переключения
на задачу, выполнение которой прервано. Переключение задач производится только при В=0.
Обращение к TSS производится с помощью 16-битных селекторов.
Селектор TSS текущей задачи хранится в регистре задачи TR. Он состоит
из двух частей: «видимой», которая доступна программно, и «невидимой»,
т.е. программно недоступной. Задача может обращаться к «видимой» части, т.е. к селектору дескриптора для последнего TSS. Невидимая часть содержит дескрипторный кэш, к которому задача не имеет доступа.
При переключении задач изменяется селектор TSS. После этого МП
автоматически загружает информацию о сегменте состояния задачи из дескриптора TSS таблицы GDT в «невидимую» часть дескриптора TR. После
этого можно адресоваться к TSS новой задачи для восстановления состояния регистров. Схематично это показано на рис. 4.16. Если селектор ТSS
указывает на несистемные дескрипторы кодов или данных, то возникает
прерывание.
Рассмотрим более подробно содержимое сегмента TSS. Его наибольшая часть занята данными из регистров, описывающих состояние задачи: восемь общих регистров (AX, BX, CX, DX, SI, DI, BP, SP); указатель
команды IP; регистр флагов FLAGS; четыре сегментных регистра (DS, ES,
SS, CS); регистр задачи TR; регистр LDТR. Последние два регистра нужны
для того, чтобы знать, где сохранить состояние задачи при выходе из нее и
где располагаются сегменты данных и кодов для этой задачи. Состояние

60
Селектор
- 0 -
Доступ
адрес
Размер
Базовый
Базовый адрес
Доступ
Размер
«видимая» часть
15 0
«Невидимая» часть (дескрипторный кэш)
Конец TSS
:
:
Начало TSS
ОП
Дескриптор TSS
Сегмент TSS
других системных регистров не зависит от задачи и поэтому в TSS не
включается.
Рис. 4.16
Помимо этой информации TSS содержит поле обратной связи с предыдущей задачей (селектор TSS обратной связи). Кроме того, защита требует, чтобы каждый уровень привилегий в каждой задаче имел отдельный
стек. Поэтому в TSS имеется место для 3-х указателей SS:SP.
Обычно в ОС принято расширять понятие TSS и объявлять альтернативный сегмент данных. Он включает в себя память для TSS и дополнительную память для другой информации о задаче, где обычно сохраняется
состояние регистров математического сопроцессора.
Переключение задач производится командами JМР и CALL. При
этом должно выполняться правило привилегий, установленное для доступа
к данным, вида DPL
max (CPL, RPL). Но также имеется возможность
TSS
коду с низкой привилегией выполнить переключение задач. Это производится с помощью шлюза задачи, применение которого аналогично использованию шлюза вызова. Дескрипторы шлюза задачи помещаются в LDТ и
имеют формат, приведенный на рис. 4.17, где поле ТИП байта прав доступа содержит код 0101.
Каждое переключение задачи устанавливает бит TS в регистре MSW,
который показывает, что контекст сопроцессора может не соответствовать
текущей задаче.
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
