Разница между Call Gate, Interrupt Gate, Trap Gate?

Я изучаю Intel Protected Mode. Я обнаружил, что Call Gate, Interrupt Gate, Trap Gate почти одинаковы. Фактически, кроме того, что у Call Gate есть поля для счетчика параметров, и что эти 3 шлюза имеют поля разных типов, они идентичны во всех других полях.

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

Мне интересно, так как все эти 3 шлюза содержат информацию, необходимую для вызова через границы привилегий. Зачем нам их 3 вида? Разве 1 ​​не достаточно хорош?

Спасибо за ваше время и ответ.

Обновление 1

Смежный вопрос: Когда использовать Interrupt Gate или Trap Gate?

Обновление 2

Сегодня мне пришла в голову эта мысль:

Разное назначение, разные логические схемы и разные детали поведения процессора. Например, обработка флага IF.

39
задан Community 23 May 2017 в 11:33
поделиться

2 ответа

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

Шлюз вызова использует инструкции CALL и JMP. Вызов шлюзы передают управление от кода с более низким уровнем привилегий к коду с более высокими привилегиями. DPL шлюза используется для определения, какие уровни привилегий имеют доступ к шлюзу. От шлюзов вызова постепенно отказываются (или, вероятно, они были) в пользу механизма SYSENTER / SYSEXIT, который работает быстрее.

Шлюзы задач используются для аппаратной поддержки многозадачности. Аппаратное переключение задач может происходить добровольно (CALL / JMP на дескриптор шлюза задачи) или через прерывание или IRET, когда установлен флаг NT. Точно так же это работает с воротами прерывания или ловушками. Насколько мне известно, ворота задач не используются, поскольку ядра обычно требуют дополнительной работы при переключении задач.

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

Дополнительные сведения см. В руководствах по архитектуре Intel для интересующих вас процессоров.

Обновление

Чтобы ответить на комментарий:

Есть много причин отличать прерывания от ловушек.Одно из них - различие в масштабах: шлюзы прерываний указывают на пространство ядра (в конце концов, именно ядро ​​управляет оборудованием), в то время как ловушки вызываются в пространстве пользователя. Обработчики прерываний вызываются в ответ на аппаратные события, а прерывания выполняются в ответ на инструкцию ЦП.

В качестве простого (но непрактичного) примера, чтобы лучше понять, почему шлюзы прерывания и ловушки по-разному обрабатывают EFLAGS, рассмотрим, что произошло бы, если бы мы писали обработчик прерывания для аппаратных событий в однопроцессорной системе и не могли очистить IF немного, пока мы обслуживали один. Возможно, поступит второе прерывание, пока мы будем обслуживать первое. Тогда наш обработчик прерывания будет вызываться процессором в какой-то случайный момент во время выполнения IH. Это может привести к повреждению данных, взаимоблокировке или другим плохим действиям. На практике отключение прерывания является одним из механизмов, гарантирующих, что последовательность операторов ядра обрабатывается как критическая секция.

Тем не менее, в приведенном выше примере предполагаются маскируемые прерывания. В любом случае вы не захотите игнорировать NMI.

Сегодня это тоже в значительной степени неактуально. Сегодня практически нет различий между быстрыми и медленными обработчиками прерываний (поиск «быстрых и медленных обработчиков»), обработчики прерываний могут выполняться во вложенном режиме, процессоры SMP делают обязательным объединение локального отключения прерывания со спин-блокировками, и так далее.

Теперь шлюзы-ловушки действительно используются для обслуживания программных прерываний, исключений и т. Д. Ошибка страницы или исключение деления на ноль в вашем процессоре, вероятно, обрабатывается через шлюз-ловушку.Простейшим примером использования шлюзов-ловушек для управления выполнением программы является инструкция INT 3, которая используется для реализации точек останова в отладчиках. При виртуализации происходит то, что гипервизор работает в кольце 0, а гостевое ядро ​​обычно в кольце 1, где привилегированный код не работает с общей ошибкой исключения. Витчел и Розенблюм разработали двоичную трансляцию , которая в основном переписывает инструкции для имитации их эффектов. Критические инструкции обнаруживаются и заменяются ловушками. Затем, когда срабатывает ловушка, управление передается VMM / гипервизору, который отвечает за эмуляцию критических инструкций в кольце 0.

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

Для получения дополнительной информации я предлагаю вам проверить:

  • Драйверы устройств Linux, третье издание (доступно в Интернете )
  • Для двоичной трансляции QEMU является отличный старт.
  • Что касается ловушки и эмуляции, ознакомьтесь с сравнением программных / аппаратных методов.

Надеюсь, это поможет!

60
ответ дан 27 November 2019 в 02:23
поделиться

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

8
ответ дан 27 November 2019 в 02:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: