CPUID指令详解

CPUID详解

最近因为个人实验的原因,需要对CPUID指令的细节内容进行详细的分析。具体到CPUID对应不同参数的执行,以及执行结束后寄存器的每一位值的含义。这里把了解到的内容进行总结,也让自己对CPUID指令执行的大致思路更加清晰。

本文主要分为几个方面:

  1. CPUID指令概述
  2. 不同处理器支持的参数范围
  3. CPUID的返回值分析

一、CPUID指令概述

1.1 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
1.2 判断当前处理器是否支持CPUID指令

不是所有的处理器都支持CPUID指令的执行。EFLAGS寄存器中的ID标志(第21位)表示支持CPUID指令。如果软件过程可以设置并清除此标志,则执行该过程的处理器将支持CPUID指令。 该指令在非64位模式和64位模式下的操作相同。

1.3 CPUID指令的输入参数

CPUID指令有多种执行路径。选择哪种执行路径,大多取决于指令执行时EAX的值,有时也会受ECX值的影响。也就是说,CPUID指令的输入参数可以认为是:EAX和ECX。

1.4 CPUID指令的输出

总的来说,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的执行情况分为以下几种:

  1. CPUID.EAX的值大于基本信息或扩展信息的最大参数值。
  2. CPUID.EAX的值小于等于基本信息或扩展信息的最大参数值,但当前处理器不支持此参数。
  3. CPUID.EAX的值小于等于基本信息或扩展信息的最大参数值,处理器也支持该参数。
  4. 其他

下边我们分别对这几种情况的输出进行详细的分析。

3.1 CPUID.EAX的值大于基本信息或扩展信息的最大参数值

在这种情况下,CPUID指令的运行相当于此时的CPUID.EAX=最大的基本信息参数。例如,以Intel Xeon Processors为例,从2中表项可知,其支持的最大基本CPUID.EAX=02H,最大扩展CPUID.EAX=80000004H。那么如果执行CPUID.EAX=03H,或CPUID.EAX=80000005H,都会返回CPUID.EAX=02H的返回值。

3.2 CPUID.EAX的值小于等于基本信息或扩展信息的最大参数值,但当前处理器不支持此参数。

首先对这种情况进行说明。”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。

3.3 CPUID.EAX的值小于等于基本信息或扩展信息的最大参数值,当前处理器也支持此参数。

这就是常规的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.
3.4 其他

这里主要特殊说明CPUID.EAX=40000000H-4FFFFFFFH的情况。上表也已说明。如果参数值在此区间,为无效。现存的CPU处理器将不会返回CPU的相关信息和功能特性信息。

四、参考文档和文章

关于/proc/cpuinfo文件

linux – / proc / cpuinfo中的标志是什么意思?

CPUID (CPU Identification)

CPUID — CPU Identification

你可能感兴趣的:(学习)