Шлюз вызова гарантирует, что любые передачи управления другим кодовым сегментам будут происходить в правильные (разрешенные) точки входа, а не в середину процедуры или, что еще хуже, в середину команды.
При использовании шлюзов вызова передача управления всегда осуществляется косвенно. Вызывающая программа обращается к шлюзу вызова, а он (шлюз) определяет точку входа в вызываемой процедуре. В отличие от дескрипторов сегментов кода, данных или стека, а также системных дескрипторов сегментов 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шл
Оно гласит: шлюз нельзя использовать из кольца с уровнем привилегий меньшим, чем уровень привилегий шлюза, при этом можно сказать, что при доступе к шлюзу действуют такие же ограничения, как и при обращениях к данным в сегменте с другого уровня привилегий.
Рис. Схема работы шлюза вызова
Шлюзы вызова могут использоваться для передачи управления как на более привилегированные уровни, так и на уровень привилегированности вызывающей программы, хотя в этом и нет необходимости.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.