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

Команды “ближнего” перехода передают управление в пределах содержащего их кодового сегмента. При выполнении этих команд селектор кодового сегмента не перезагружается, и осуществляется только проверка границы перехода. Процессор просто удостоверяется, что команда, которой передается управление, находится в пределах текущего кодового сегмента. Так как дескриптор этого сегмента хранится в регистре CSт, то проверка защиты для ближних передач управления не требует специальных временных затрат.

Команды “дальнего” перехода CALL и JMP содержат полные логические адреса перехода - селектор кодового сегмента назначения и его внутрисегментное смещение. При исполнении команд “дальнего” перехода осуществляется загрузка сегментного регистра CS селектором, с помощью которого выбирается дескриптор  адресуемого кодового сегмента. Как и при любом межсегментном переходе, процессор в этом случае выполняет проверку привилегированности кодового сегмента назначения. Если межсегментный переход осуществляется в пределах одного кольца защиты (DPL = CPL) требования защиты выполняются, и доступ к вызываемому сегменту разрешен (при этом дескриптор вызываемого кодового сегмента загружается в теневой регистр CSт, значение поля DPL этого дескриптора заносится в поле RPL селектора, устанавливая текущий уровень CPL выполняемой программы).

Реализуя защиту, процессор запрещает пользовательским программам выполнять те операции, которые могут и должны выполняться только операционной системой. В то же время в любой системе есть некоторые стандартные процедуры (чаще всего это программы операционной системы с  высоким уровнем привилегий ), которые должны выполняться на любом уровне привилегий. При использовании общих правил защиты переход к таким программам из пользовательских программ должен быть запрещен. Возникает вопрос, как быть?  Ответ довольно простой - при межсегментных передачах управления без исключений из общего правила защиты не обойтись.

Процессоры 80х86 обеспечивают два способа реализации межсегментных переходов из менее привилегированного сегмента в  более привилегированный - обращение к согласованному сегменту с установленным битом С в байте доступа кодового сегмента и использование шлюзов вызова.

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

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

Наряду с обычными программами, в системе обычно используются общедоступные программы, которые должны (и могут) вызываться из любого кольца защиты, в том числе и из более привилегированного кольца. Для правильной работы такие процедуры должны находиться в наиболее привилегированном кольце 0 и для обращения к ним необходимо использоваться шлюзы. Расширение ядра операционной системы за счет таких процедур является нежелательным, так как это усложняет систему. Кроме того, необходимо учитывать, что при вызове более привилегированной процедуры процессор автоматически корректирует уровень  привилегий текущей программы и получает доступ ко всем другим программам и данным. Во многих случаях в этом и нет необходимости. Используя согласованные сегменты, программа может осуществить переход к общедоступной процедуре без использования шлюзов вызова. Действительно, если процедура никогда не требует больших привилегий, чем вызывающая ее программа, то процессор, используя согласованные сегменты, может обеспечить автоматическую коррекцию привилегий вызываемой процедуры и выполнить ее на уровне привилегий вызывающей программы. Например, в системе имеется процедура преобразования двоичных целых чисел в символьный код ASCII, которая используется в каждом кольце. В общем случае эта процедура преобразования требует привилегий, достаточных для доступа к своим аргументам и возвращения результата, Такая процедура может выполняться на уровне вызывающей программы и, как правило, размещается в согласованном сегменте. В процессорах 80х86 для таких ситуаций в дескрипторы кодового сегмента введен бит подчинения С, при установке которого обычные правила относительно DPL  и  CPL не действуют.