Будут ли pushf и popf вызывать VMEXIT в виртуальной машине на платформе x86? - PullRequest
0 голосов
/ 28 января 2019

Я пытаюсь добавить некоторые коды в ядре Linux, работающем на виртуальной машине, работающей на KVM.Тем не менее, я считаю, что инструкции pushf и popf приведут к значительному снижению производительности, с максимумом 5-кратным замедлением для apache.Я уверен, что эти две инструкции вызывают накладные расходы, потому что, если я заменю их на lahf и sahf, накладные расходы исчезнут.

Теперь мне интересно, почему они приносят так много деградации и как избежатьих?Я нашел некоторые подсказки в этом слайде , который указывает, что pushf и popf будут пойманы в гипервизоре.Они действительно вызывают VMEXIT и что такое число exit_reason?Наконец, есть ли способ настроить VMCS так, чтобы pushf и popf не попадали в ловушку?

1 Ответ

0 голосов
/ 29 января 2019

На процессорах Intel все инструкции, которые могут вызвать выход из виртуальной машины или которые ведут себя по-разному в гостевой системе, описаны в томе 3 главы 25 SDM.Pushf и popf не перечислены нигде в этой главе, что означает, что эти инструкции не вызывают выхода из виртуальной машины, и их наблюдаемое поведение при выполнении в гостевой системе такое же, как и при выполнении вне гостевой системы.

Причинадля команды popf не требуется выхода из виртуальной машины (несмотря на слайды, на которые есть ссылки в вопросе), поскольку VMCS имеет элементы управления для переопределения поведения, которое обычно контролируется регистром флагов.Например, находясь в гостевой системе, флаг IF не только контролирует доставку прерываний;вместо этого флаги в VMCS управляют тем, доставляются ли внешние прерывания гостю или происходит ли выход виртуальной машины.

Меня не удивляет, что popf оказывает нетривиальное влияние на производительность, учитывая все, что он делает.Подробнее см. Описание popf в руководстве разработчика программного обеспечения.

...