Встроенные средства защиты. Принципы модульности и перемещаемости. Проверка привилегированности сегмента, страница 9

Процедуры в подчиненном сегменте можно вызывать из любой программы. Шлюзы вызова не требуются и стеки не переключаются.  При передаче управления в согласованный сегмент уровень привилегий CPL не изменяется. Это единственный случай, когда уровень CPL может быть не равен уровню DPL  исполняемого в данный момент сегмента. Можно сказать, что подчиненный сегмент автоматически “перемещается или подчиняется” кольцу вызывающей программы. Наличие согласованных сегментов удобно для организации в системе библиотек, программы которых должны быть доступны всем выполняющимся в системе задачам. Библиотечные программы оформляются как подчиненные сегменты кода, и они могут быть вызваны командой CALL из любой текущей задачи. В случае использования согласованных сегментов схема проверки привилегированности при межсегментных переходах меняется (рис.) .

                                Регистр CS текущего

CPL            кодового   сегмента

 


Селектор вызываемого                                Байт доступа

 сегмента                                                                                             Дескриптор

                     CPL                      P  DPL 1 1 C R A    База Предел    вызываемого сегмента

 

 


Механизм проверки привилегий

Рис. Схема проверки привилегий при межсегментных переходах

При С = 0 для правильного перехода уровень привилегий текущей вызывающей программы CPL должен быть больше или равен уровню привилегий вызываемой программы (сегмента назначения): DPL > CPL.

При С = 1 правила защиты изменяются, благодаря чему процедуры в подчиненном сегменте можно вызывать из любой программы.

Большинство сегментов программы являются несогласованными сегментами. Для этих сегментов управление может быть передано к исполнительному сегменту только на том же уровне привилегий.

Более общим методом реализации межсегментных переходов на другой уровень привилегированности является использование шлюзов вызова. Одно из преимуществ хранения адреса точки входа в шлюзе вызова, а не в команде вызова процедуры, заключается в том, что процедуру можно изменять и рекомпилировать, не требуя рекомпилирования никаких программ, вызывающих ее через шлюз. Чтобы учесть любое изменение в точке входа процедуры, нужно изменить только виртуальный адрес в шлюзе вызова. Следовательно, старые программы можно выполнять с новой версией ОС, если позиции всех шлюзов в глобальной дескрипторной таблице для обслуживания старой ОС остались неизменными.

Межсегментные вызовы с изменением уровня привилегий

                       (вызовы через кольца)

В защищенном режиме, используя механизм защиты, процессор автоматически предотвращает выполнение пользовательской программой тех операций, которые должны выполняться защищенными программами операционной системы. Однако ОС, определяя разрешенные точки входа в свои программы, может разрешить пользовательским программам доступ к более привилегированным системным процедурам. Благодаря этому пользовательские программы получают от ОС только те обслуживания, которые ОС разрешает оказывать пользовательским программам.  Как стандартный способ обслуживания ОС во многих компьютерах применяется специальная команда “вызов супервизора”. В процессорах 80х86 такой команды нет, и для обеспечения доступа менее привилегированных программ пользователя к более привилегированным программам операционной системы предусмотрен специальный механизм передачи управления только через разрешенные точки входа. Допустимые точки входа в защищенные процедуры более высокого уровня в процессоре идентифицируются специальными дескрипторами, которые называются шлюзами вызова. С помощью указания в шлюзе полного указателя адреса (сепектор:смещение) обеспечивается вход в защищенную процедуру только в разрешенной точке.