В x86 Intel VT-X без корневого режима, может ли прерывание доставляться на каждой границе инструкции?
Кроме определенных нормальных заданных условий, когда прерывания не доставляются виртуальному процессору (cli, if=0 и т. Д.), Все ли инструкции в гостевой системе фактически прерываются?
То есть, когда входящее аппаратное прерывание передается LAPIC, а затем процессору, возможно, происходит некая внутренняя магия, преобразующая это в виртуальное прерывание для гостя (используя виртуальный APIC, нет выхода). Когда это происходит, выполняет ли текущая выполняемая инструкция немедленно сериализацию потока OOO и переходит к вектору, как обычная доставка прерываний, или виртуальная доставка прерываний VT-x вызывает какое-то другое разрешение?
Суть в том, что зачастую очень полезно стресс-тестирование условий гонки и примитивов синхронизации с помощью эмулятора. Можно было бы надеяться, что ваш эмулятор сможет получать прерывания по любой инструкции, вызывая "интересное поведение".
Это приводит к вопросу, обеспечивает ли виртуализация VT-x такую же степень детализации прерываний на уровне команд, чтобы "интересное поведение" вызывалось так же, как чистый эмулятор команд?
Intel SDM действительно отмечает, что виртуальные прерывания доставляются на границах команд, но все еще есть некоторые вопросы относительно того, все ли границы, обычно действующие на чипе, всегда проверяют наличие прерываний в режиме VT-x.
1 ответ
Я не вижу причин, по которым пребывание внутри гостя было бы особенным. что происходит, когда поступает внешнее прерывание. (Предполагается, что мы говорим о гостевом коде, работающем изначально в конвейере, а не о том, что эмуляция корня и / или решение отложить повторный вход к гостю в ожидании другого прерывания. См. Комментарии.)
Они не собираются эффективно блокировать прерывания для нескольких команд; это повредило бы задержку прерывания. Поскольку нет специальных "точек синхронизации", куда прерывания могут доставляться только туда, конвейер должен уметь обрабатывать прерывания между произвольными инструкциями. Exec-of-exec exec всегда потенциально имеет много общего, поэтому вы не можете рассчитывать на ожидание какого-либо определенного состояния перед обработкой прерывания; это может занять слишком много времени. Если промежуток между одной парой инструкций в порядке, чтобы доставить прерывание, почему нет других?
Процессоры не переименовывают уровень привилегий, так что да, они откатятся до состояния выхода в отставку, откажутся от всех инструкций в полете в серверной части, а затем выяснят, что делать, основываясь на текущем состоянии. См. Также Когда происходит прерывание, что происходит с инструкциями в конвейере?
Это абсолютно непроверенное предположение основано на моем понимании архитектуры процессора. Если бы было ощутимое влияние на задержку прерывания, это могло бы быть реальным.
На практике, независимо от VT-X, некоторые границы команд, вероятно, будет невозможно прервать, если не будет пошагового выполнения.
Пропускная способность составляет 3 на такт (Nehalem), 4 на такт на логический поток (Haswell) или даже выше в Skylake. Выход из ядра вне очереди, как правило, прерывистый, потому что это происходит по порядку (для поддержки точных исключений), поэтому у нас есть ROB отдельно от станции резервирования.
Очень часто для одной инструкции блокируется отказ от более поздних независимых инструкций на некоторое время, а затем для всплеска выхода на пенсию вместе с этой инструкцией. например, загрузка из-за отсутствия кэша или конец длинной цепочки депонирования прямо перед некоторыми независимыми инструкциями.
Так что для некоторых функций или блоков кода, вероятно, что каждый раз, когда они запускаются, xor
Например, нулевая инструкция всегда удаляется в том же цикле, что и предыдущая инструкция. Это означает, что ЦП никогда не находится в состоянии, когда инструкция обнуления xor является самой старой неиспользованной инструкцией, и, таким образом, разрыв между ним и insn ранее никогда не может быть тем местом, где появляется прерывание.
Если у вас есть две инструкции, тесно следующие друг за другом, например, одна из них поступает в цикле после того, как ЦП возвращается в пространство пользователя из более ранней инструкции, вы можете получить внешние эффекты на границах 64-байтового I-кэша, нарушающие обычный шаблон дешевых независимых инструкций, таких как nop
или же xor
- обнуление всегда происходит в том же цикле, что и в более ранней инструкции с более высокой задержкой, но все же могут быть случаи, которые были бесперебойными, когда выборка и декодирование с шириной 5, а при обработке / переименовании с шириной 4 надежно получаются инструкции в конвейер вместе без возможности иметь медленный финиш до быстрого после того, как он готов уйти в отставку.
Как я уже сказал, это не относится к VT-x.