Ubuntu полностью зависает при выполнении этого встроенного ассемблера - PullRequest
1 голос
/ 22 декабря 2019

Я пытаюсь проверить, поддерживаются ли аппаратные расширения 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 (программа для пользователя)

...