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

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

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