Я пытаюсь проверить, поддерживаются ли аппаратные расширения VMX процессором с использованием встроенной сборки. Я попробовал следующие два способа сделать это:
Метод 1:
int vmx_support(void) {
int get_vmx_support, vmx_bit;
asm volatile ("mov $1, %eax");
asm volatile ("mov $0, %ecx");
asm volatile ("cpuid");
asm volatile ("mov %%ecx, %0\n\t":"=r" (get_vmx_support): : "memory");
vmx_bit = (get_vmx_support >> 5) & 1;
if (vmx_bit == 1) {
return 1;
} else {
return 0;
}
}
Метод 2:
int vmx_support(void) {
unsigned int eax, ebx, ecx, edx;
eax = 1;
ecx = 0;
asm volatile("cpuid"
: "=a" (eax),
"=b" (ebx),
"=c" (ecx),
"=d" (edx)
: "0" (eax), "2" (ecx)
: "memory");
vmx_bit = (ecx >> 5) & 1;
if (vmx_bit == 1) {
return 1;
} else {
return 0;
}
}
Когда я пытаюсь выполнить vmx_support()
из Метод 1 внутри модуля ядра, Ubuntu полностью зависает, когда я выполняю insmod vmx.ko
, и мне нужно перезапустить его, чтобы вернуть его обратно. Когда я пытаюсь выполнить vmx_support()
из Метод 2 внутри модуля ядра, он запускается и показывает [VMX] vmx is supported.
в dmesg | tail
.
Также, когда я пытаюсь запустить vmx_support()
из Метод 1 как пользовательская программа, она выполняет и печатает [VMX] vmx is supported.
в качестве вывода на консоль.
Вопрос: Почему код из Метод 1 заморозить Ubuntu, тогда как код из Метод 2 не делает? Кроме того, есть ли более безопасный способ тестирования и отладки кода, который использует встроенную сборку? (то есть, например, избегайте зависаний)
Ссылки на Makefile, модуль ядра и пользовательскую программу можно найти здесь:
Makefile
vmx.c (модуль ядра. Код из метод 2 прокомментирован внутри, раскомментируйте его и прокомментируйте код из метод 1 , чтобы увидеть, как он работает)
vmx_sup.c (программа для пользователя)