最近因为个人实验的原因,需要对CPUID指令的细节内容进行详细的分析。具体到CPUID对应不同参数的执行,以及执行结束后寄存器的每一位值的含义。这里把了解到的内容进行总结,也让自己对CPUID指令执行的大致思路更加清晰。
本文主要分为几个方面:
官方对CPUID的定义为:
Opcode | Instruction | Op/En | 64-Bit Mode | Compat/Leg Mode | Description |
---|---|---|---|---|---|
0F A2 | CPUID | ZO | Valid | Valid | Returns processor identification and feature information to the EAX, EBX, ECX, and EDX registers, as determined by input entered in EAX (in some cases, ECX as well). |
Instruction Operand Encoding:
Op/En | Operand 1 | Operand 2 | Operand 3 | Operand 4 |
---|---|---|---|---|
ZO | NA | NA | NA | NA |
不是所有的处理器都支持CPUID指令的执行。EFLAGS寄存器中的ID标志(第21位)表示支持CPUID指令。如果软件过程可以设置并清除此标志,则执行该过程的处理器将支持CPUID指令。 该指令在非64位模式和64位模式下的操作相同。
CPUID指令有多种执行路径。选择哪种执行路径,大多取决于指令执行时EAX的值,有时也会受ECX值的影响。也就是说,CPUID指令的输入参数可以认为是:EAX和ECX。
总的来说,CPUID指令返回处理器标识(identification)和功能信息(feature information)。返回值存放在EAX、EBX、ECX、EDX中。返回信息依据1.3中提及的EAX和ECX来决定。具体返回信息的含义,将在3.1中详细解读。
从最初不支持CPUID指令的处理器,到逐渐支持几个EAX参数的处理器,再到后来支持多种EAX参数的处理器。这个演化的过程对于我们分析CPUID指令运行的含义是有必要的。下表是不同的处理器所能支持的参数的最大值,根据此表,我们就可以明确的知道哪些CPUID的参数,对应的处理器是暂不支持的。
CPUID返回两种类型的信息:基本信息和扩展信息。两种类型分别有对应的EAX参数范围,如下。这里我们以Intel Xeon Processors为例,可以看到对于基本信息,他所能支持的最大参数是EAX=02H;对于扩展信息,他所能支持的最大参数是80000004H。
Intel 64 or IA-32 Processors | Basic Information | Extended Function Information |
---|---|---|
Earlier Intel486 Processors | CPUID Not Implemented | CPUID Not Implemented |
Later Intel486 Processors and Pentium Processors | 01H | Not Implemented |
Pentium Pro and Pentium II Processors, Intel® Celeron® Processors | 02H | Not Implemented |
Pentium III Processors | 03H | Not Implemented |
Pentium 4 Processors | 02H | 80000004H |
Intel Xeon Processors | 02H | 80000004H |
Pentium M Processor | 02H | 80000004H |
Pentium 4 Processor supporting Hyper-Threading Technology | 05H | 80000008H |
Pentium D Processor (8xx) | 05H | 80000008H |
Pentium D Processor (9xx) | 06H | 80000008H |
Intel Core Duo Processor | 0AH | 80000008H |
Intel Core 2 Duo Processor | 0AH | 80000008H |
Intel Xeon Processor 3000, 5100, 5200, 5300, 5400 Series | 0AH | 80000008H |
Intel Core 2 Duo Processor 8000 Series | 0DH | 80000008H |
Intel Xeon Processor 5200, 5400 Series | 0AH | 80000008H |
Intel Atom Processor | 0AH | 80000008H |
Intel Core i7 Processor | 0BH | 80000008H |
我们将CPUID的执行情况分为以下几种:
下边我们分别对这几种情况的输出进行详细的分析。
在这种情况下,CPUID指令的运行相当于此时的CPUID.EAX=最大的基本信息参数。例如,以Intel Xeon Processors为例,从2中表项可知,其支持的最大基本CPUID.EAX=02H,最大扩展CPUID.EAX=80000004H。那么如果执行CPUID.EAX=03H,或CPUID.EAX=80000005H,都会返回CPUID.EAX=02H的返回值。
首先对这种情况进行说明。”CPUID.EAX的值小于等于基本信息或扩展信息的最大参数值“的含义是该参数可能(并不一定)是处理器支持的,因为CPUID.EAX的参数值并不是连续变化的,如没有对应CPUID.EAX=08H以及CPUID.EAX=0CH的返回值说明,但确实存在CPUID.EAX的基本信息的最大参数大于08H和0CH的情况。这里以Intel Core 2 Duo Processor 8000 Series为例,可知其基本信息的最大参数为0DH,但是处理器并不支持CPUID.EAX=08H或CPUID.EAX=0CH。
这种情况下,CPUID指令运行的结果为所有寄存器信息的返回值为0,即EAX=EBX=ECX=EDX=0x00000000H。
这就是常规的CPUID指令运行。下边详述每一种情况下返回值的具体信息。由于篇幅的原因,并且本人在这里描述的粒度无法达到官方文档的描述,因此下表只涉及到一部分返回值的说明。更细粒度的说明请见https://www.felixcloutier.com/x86/cpuid。
CPUID.EAX | Leaf | Description |
---|---|---|
00H | Basic CPUID Information | EAX:基本信息的最大参数值;EBX:“Genu”;ECX:“ntel” EDX:“ineI”。 |
01H | Basic CPUID Information | EAX Version Information: Type, Family, Model, and Stepping ID;EBX/ECX/EDX详见https://www.felixcloutier.com/x86/cpuid。 |
02H | Basic CPUID Information | EAX/EBX/ECX/EDX:Cache和TLB信息。 |
03H | Basic CPUID Information | 除Pentium III processor,EAX/EBX/EAC/EDX保留;Pentium III processor,EAX/EBX保留,ECX/EDX表示PSN(processor serial number)。 |
04H | Deterministic Cache Parameters Leaf | Leaf 04H output depends on the initial value in ECX。详见https://www.felixcloutier.com/x86/cpuid。 |
05H | MONITOR/MWAIT Leaf | EAX Bits 15 - 00: Smallest monitor-line size in bytes,Bits 31 - 16: Reserved = 0;EBX Bits 15 - 00: Largest monitor-line size in bytes ,Bits 31 - 16: Reserved = 0;ECX Bit 00: Enumeration of Monitor-Mwait extensions supported,Bit 01: Supports treating interrupts as break-event for MWAIT, even when interrupts disabled,Bits 31 - 02: Reserved。 |
06H | Thermal and Power Management Leaf | 详见https://www.felixcloutier.com/x86/cpuid。 |
07H | Structured Extended Feature Flags Enumeration Leaf | 返回值与ECX有关。该返回值主要是处理器的大量扩展特性,通过标志位来标识是否具有该特性。这些特性的具体含义可参见此文:关于/proc/cpuinfo文件。 |
09H | Direct Cache Access Information Leaf | EAX Value of bits [31:0] of IA32_PLATFORM_DCA_CAP MSR (address 1F8H);EBX Reserved;ECX Reserved;EDX Reserved。 |
0AH | Architectural Performance Monitoring Leaf | 详见https://www.felixcloutier.com/x86/cpuid。 |
0BH | Extended Topology Enumeration Leaf | CPUID leaf 1FH is a preferred superset to leaf 0BH;Intel 建议在使用EAX=0BH之前检查EAX=1F是否存在。返回值与ECX有关。 |
… | … | … |
40000000H -4FFFFFFFH | Unimplemented CPUID Leaf Functions | 无效。现存的CPU处理器将不会返回CPU的相关信息和功能特性信息。 |
80000000H | Extended Function CPUID Information | EAX为CPU扩展信息的最大参数值. EBX Reserved. ECX Reserved. |
80000001H | Extended Function CPUID Information | 详见https://www.felixcloutier.com/x86/cpuid。 |
80000002H | Extended Function CPUID Information | EAX Processor Brand String. EBX Processor Brand String Continued. ECX Processor Brand String Continued. EDX Processor Brand String Continued. |
80000003H | Extended Function CPUID Information | EAX Processor Brand String Continued. EBX Processor Brand String Continued. ECX Processor Brand String Continued. EDX Processor Brand String Continued. |
… | … | … |
这里主要特殊说明CPUID.EAX=40000000H-4FFFFFFFH的情况。上表也已说明。如果参数值在此区间,为无效。现存的CPU处理器将不会返回CPU的相关信息和功能特性信息。