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

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

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

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

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

Защита адресного пространства задач_________________________________ 119

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

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

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

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

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

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

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

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

120________________ Глава 4. Особенности архитектуры микропроцессоров j80x86

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

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

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

- Легко реализуется вызов программных модулей с более привилегированного
уровня.

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

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

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

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

Защита адресного пространства задач____________________________________ 121

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

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

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

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

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

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

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

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

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

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

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

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

122_______________ Глава 4. Особенности архитектуры микропроцессоров i80x86

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

Наши рекомендации