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


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

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

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

 
 

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

Рис. 3.9. Механизм шлюзов для перехода на другой уровень привилегий

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

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

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

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

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

 
 

 
 

Рис.3.10. Переход на сегмент более привилегированного кода

Рис.3.11.Формат дескриптора шлюза

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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



Дата добавления: 2022-02-05; просмотров: 277;


Поиск по сайту:

Воспользовавшись поиском можно найти нужную информацию на сайте.

Поделитесь с друзьями:

Считаете данную информацию полезной, тогда расскажите друзьям в соц. сетях.
Poznayka.org - Познайка.Орг - 2016-2024 год. Материал предоставляется для ознакомительных и учебных целей.
Генерация страницы за: 0.013 сек.