Как выполнять команды SYSCALL/SYSRET для процессоров x86?

SYSCALL и SYSRET (и их 32-разрядные экземпляры Intel SYSENTER и SYSEXIT) обычно описываются как "обычно более быстрый" способ входа и выхода из режима супервизора в процессорах x86, чем шлюзы вызовов или программных прерываний, но точные данные, лежащие в основе этого утверждения, остаются в основном недокументированными. В частности, все руководства по оптимизации Intel или AMD, которые я смог найти, вообще не упоминают эти инструкции. Итак:

  • Сколько циклов (по оценкам) SYSCALL и SYSRET используют новейшие микроархитектуры Intel 64? Это, вероятно, можно измерить с помощью прямых экспериментов, но для тестирования достаточно нескольких разных процессоров.

В зависимости от порядка величины этого числа могут быть более подробными вопросы:

  • Неужели они несут полный конвейер или любой другой ларь?
  • Как, если они вообще взаимодействуют с предсказанием ветвления (например, буфера возвратного стека) и логикой выборки?
  • Что относительно задержек, зависимостей данных, сериализации?
  • &. Дц

Предположим, что 64-разрядный код на стороне пользователя, никаких дополнительных адресных пространств (запись на CR3) и даже совпадение с парами SYSCALL и SYSRET, если это имеет значение.