Ubuntu在执行此嵌入式asm时完全冻结

问题描述 投票:1回答:1

我正在尝试使用嵌入式程序集检查处理器是否支持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,内核模块和用户空间程序的链接可以在这里找到:

Makefile

vmx.c(内核模块。来自[[method 2的代码在内部注释,取消注释,并注释来自[[method 1的代码以查看其工作原理)]

vmx_sup.c(用户空间程序)
c x86 kernel-module inline-assembly
1个回答
0
投票
© www.soinside.com 2019 - 2024. All rights reserved.