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、内核模块和用户空间程序的链接:

Makefile

vmx.c(内核模块。里面注释了方法2的代码,取消注释并注释方法1[=53的代码=] 看看它是如何工作的)

vmx_sup.c(用户空间程序)

方法 1 有几个问题,但导致它挂起的问题无疑是它在没有通知编译器的情况下更改了 ebx。在您的用户模式程序中,ebx 可能恰好没有任何重要内容,但在内核模块中,它显然包含一些重要内容。