Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Организация вычислительных систем на базе микропроцессоров с архитектурой x86. Учебное пособие

.pdf
Скачиваний:
0
Добавлен:
07.09.2026
Размер:
1 Мб
Скачать
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 (уровень привилегий инициатора запроса).
Командам разрешается загружать регистр сегмента данных и полу-
чать доступ к соответствующему сегменту только в том случае, если вы­полняется условие: DPLmax (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.
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]