Я работаю над модулем ядра 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.
Спасибо