Ubuntu 在执行这个内联 asm 时完全冻结
Ubuntu freezes completely on executing this inline asm
我正在尝试使用内联汇编检查处理器是否支持 VMX 硬件扩展。我尝试了以下两种方法:
方法一:
int vmx_support(void) {
int get_vmx_support, vmx_bit;
asm volatile ("mov , %eax");
asm volatile ("mov [=11=], %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;
}
}
方法二:
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()
时,Ubuntu 在我执行 insmod vmx.ko
时完全冻结并且我必须重新启动它才能恢复。当我尝试从内核模块中的 方法 2 执行 vmx_support()
时,它会在 dmesg | tail
.
上执行并显示 [VMX] vmx is supported.
此外,当我尝试从 方法 1 运行 vmx_support()
作为用户空间程序时,它执行并打印 [VMX] vmx is supported.
作为输出到控制台。
问题:为什么方法1的代码冻结Ubuntu而方法2的代码 不会吧?另外,是否有更安全的方法来测试和调试使用内联汇编的代码? (例如,避免冻结)
可以在此处找到指向 Makefile、内核模块和用户空间程序的链接:
vmx.c(内核模块。里面注释了方法2的代码,取消注释并注释方法1[=53的代码=] 看看它是如何工作的)
vmx_sup.c(用户空间程序)
方法 1 有几个问题,但导致它挂起的问题无疑是它在没有通知编译器的情况下更改了 ebx。在您的用户模式程序中,ebx 可能恰好没有任何重要内容,但在内核模块中,它显然包含一些重要内容。
我正在尝试使用内联汇编检查处理器是否支持 VMX 硬件扩展。我尝试了以下两种方法:
方法一:
int vmx_support(void) {
int get_vmx_support, vmx_bit;
asm volatile ("mov , %eax");
asm volatile ("mov [=11=], %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;
}
}
方法二:
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()
时,Ubuntu 在我执行 insmod vmx.ko
时完全冻结并且我必须重新启动它才能恢复。当我尝试从内核模块中的 方法 2 执行 vmx_support()
时,它会在 dmesg | tail
.
[VMX] vmx is supported.
此外,当我尝试从 方法 1 运行 vmx_support()
作为用户空间程序时,它执行并打印 [VMX] vmx is supported.
作为输出到控制台。
问题:为什么方法1的代码冻结Ubuntu而方法2的代码 不会吧?另外,是否有更安全的方法来测试和调试使用内联汇编的代码? (例如,避免冻结)
可以在此处找到指向 Makefile、内核模块和用户空间程序的链接:
vmx.c(内核模块。里面注释了方法2的代码,取消注释并注释方法1[=53的代码=] 看看它是如何工作的)
vmx_sup.c(用户空间程序)
方法 1 有几个问题,但导致它挂起的问题无疑是它在没有通知编译器的情况下更改了 ebx。在您的用户模式程序中,ebx 可能恰好没有任何重要内容,但在内核模块中,它显然包含一些重要内容。