【发布时间】:2017-04-02 03:54:51
【问题描述】:
我正在开发一个 Linux 内核模块,我需要在其中读取处理器的 CPUID 以查看是否存在某个功能。芯片组文档指出:
"当 CPUID (EAX=14H, ECX=0):ECX[bit 0] 或 CPUID.(EAX=14H, ECX=0):ECX[bit2]" 时支持访问此 MSR"
但是我使用以下代码来读取 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。
谢谢
【问题讨论】:
-
如果您自己不了解内联汇编,请使用 CPUID 包装函数。有几个可供选择。
-
@彼得·科德斯。谢谢你...
-
Intel Processor : "If CPUID.06H:EAX.[7] = 1" Meaning?的可能重复,这也是一个linux-kernel问题,答案显示了Linux的CPUID wrapper函数
标签: linux-kernel x86-64 cpuid