简介

首先,这里要讲的不是https://www.cpuid.com/里面的CPUID。

这里说的CPUID是x86平台的一条指令。

这条指令用来标记当前x86平台CPU的详细信息,因为x86平台经历了N代,每一代都会有新的特性,在做开发的时候需要确定当前的特性是否可以在这个CPU中使用,这就需要通过这个指令来确定。

CPUID指令是在奔腾处理器(1993年)上引入的,更早之前的CPU就没有办法了。

 

格式

以下是EDK中包含的CPUID访问的函数:

;------------------------------------------------------------------------------
;  VOID
;  EfiCpuid (
;    IN   UINT32              RegisterInEax,          // rcx
;    OUT  EFI_CPUID_REGISTER  *Reg           OPTIONAL // rdx
;    )
;------------------------------------------------------------------------------
EfiCpuid PROC   PUBLIC
    push  rbx

    mov   r8,   rdx         ; r8 = *Reg
    mov   rax,  rcx         ; RegisterInEax
    cpuid
    cmp   r8,   0
    je    _Exit
    mov   [r8 +  0], eax    ; Reg->RegEax
    mov   [r8 +  4], ebx    ; Reg->RegEbx
    mov   [r8 +  8], ecx    ; Reg->RegEcx
    mov   [r8 + 12], edx    ; Reg->RegEdx

_Exit:
    pop   rbx
    ret
EfiCpuid  ENDP

可以看到cpuid指令接受一个参数(在EAX中),并返回4个值,分别在EAX/EBX/ECX/EDX中。

在《Intel开发者手册》中通过如下的格式来表示:

x86架构——CPUID-LMLPHP

上图的例子中传入参数是01H,返回的值有EDX中存在有效值,它的BIT25表示SSE的支持。

 

具体参数说明

CPUID指令的使用很简单,重点只在于输入输出参数的含义,这个在《Intel开发者手册》第二卷中有详细的说明。

以之前的图为例。

EAX的值是01H,对应的说明如下:

x86架构——CPUID-LMLPHP
而EDX的值如下:

x86架构——CPUID-LMLPHP

 

以上是对CPUID指令的简单介绍。

 

06-25 08:33