简介
首先,这里要讲的不是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开发者手册》第二卷中有详细的说明。
以之前的图为例。
EAX的值是01H,对应的说明如下:
而EDX的值如下:
以上是对CPUID指令的简单介绍。