В x86 Intel VT-X без корневого режима, может ли прерывание доставляться на каждой границе инструкции? - PullRequest
0 голосов
/ 22 февраля 2019

Кроме определенных нормальных заданных условий, когда прерывания не доставляются виртуальному процессору (cli, if = 0 и т. Д.), Все ли инструкции в гостевой системе фактически прерываются?

То есть, когдавходящее аппаратное прерывание передается LAPIC, а затем процессору, предположительно, происходит какое-то внутреннее волшебство, преобразующее это в виртуальное прерывание для гостя (с использованием виртуального APIC, нет выхода).Когда это происходит, выполняет ли текущая выполняемая инструкция немедленно сериализацию потока OOO и переходит к вектору, как обычная доставка прерываний, или виртуальная доставка прерываний VT-x вызывает разрешение другого типа?

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

Это приводит к вопросу, обеспечивает ли виртуализация VT-x такую ​​же степень детализации прерываний на уровне команд, что«интересное поведение» будет запускаться так же, как и в чистом эмуляторе команд?

Intel SDM отмечает, что виртуальные прерывания доставляются на границах команд, но все еще есть некоторые вопросы относительно того, все границы, обычно действующие на чипе, всегда все еще проверяют наличие прерываний в режиме VT-x.

1 Ответ

0 голосов
/ 22 февраля 2019

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

Они не собираются эффективно блокировать прерывания для нескольких команд;это повредило бы задержку прерывания.Поскольку нет специальных «точек синхронизации», куда прерывания могут доставляться только туда, конвейер должен уметь обрабатывать прерывания между произвольными инструкциями.Exec-of-exec exec всегда потенциально имеет много общего, поэтому вы не можете рассчитывать на ожидание какого-либо определенного состояния перед обработкой прерывания;это может занять слишком много времени.Если промежуток между одной парой инструкций является нормальным для доставки прерывания, то почему нет других?

Процессоры не переименовывают уровень привилегий, так что да, они откатятся в состояние выхода на пенсию, откажутся от всех в-полеты инструкции в серверной части, а затем выяснить, что делать на основе текущего состояния.См. Также Когда происходит прерывание, что происходит с инструкциями в конвейере?


Это абсолютно непроверенное предположение основано на моем понимании архитектуры ЦП.Если бы измеримое влияние было на задержку прерывания, это могло бы быть реальным.


На практике, независимо от VT-X, некоторые границы команд, вероятно, будет невозможно прервать, если только-stepping.

Пропускная способность выхода на пенсию составляет 3 на такт (Nehalem), 4 на такт на логический поток (Haswell) или даже выше в Skylake.Выход из ядра, вышедшего из строя, обычно прерывистый, потому что это происходит по порядку (для поддержки точных исключений), поэтому у нас есть ROB отдельно от станции резервирования.

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

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

Если выесли две команды тесно следуют друг за другом, например, одна идет в цикле после того, как процессор возвращается в пользовательское пространство из более ранней инструкции, вы можете получить внешние эффекты на границах 64-байтового I-кэша, нарушающие привычный дешевый шаблоннезависимые инструкции, такие как nop или xor, обнуляющиеся всегда, удаляясь в том же цикле, что и более ранняя инструкция с более высокой задержкой, но все еще могут быть случаи, которые были бесперебойными, когда выборка и декодирование по ширине 5 и проблема 4 по ширине/ rename будет надежно получать инструкции в канал вместе без возможности иметь медленный финиш перед быстрым после того, как он будет готов удалиться.

Как я уже сказал, это не относится к VT-x.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...