Я изучаю Intel Protected Mode. Я обнаружил, что Call Gate, Interrupt Gate, Trap Gate почти одинаковы. Фактически, кроме того, что у Call Gate есть поля для счетчика параметров, и что эти 3 шлюза имеют поля разных типов, они идентичны во всех других полях.
Что касается их функций, все они используются для передачи управления кодом в некоторые процедура в некотором сегменте кода.
Мне интересно, так как все эти 3 шлюза содержат информацию, необходимую для вызова через границы привилегий. Зачем нам их 3 вида? Разве 1 не достаточно хорош?
Спасибо за ваше время и ответ.
Смежный вопрос: Когда использовать Interrupt Gate или Trap Gate?
Сегодня мне пришла в голову эта мысль:
Разное назначение, разные логические схемы и разные детали поведения процессора. Например, обработка флага IF.
Шлюз (вызов, прерывание, задача или ловушка) используется для передачи управления выполнением по сегментам. Проверка уровня привилегий выполняется по-разному в зависимости от типа получателя и используемой инструкции.
Шлюз вызова использует инструкции CALL и JMP. Вызов шлюзы передают управление от кода с более низким уровнем привилегий к коду с более высокими привилегиями. DPL шлюза используется для определения, какие уровни привилегий имеют доступ к шлюзу. От шлюзов вызова постепенно отказываются (или, вероятно, они были) в пользу механизма SYSENTER / SYSEXIT, который работает быстрее.
Шлюзы задач используются для аппаратной поддержки многозадачности. Аппаратное переключение задач может происходить добровольно (CALL / JMP на дескриптор шлюза задачи) или через прерывание или IRET, когда установлен флаг NT. Точно так же это работает с воротами прерывания или ловушками. Насколько мне известно, ворота задач не используются, поскольку ядра обычно требуют дополнительной работы при переключении задач.
Шлюзы прерываний и ловушек вместе с шлюзами задач известны как таблица дескрипторов прерываний. Они работают так же, как шлюзы вызовов, за исключением передачи параметров из одного стека привилегий в другой. Одно отличие состоит в том, что шлюзы прерывания сбрасывают бит IF в EFLAGS, а шлюзы-ловушки - нет. Это делает их идеальными для обслуживания аппаратных прерываний. Ловушки широко используются в аппаратной виртуализации.
Дополнительные сведения см. В руководствах по архитектуре Intel для интересующих вас процессоров.
Чтобы ответить на комментарий:
Есть много причин отличать прерывания от ловушек.Одно из них - различие в масштабах: шлюзы прерываний указывают на пространство ядра (в конце концов, именно ядро управляет оборудованием), в то время как ловушки вызываются в пространстве пользователя. Обработчики прерываний вызываются в ответ на аппаратные события, а прерывания выполняются в ответ на инструкцию ЦП.
В качестве простого (но непрактичного) примера, чтобы лучше понять, почему шлюзы прерывания и ловушки по-разному обрабатывают EFLAGS, рассмотрим, что произошло бы, если бы мы писали обработчик прерывания для аппаратных событий в однопроцессорной системе и не могли очистить IF немного, пока мы обслуживали один. Возможно, поступит второе прерывание, пока мы будем обслуживать первое. Тогда наш обработчик прерывания будет вызываться процессором в какой-то случайный момент во время выполнения IH. Это может привести к повреждению данных, взаимоблокировке или другим плохим действиям. На практике отключение прерывания является одним из механизмов, гарантирующих, что последовательность операторов ядра обрабатывается как критическая секция.
Тем не менее, в приведенном выше примере предполагаются маскируемые прерывания. В любом случае вы не захотите игнорировать NMI.
Сегодня это тоже в значительной степени неактуально. Сегодня практически нет различий между быстрыми и медленными обработчиками прерываний (поиск «быстрых и медленных обработчиков»), обработчики прерываний могут выполняться во вложенном режиме, процессоры SMP делают обязательным объединение локального отключения прерывания со спин-блокировками, и так далее.
Теперь шлюзы-ловушки действительно используются для обслуживания программных прерываний, исключений и т. Д. Ошибка страницы или исключение деления на ноль в вашем процессоре, вероятно, обрабатывается через шлюз-ловушку.Простейшим примером использования шлюзов-ловушек для управления выполнением программы является инструкция INT 3, которая используется для реализации точек останова в отладчиках. При виртуализации происходит то, что гипервизор работает в кольце 0, а гостевое ядро обычно в кольце 1, где привилегированный код не работает с общей ошибкой исключения. Витчел и Розенблюм разработали двоичную трансляцию , которая в основном переписывает инструкции для имитации их эффектов. Критические инструкции обнаруживаются и заменяются ловушками. Затем, когда срабатывает ловушка, управление передается VMM / гипервизору, который отвечает за эмуляцию критических инструкций в кольце 0.
При аппаратной виртуализации техника ловушки и эмуляции несколько ограничена в использовании. (поскольку это довольно дорого, особенно когда оно динамическое), но практика двоичной трансляции по-прежнему широко используется .
Для получения дополнительной информации я предлагаю вам проверить:
Надеюсь, это поможет!
Шлюз прерывания является особенным, потому что флаг IF автоматически сбрасывается. . Шлюз вызова особенный, потому что он не активируется через вектор прерывания. Шлюз задач особенный, потому что он автоматически сохраняет состояние процессора. Четыре различных поведения, для которых удобно иметь четыре названия.