Для обеспечения защиты при передаче управления между выполняемыми сегментами с разными уровнями привилегированности процессор i486 использует шлюзовые дескрипторы. Существует четыре типа шлюзовых дескрипторов:
Шлюзы вызова
Шлюзы ловушки
Шлюзы прерываний
Шлюзы задач
Шлюзы задач используются для переключения задач и описываются в Главе 7. В Главе 9 объясняется, как шлюзы ловушек и прерываний используются для обработки исключений и прерываний. В данной главе рассматриваются только шлюзы вызова. Шлюзы вызовов представляют собой некоторую форму защищенной передачи управления. Они используются для передачи управления между различными уровнями привилегированности. Их использование необходимо только в системах, где имеется более одного уровня привилегированности. На Рисунок 6-5 показан формат шлюза вызова.
Шлюз вызова имеет две основные функции:
Определение точки входа в процедуру.
Задание уровня привилегированности, требуемого для входа в процедуру.
Дескрипторы шлюзов вызова используются командами CALL и JUMP используются аналогичным способом, что и дескрипторы кодовых сегментов. Когда аппаратная часть распознает, что селектор сегмента назначения ссылается к шлюзовому дескриптору, выполнение команды определяется содержимым шлюза вызова. Дескриптор шлюза вызова может находиться в GDT или в LDT, но не в таблице дескрипторов прерывания (IDT).
Поля Селектора и Смещения в шлюзе образуют указатель на точку входа в процедуру. Шлюз вызова гарантирует, что любые передачи управления другим сегментам будут происходить в правильные точки входа процедуры, а не куда-нибудь в середину процедуры (или, что еще хуже, в середину команды). Операнд команды передачи управления не является селектором сегмента и смещением в сегменте точки входа желаемой процедуры. Вместо этого селектор сегмента указывает на шлюзовой селектор, а смещение не используется. Такая форма адресации показана на Рисунке 6-6.
DPL дескриптора сегмента кодового сегмента назначения перехода.
Поле DPL дескриптора шлюза определяет, из каких уровней привилегированности может использоваться данный шлюз. Один кодовый сегмент может содержать несколько различных процедур, предназначенных для использования из различных уровней привилегированности. Так, операционная система может иметь некоторые служные процедуры, используемые как прикладными программами, так и самой операционной системой, например, подпрограммы ввода/вывода символов, тогда как другие служебные процедуры могут быть предназначены только для использования их операционной системы, например, подпрограммы инициализации драйверов устройств.
Шлюзы могут использоваться для передачи управления как на более привилегированные уровни, так и на тот же уровень привилегированности (хотя в последнем случае их использование не обязательно). Для передачи управления на менее привилегированные уровни шлюзы могут использоваться только командами CALL. Команда JMP может использовать шлюз только для передачи управления либо кодовому сегменту с тем же уровнем привилегированности, либо конформному кодовому сегменту с тем же или более высоким уровнем привилегированности.
Для команды перехода JMP к неконформному сегменту должны удовлетворяться следующие два правила привилегированности (в противном случае генерируется исключение общей защиты):
MAX(CPL,RPL) <= DPL шлюза DPL кодового сегмента назначения = CPL
Для команды CALL (или команды перехода JMP к конформному сегменту) должны удовлетворяться следующие два правила привилегированности (в противном случае генерируется исключение общей защиты):
MAX(CPL,RPL) <= DPL шлюза DPL кодового сегмента назначения <= CPL