英特尔处理器:"If CPUID.06H:EAX.[7] = 1"含义?



英特尔处理器数据表中的以下注释是什么意思?如何在 Linux 中的驱动程序代码中检查这一点?

如果 CPUID.06H:EAX.[7] = 1

我在英特尔处理器的软件开发人员手册的寄存器描述表的评论栏中遇到了这种类型的陈述。

参考: https://software.intel.com/sites/default/files/managed/22/0d/335592-sdm-vol-4.pdf

请帮助我了解处理器说明。

谢谢。

CPUID.06H:EAX.[7]支持在英特尔处理器中发现 HWP(硬件控制的性能状态(支持。

如果未设置该功能位,则该功能不存在。 访问 HWP MSR 将导致 #GP 异常。 对于其他功能位,结果可能会更糟:没有故障,但以后会导致难以调试的问题。


这意味着您应该在eax寄存器中检查一点(特别是eax & (1<<7)(在运行cpuid指令后,在指令之前使用eax=0x6

。要发现 Linux 内核中的 CPUID 值,您可以使用cpuid函数之一,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

英特尔处理器数据表中的以下注释是什么意思?

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[位 7]:如果设置了此位(即如果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;
}

最新更新