以下评论在英特尔处理器数据表中的含义是什么?如何在Linux中的驱动程序代码中检查它?
如果CPUID.06H:EAX。[7] = 1
我在注册表描述表的注释栏中的英特尔处理器SW开发人员手册中遇到过这种类型的陈述。
参考:https://software.intel.com/sites/default/files/managed/22/0d/335592-sdm-vol-4.pdf
请帮助我理解处理器说明。
感谢。
答案 0 :(得分:2)
CPUID.06H:EAX。[7] 可以在英特尔处理器中发现HWP(硬件控制性能状态)支持。
如果未设置该功能位,则该功能不存在。访问HWP MSR将导致#GP异常。对于其他功能位,结果可能更糟:没有故障但后来导致难以调试的问题。
这意味着您应该在指令前eax
运行the cpuid
instruction后检查eax & (1<<7)
寄存器中的位(具体为eax=0x6
)。
要在Linux内核中发现CPUID值,您可以使用one of the cpuid
functions, with op=6
:
#include <asm/processor.h> // defines the following:
void cpuid(unsigned int op,
unsigned int *eax, unsigned int *ebx,
unsigned int *ecx, unsigned int *edx);
void cpuid_count(unsigned int op, int count,
unsigned int *eax, unsigned int *ebx,
unsigned int *ecx, unsigned int *edx);
或者您只想要一个寄存器结果的情况:
unsigned int cpuid_eax(unsigned int op);
并屏蔽EAX返回值。
一个小注意事项:引用SDM时最好指定一个部分 - 毕竟它是一本大书......
答案 1 :(得分:2)
问题1
以下注释在英特尔处理器数据表中的含义是什么?
If CPUID.06H:EAX.[7] = 1
cpuid
是一个特殊的处理器指令,用于发现处理器的详细信息(例如,检查某些不常见功能的可用性)。它隐式使用EAX寄存器作为参数,并在EAX,EBX,ECX,EDX中返回结果。
在英特尔手册中,一般格式为:
CPUID.EAX_VALUE:RETURN_REGISTER.[BIT_NUMBER] = 1
:表示如果使用EAX寄存器= EAX_VALUE执行CPUID
指令,则会在RETURN_REGISTER中得到结果。如果设置了位号BIT_NUMBER,那么它可以在手册中找到一些特殊含义。
CPUID.06H:EAX.[7]=1
表示如果以寄存器EAX = 06H(十六进制为6)作为输入执行CPUID
指令,则会在EAX中得到结果。如果结果的位数为1,那么它有一些特殊的含义,您可以在手册中找到。例如。我在手册中读到了这个:
HWP基线资源和功能的可用性, CPUID.06H:EAX [bit 7]:如果该位置1(即if
CPUID.06H:EAX.[7]=1
),HWP提供了几个新的架构MSR: IA32_PM_ENABLE,IA32_HWP_CAPABILITIES, IA32_HWP_REQUEST,IA32_HWP_STATUS。
问题2
如何在Linux的驱动程序代码中检查?
if(cpuid_eax(0x06) && (1<<7)){
// Good news :features availlable, do your job
}else{
// Bad luck ::
return;
}