我正在尝试使用嵌入式程序集检查处理器是否支持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;
}
}
当我尝试从内核模块中的方法1执行vmx_support()
时,当我执行insmod vmx.ko
时,Ubuntu会完全冻结,必须重新启动它才能将其取回。当我尝试从内核模块中的方法2执行vmx_support()
时,它会执行并在[VMX] vmx is supported.
上显示dmesg | tail
。
此外,当我尝试从方法1作为用户空间程序运行vmx_support()
时,它执行并打印[VMX] vmx is supported.
作为输出到控制台。
问题:为什么方法1中的代码冻结Ubuntu,而方法2中的代码却冻结呢?另外,有没有更安全的方法来测试和调试使用内联汇编的代码? (例如,避免冻结)
到Makefile,内核模块和用户空间程序的链接可以在这里找到:
vmx.c(内核模块。来自[[method 2的代码在内部注释,取消注释,并注释来自[[method 1的代码以查看其工作原理)]
vmx_sup.c(用户空间程序)