x86架构——CPUID

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jiangwei0512/article/details/90677659

简介

首先,这里要讲的不是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开发者手册》中通过如下的格式来表示:

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

具体参数说明

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

扫描二维码关注公众号,回复: 6476522 查看本文章

以之前的图为例。

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


而EDX的值如下:

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

猜你喜欢

转载自blog.csdn.net/jiangwei0512/article/details/90677659