Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Глава 20. Особенности архитектуры IA-32-64.doc
Скачиваний:
3
Добавлен:
01.07.2025
Размер:
255 Кб
Скачать
☆

Передача управления между уровнями привилегий Основные моменты защиты по привилегиям:

ядро процессора аппаратно поддерживает работу на любом уровне привилегий;

текущий уровень привилегий CPL определяется выполняемой программой, (задаётся полем DPL дескриптора сегмента команд);

ядро процессора жестко ограничивает передачи управления в пределах текущего уровня привилегий.

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

Подчинённые сегменты команд

Представим себе, что в системе имеется процедура, оформленная как сегмент, для преобразования двоичных целых чисел в символьный код ASCII, которую используют программы на каждом уровне привилегий. Так как вызовы менее привилегированных процедур ядро процессора запрещает, процедура должна находиться в кольце 1, чтобы её можно было вызвать из этого кольца. Обычно такая процедура требует достаточных привилегий только для обращения к своему параметру (двоичному числу) и возвращения результата (символьного кода), т.е. таких же привилегий, что и вызывающая программа. Именно для таких ситуаций в архитектуре IA-32/64 предусмотрены подчинённые (точнее, подчиняемые) или согласованные сегменты команд.

С подчиненными сегментами команд не ассоциируется конкретный уровень привилегий, так как они подчиняются уровню привилегий той программы, которая передаёт им управление с помощью команд CALL или JMP. Другими словами, подчинённые сегменты команд не требуют больше привилегий, чем программа, передающая им управление.

Хотя с подчинённым сегментом команд не ассоциируется никакой конкретный уровень привилегий, применительно к нему всё же действует одно ограничение. Оно заключается в том, что значение DPL дескриптора подчинённого сегмента команд всегда должно быть меньше или равно текущему значению CPL. Другими словами, передача управления разрешается только во внутренние, более защищенные кольца. Передавать управление сегменту с DPL>CPL (т.е. менее привилегированному, чем текущая программа) никогда не разрешается.

Шлюзы вызова

Наличие подчинённых сегментов команд обеспечивает некоторую свободу передачи управления с одного уровня привилегий на другой. Хотя подчинённые программы фактически не изменяют текущий уровень привилегий, они позволяют программам на различных уровнях привилегий использовать общие программы. Обычно ими являются библиотеки, а идея подчинённой программы не требует наличия копий библиотек на каждом уровне привилегий.

Для реализации фактического изменения уровней привилегий привлекаются особые системные объекты, называемые шлюзами вызова. В дополнение к дескрипторам сегментов команд и данных прикладных программ процессор имеет дескрипторы для системных сегментов и шлюзов. Эти структуры данных привлекаются для управления задачами, а также особыми случаями и прерываниями.

Как системный объект, шлюз вызова имеет собственный дескриптор. 48 разрядов в дескрипторе шлюза вызова определяют полный указатель «селектор: смещение» точки входа той процедуры (назначения), которой шлюз передаёт управление. Дескриптор шлюза вызова действует как посредник или своеобразный «интерфейсный слой» между сегментами команд, находящимися на различных уровнях привилегий. Шлюзы вызова идентифицируют разрешенные точки в более привилегированных программах, которым может быть передано управление, и являются единственным средством смены уровней привилегий. Другими словами, шлюз вызова – системный объект, который адресует процедуру в сегменте команд. Шлюз имеет уровень привилегий, отличный от уровня привилегий вызываемого сегмента команд.

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

Адресовать шлюз вызова разрешается только в команде межсегментного вызова FAR CALL (отсюда возникло и название этого системного объекта). Сама команда CALL должна адресовать шлюз вызова, а не сегмент команд назначения. Программам никогда не разрешается прямо обращаться к сегментам команд на других уровнях привилегий.

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

Сегмент Смещение Память

Дескриптор шлюза

Дескриптор кода

…

Сегмент кода с DPL = 0

CALL

 С

Разрешено м

е

Запрещено = щ

е

н

= и

е

Рис. 20.6. Разрешенный и запрещенный вызовы более привилегированного кода

Загружаемый в регистр CS селектор берётся из шлюза вызова. Задание в шлюзе вызова полного указателя «селектор: смещение» обеспечивает вход только в точно определённых точках. Каждая точка входа от менее привилегированного кода должна иметь соответствующий ей шлюз вызова.

Косвенный вызов привилегированных процедур имеет несколько преимуществ:

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

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

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