Вызов шлюза (Intel)


Шлюз вызова — это механизм в архитектуре Intel x86 для изменения уровня привилегий процесса, когда он выполняет вызов предопределенной функции с помощью инструкции CALL FAR.

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

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

Предполагая, что шлюз вызова уже настроен ядром операционной системы , код просто выполняет CALL FAR с необходимым селектором сегмента (поле смещения игнорируется). Процессор выполнит ряд проверок, чтобы убедиться, что запись действительна и код работает с достаточными привилегиями для использования шлюза. Предполагая, что все проверки пройдены, новый CS/ EIP загружается из дескриптора сегмента , а информация о продолжении помещается в стек нового уровня привилегий (старый SS, старый ESP, старый CS, старый EIP, именно в таком порядке). При необходимости параметры также могут быть скопированы из старого стека в новый стек. Количество копируемых параметров находится в дескрипторе шлюза вызова.

Ядро может вернуться к программе пользовательского пространства с помощью инструкции RET FAR, которая извлекает информацию о продолжении из стека и возвращается на внешний уровень привилегий.

Multics был первым пользователем шлюзов вызовов. В Honeywell 6180 шлюзы вызовов были частью архитектуры, но Multics смоделировала их на более старой модели GE 645 .