Представьте себе простую проверку синхронизации ЦП, которая используется для обнаружения ВМ.
static inline unsigned long long rdtsc_diff_vmexit() {
unsigned long long ret, ret2;
unsigned eax, edx;
__asm__ volatile("rdtsc" : "=a" (eax), "=d" (edx));
ret = ((unsigned long long)eax) | (((unsigned long long)edx) << 32);
/* vm exit forced here. it uses: eax = 0; cpuid; */
__asm__ volatile("cpuid" : /* no output */ : "a"(0x00));
/**/
__asm__ volatile("rdtsc" : "=a" (eax), "=d" (edx));
ret2 = ((unsigned long long)eax) | (((unsigned long long)edx) << 32);
return ret2 - ret;
}
На реальном оборудовании cpuid займет значительно меньше времени, чем при работе в KVM.
Я был играл со смещением rdts c, и я думал, можно ли просто не выйти по CPUID? Я попытался отключить выход, и неудивительно, что виртуальная машина не загружалась (прошивка UEFI вообще не отображалась, нет последовательного вывода).
Я пытался понять, почему это происходит. Единственное, о чем я могу думать, что потенциально может вызвать проблемы, - это сообщение о количестве ядер / потоков ЦП.
Итак, вопрос: возможно ли это вообще? Если нет, то почему? Если да, то есть ли какие-нибудь ресурсы, которые я могу использовать, чтобы заставить его работать?