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

Для обращения к шлюзу вызова процессор 80х86 использует команды “дальнего” вызова FAR CALL или “дальнего” перехода FAR JMP. Команда JMP может использовать шлюз только для передачи управления кодовому сегменту с тем же уровнем привилегированности. При необходимости передачи управления в более привилегированный сегмент (а эту операцию можно выполнить только через шлюз) используется команда FAR CALL, которая адресует не сегмент кода назначения, а шлюз вызова.  Шлюз вызова определяет сегмент кода, которому передается управление и точное смещение в этом сегменте (разрешенную точку входа в вызываемую программу). Фактически в команде FAR CALL, выполняющей обращение к шлюзу, используется только селектор, а смещение игнорируется. Процессор, анализируя содержимое поля TYPE адресуемого дескриптора, определяет, что выполняется обращение к шлюзу вызова и извлекает из соответствующих полей дескриптора шлюза полный логический адрес перехода. 

Использование шлюза вызова рассмотрим на примере системы, в которой пользовательская программа имеет уровень привилегий 3, а ОС разделена на два уровня: ядро ОС с уровнем привилегий 0 и менее критичные сервисные программы с уровнем привилегий 1 (уровень привилегий 2 не используется). В этой системе пользовательская программа должна иметь возможность вызывать сервисные процедуры, но не ядро ОС. Для реализации этой возможности целесообразно использовать сервисный шлюз (шлюз для сервисных процедур), уровень привилегий которого равен 3. Сервисные программы, в свою очередь, могут вызывать ядро ОС. Для таких вызовов в системе предусмотрен шлюз ядра с уровнем привилегий 1. С помощью указанных шлюзов в рассматриваемой системе (рис.) ОС позволяет сервисным программам вызывать ядро ОС, запрещая в то же время обращаться к ядру ОС пользовательским программам, которым разрешен доступ только к сервисным процедурам.

 


Пользовательская программа (PL = 3)

 


Сервисная программа ОС (PL = 1)

                    

Ядро ОС  (PL = 0)

 


Шлюз ядра (DPL = 1)

                                   

Сервисный шлюз (DPL = 3)

Рис. Использование шлюза вызова для передачи управления в более привилегированный сегмент

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

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

В защищенном режиме процессор 80х86 для всех внутренних колец защиты (с уровнем привилегий 0, 1 и 2) определяет собственные стеки. Адрес каждого стека (SS:SP) хранится в сегменте состояния TSS задачи. Стеки с уровнем привилегий 0, 1 и 2 используются для приема вызовов из менее привилегированных процедур. Если DPL = CPL = 3, то создание отдельного стека не требуется, и вызванная программа (задача) продолжает заполнение и использование стека, созданного в процессе выполнения старой (вызывающей) программы.