Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

На сегменты кода с другими уровнями привилегий



Поскольку межсегментные переходы контролируются с использованием уровней привилегий и существует потребность в передаче управления с одного уровня

' EPL (effective privilege level) — эффективный уровень привилегий. Значение эффектив­ного уровня привилегий определяется минимальной привилегией, то есть как макси­мальное значение из двух: RPL и DPL.




привилегий на другой уровень, в микропроцессорах 180x86 реализован механизм шлюзов, который мЫ поясним с помощью рис. 3.9. Шлюзование позволяет орга­низовать обращение к так называемым подчиненным сегментам кода, которые выполняют часто встречающиеся функции и должны быть доступны многим за­дачам, располагающимся на том же или более низком уровне привилегии.

Помимо дескрипторов сегментов системными объектами, с которыми работает микропроцессор, являются специальные системные дескрипторы, названные шлю­зами или вентилями. Главное различие между дескриптором сегмента и шлюзом вызова заключается в том, что содержимое дескриптора указывает на сегмент в памяти, а шлюз обращается к дескриптору. Другими словами, если дескриптор служит механизмом отображения памяти, то шлюз служит механизмом перена­правления.

Для получения доступа к более привилегированному коду задача должна обра­титься к нему не непосредственно (путем указания дескриптора этого кода), а обращением к шлюзу этого сегмента (рис. 3.10).

В этом дескрипторе вместо адреса сегмента указываются селектор, позволяющий найти дескриптор искомого сегмента кода, и адрес (смещение назначения), с ко­торого будет выполняться подчиненный сегмент, то есть полный 32-битный ад­рес. Формат дескриптора шлюза приведен на рис. 3.11. Адресовать шлюз вызова можно с помощью команды CALL1. По существу, дескрипторы шлюзов вызова не являются дескрипторами (сегментов), но они могут быть расположены среди обычных дескрипторов в дескрипторных таблицах процесса. Смещение, указы­ваемое в команде перехода на другой сегмент (FAR CALL), игнорируется, и факти-

1 FAR CALL — межсегментный вызов процедуры.



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

Введены следующие правила использования шлюзов:

Q значение DPL шлюза вызова должно быть больше или равно значению теку­щего уровня привилегий CPL;

Q значение DPL шлюза вызова должно быть больше или равно значению поля RPL селектора шлюза;

Q значение DPL шлюза вызова должно быть больше или равно значению DPL целевого сегмента кода;

Q значение DPL целевого сегмента кода должно быть меньше или равно значе­нию текущего уровня привилегий CPL.

Требование наличия и доступности шлюза вызова для перехода на более приви­легированный код ограничивает менее привилегированный код заданным набо-


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

Q привилегированный код надежно защищен и вызывающие его программы не могут его разрушить. Естественно, что такой системный код должен быть особенно тщательно отлаженным, не содержать ошибок, быть максимально эффективным;

Q шлюзы межсегментных переходов для вызова системных функций делают эти самые системные функции невидимыми для программных модулей, рас­положенных на внешних (более низких) уровнях привилегий;

Q поскольку вызывающая программа непосредственно адресует только шлюз вызова, реализуемые вызываемым модулем (сегментным кодом) функции можно изменить или переместить в адресном пространстве, не затрагивая ин­терфейс со шлюзом;

Q программные модули вызываются с более привилегированного уровня.

Изложенный коротко аппаратный механизм защиты по привилегиям оказывает­ся довольно сложным и жестким. Однако поскольку все практические ситуации учесть в схемах микропроцессора невозможно, то при разработке процедур опе^-рационных систем и иного высоко привилегированного кода следует придержи­ваться приведенных ниже рекомендаций, заимствованных из книги [22].

Основной риск связан с передачей управления через шлюз вызова более приви­легированной процедуре. Нельзя предоставлять вызывающей программе ника­ких преимуществ, вытекающих из-за временного повышения привилегий. Это замечание особенно важно для процедур нулевого уровня привилегий (PLQ-npo-цедур).

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

1. Следует проверять счетчики циклов и повторений на минимальные и макси­
мальные значения.

2. Необходимо проверить 8- и 16-битные параметры, передаваемые в 32-битных
регистрах. Когда процедуре передается короткий параметр, его следует рас­
ширить со знаком или нулем для заполнения всего 32-битного регистра.

3. Следует стремиться свести к минимуму время работы процессора с запре­
щенными прерываниями. Если процедуре требуется запрещать прерывания,
необходимо, чтобы вызывающая программа не могла влиять на время нахож­
дения процессора с запрещенными прерываниями (флажок IF=0).


4. Процедура никогда не должна воспринимать как параметр код или указатель
кода.

5. В операциях процессора следует явно задавать состояние флажка направле­
ния DF для цепочечных команд.

6. Заключительная команда RET или RETn в процедуре должна точно соответство­
вать полю счетчика WC шлюза вызова; при этом n - 4x(WC'), так как счет­
чик задает число двойных слов, а п соответствует байтам.

7. Не следует применять шлюзы вызовов для функций, которым передается пе­
ременное число параметров (см. рекомендацию 6). При необходимости нуж­
но воспользоваться счетчиком и указателем параметров.

8. Функции не могут возвращать значения в стеке (см. рекомендацию 6), так
как после возврат'а стеки процедуры и вызывающей программы находятся
точно в таком состоянии, в каком они были до вызова.

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

Рекомендуется контролировать все обращения к памяти. Нетрудно представить себе, что РЬЗ-программа передаст PLO-процедуре указатель селекторхмещение и запросит считывание или запись нескольких байтов по этому адресу. Типич­ным примером может служить процедура дискового ввода/вывода, которая вос­принимает как параметр системный номер файла, счетчик байт и адрес, по кото­рому записываются данные с диска. Хотя PLO-процедура имеет привилегии для производства такой операции, но у PLS-программы разрешения на это может не быть.





Дата публикования: 2015-01-23; Прочитано: 409 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.007 с)...