CPUID и MSR читают Linux-x86

Я работаю над модулем ядра Linux, в котором мне нужно прочитать CPUID процессора, чтобы увидеть, присутствует ли функция. В документации чипсета указано:

«Доступ к этому MSR поддерживается, когда либо CPUID (EAX = 14H, ECX = 0): ECX [bit 0], либо CPUID. (EAX = 14H, ECX = 0): ECX [bit2]»

Однако я использую следующий код для чтения CPUID:

int func()
{
  int a, b;

  for (a = 0; a < 5; a++)
  {
    __asm__("cpuid"
            :"=a"(b)                 // EAX into b (output)
            :"0"(a)                  // a into EAX (input)
            :"%ebx","%ecx","%edx");  // clobbered registers

    printk("The code %i gives %llx\n", a, b);
  }

  return 0;
}

По материалам: https://en.wikipedia.org/wiki/CPUID#EAX.3D1:_Processor_Info_and_Feature_Bits

но я понятия не имею, как это работает и какие ценности я читаю. Может ли кто-нибудь объяснить мне, как работает этот код, а также как я могу прочитать вышеупомянутые регистры CPUID, а также EAX = 80000008h.

Спасибо


person vitamike    schedule 18.11.2016    source источник
comment
Используйте функцию-оболочку CPUID, если вы сами не понимаете встроенный asm. Есть несколько вариантов на выбор.   -  person Peter Cordes    schedule 18.11.2016
comment
@ Питер Кордес. Спасибо за это...   -  person vitamike    schedule 18.11.2016
comment
Возможный дубликат процессора Intel: если CPUID.06H: EAX. [7] = 1 Значение?, который также является вопросом ядра Linux, и в ответе показаны функции оболочки CPUID Linux.   -  person Peter Cordes    schedule 29.08.2017


Ответы (1)


Если вы еще не нашли ее, одна из таких популярных утилит называется просто «cpuid» и доступна как пакет rpm в Fedora, как пакет Ubuntu, а также в других дистрибутивах. Эта утилита использует инструкцию cpuid.

См .: http://www.etallen.com/cpuid.html.

person Rami Rosen    schedule 19.11.2016