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

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

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

Формат дескрипторов шлюзов вызова 16- и 32-разрядных процессоров несколько отличается (рис.).

16 бит            8 бит               8 бит                   16 бит                    16 бит

0      0       P DPL 00100     000 счетчик       селектор сегмента       смещение доступ                   слов              назначения              биты 15-0

Рис. Формат дескриптора шлюза вызова 16-разрядного процессора

16 бит             8 бит                 8 бит                   16 бит                16 бит

 смещение     P DPL 01100      000 счетчик     селектор сегмента     смещение биты 31-16         доступ                   слов            назначения            биты 15-0

Рис. Формат дескриптора шлюза вызова 32-разрядного процессора

Назначение отдельных полей дескриптора шлюза вызова следующее:                   

- счетчик слов WC определяет количество параметров, копируемых из стека вызывающей задачи в стек вызываемой программы.

- селектор сегмента назначения содержит селектор кодового сегмента вызываемой программы;

- смещение указывает точку входа внутри кодового сегмента места назначения.

Шлюз вызова, как и любой системный объект, имеет ограничения на использование. Селекторы, с помощью которых выбираются дескрипторы шлюза вызова нельзя загружать в сегментные регистры данных DS, ES, FS, GS и стека SS. Они предназначены только для передачи управления сегменту кода с другим уровнем привилегий, т.е. для загрузки в сегментный регистр CS. Поле DPL в шлюзе вызова показывает, какой привилегией должна обладать вызывающая программа для доступа к шлюзу. Разрешенные варианты передачи управления через шлюзы вызова показаны на рис.

 


Рис. Схема межуровневых переходов с использованием шлюзов

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

1. Текущий уровень CPL вызывающей процедуры;

2. Уровень привилегированности дескриптора шлюза DPLшл;                                                                                    

3. Уровень привилегированности RPL селектора, указанного в шлюзе;

4. Уровень привилегированности дескриптора кодового сегмента назначения DPLназн;

Общее правило разрешения вызова через шлюз можно записать в следующем виде:

DPL назн £ max(RPL, CPL) £ DPLшл

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


Схема работы шлюза вызова приведена на рис.

Рис.  Схема работы шлюза вызова

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