CPUID
CPUID简介
CPUID 是 x86/x86-64 架构中一条用于查询处理器硬件信息的汇编指令,由 Intel 于 1993 年在 Pentium 处理器中首次引入,目前已成为所有 x86 处理器(包括 Intel、AMD、VIA 等厂商产品)的标准功能。通过执行 CPUID 指令,软件可以获取处理器的制造商、型号、支持的指令集、缓存配置、虚拟化技术等关键信息。
一、基本原理
CPUID 指令的工作机制基于输入参数和输出结果的对应关系:
- 输入:通过设置
EAX
寄存器(32 位模式)或RAX
寄存器(64 位模式)的值,指定要查询的信息类型(称为“功能号”)。 - 执行:执行
CPUID
指令后,处理器会根据输入的功能号,将对应的信息写入EAX
、EBX
、ECX
、EDX
四个寄存器(64 位模式下扩展为RAX
、RBX
、RCX
、RDX
)。 - 输出:软件从这四个寄存器中读取数据,解析出具体的硬件信息。
二、使用方法(汇编层面)
使用 CPUID 指令的基本步骤如下(以 32 位汇编为例):
- 向
EAX
写入功能号(如0x0
、0x1
等); - 执行
CPUID
指令; - 从
EAX
、EBX
、ECX
、EDX
读取结果并解析。
示例代码(获取处理器制造商信息):
mov eax, 0x0 ; 功能号 0:查询基本信息(含制造商ID)
cpuid ; 执行CPUID指令
; 结果解析:EBX、EDX、ECX 组合为制造商字符串(共12字节)
; 例如:Intel处理器的结果为 "GenuineIntel"
EDK2中获取CPUID information的函数
/**Retrieves CPUID information.Executes the CPUID instruction with EAX set to the value specified by Index.This function always returns Index.If Eax is not NULL, then the value of EAX after CPUID is returned in Eax.If Ebx is not NULL, then the value of EBX after CPUID is returned in Ebx.If Ecx is not NULL, then the value of ECX after CPUID is returned in Ecx.If Edx is not NULL, then the value of EDX after CPUID is returned in Edx.This function is only available on IA-32 and x64.@param Index The 32-bit value to load into EAX prior to invoking the CPUIDinstruction.@param RegisterEax A pointer to the 32-bit EAX value returned by the CPUIDinstruction. This is an optional parameter that may be NULL.@param RegisterEbx A pointer to the 32-bit EBX value returned by the CPUIDinstruction. This is an optional parameter that may be NULL.@param RegisterEcx A pointer to the 32-bit ECX value returned by the CPUIDinstruction. This is an optional parameter that may be NULL.@param RegisterEdx A pointer to the 32-bit EDX value returned by the CPUIDinstruction. This is an optional parameter that may be NULL.@return Index.**/
UINT32
EFIAPI
AsmCpuid (IN UINT32 Index,OUT UINT32 *RegisterEax OPTIONAL,OUT UINT32 *RegisterEbx OPTIONAL,OUT UINT32 *RegisterEcx OPTIONAL,OUT UINT32 *RegisterEdx OPTIONAL)
{_asm {mov eax, Indexcpuidpush ecxmov ecx, RegisterEaxjecxz SkipEaxmov [ecx], eax
SkipEax:mov ecx, RegisterEbxjecxz SkipEbxmov [ecx], ebx
SkipEbx:pop eaxmov ecx, RegisterEcxjecxz SkipEcxmov [ecx], eax
SkipEcx:mov ecx, RegisterEdxjecxz SkipEdxmov [ecx], edx
SkipEdx:mov eax, Index}
}
三、核心功能号及对应信息
CPUID 的功能号分为基本功能(EAX=0x0
至 EAX=0x7FFFFFFF
)和扩展功能(EAX=0x80000000
及以上),不同功能号对应不同的查询内容。以下是常用功能号:
1. 基本功能(EAX=0x0 ~ 0x7)
-
EAX=0x0:查询基本信息
- 输出:
EAX
存储“最大基本功能号”(表示支持的最高基本功能号);EBX
、EDX
、ECX
组合为 12 字节的制造商 ID 字符串(如 Intel 为47656E75 696E6547 6C656E74
,对应 ASCII 字符串“GenuineIntel”)。
- 输出:
-
EAX=0x1:查询处理器型号与特征
- 输出:
EAX
包含处理器家族、型号、步进信息(需通过位运算解析);EDX
和ECX
包含处理器支持的特征标志(如是否支持 SSE、PAE、虚拟化技术等)。
例如:EDX
的第 25 位为 1 表示支持 MMX 指令集;ECX
的第 5 位为 1 表示支持 VT-x 虚拟化技术。
- 输出:
-
EAX=0x2:查询缓存与 TLB 配置
- 输出:
EAX
、EBX
、ECX
、EDX
共同描述一级缓存(L1)、二级缓存(L2)的大小、关联性、行大小等信息(格式较复杂,需参考厂商文档)。
- 输出:
-
EAX=0x4:查询缓存层次结构
- 输入:
ECX
可指定缓存层级(如ECX=0
表示 L1 缓存); - 输出:
EAX
包含缓存类型(数据缓存/指令缓存/统一缓存)、大小、共享程度等信息。
- 输入:
-
EAX=0x7:查询扩展特征(需配合
ECX=0x0
)- 输出:
EBX
、ECX
、EDX
包含更高级的特征标志,如是否支持 AVX2、SGX 安全技术、TSX 事务内存等。
- 输出:
2. 扩展功能(EAX=0x80000000 ~ 0x8000001F)
主要用于查询 64 位支持、处理器名称、扩展特征等(最初为 AMD 定义,后被广泛支持)。
-
EAX=0x80000000:查询最大扩展功能号
- 输出:
EAX
存储“最大扩展功能号”(如0x8000001A
表示支持该功能号及以下的扩展功能)。
- 输出:
-
EAX=0x80000002 ~ 0x80000004:查询处理器名称
- 输出:这三个功能号的
EAX
、EBX
、ECX
、EDX
组合为 48 字节的处理器名称字符串(如“Intel® Core™ i7-10700K CPU @ 3.80GHz”)。
- 输出:这三个功能号的
-
EAX=0x80000001:查询扩展特征
- 输出:
EDX
和ECX
包含 64 位支持(如EDX
第 29 位为 1 表示支持 64 位模式)、页大小扩展(PSE)等特征。
- 输出:
-
EAX=0x80000008:查询地址总线宽度
- 输出:
EAX
低 8 位表示物理地址总线宽度(如 39 表示支持 512GB 物理内存),次 8 位表示虚拟地址总线宽度(如 48 表示支持 256TB 虚拟内存)。
- 输出:
四、关键应用场景
-
软件兼容性检测:
程序启动时通过 CPUID 检查处理器是否支持所需指令集(如 AVX2、SSE4.2),避免执行不支持的指令导致崩溃。例如:视频编码软件会检测 AVX 支持以启用高效计算。 -
系统优化:
操作系统根据 CPUID 结果调整调度策略(如多核处理器的负载均衡)、启用硬件加速(如利用 AES-NI 指令加速加密)。 -
硬件信息展示:
诊断工具(如 CPU-Z、鲁大师)通过 CPUID 读取处理器型号、缓存大小、制造商等信息并展示给用户。 -
虚拟化与安全:
虚拟机监控程序(如 VMM)通过 CPUID 向虚拟机暴露有限的硬件信息(控制虚拟化特征可见性);安全软件利用 CPUID 检测硬件安全功能(如 SGX enclaves)。
五、注意事项
- 厂商差异:部分功能号(如扩展功能)的具体含义可能因厂商(Intel/AMD)略有不同,需参考对应厂商的 CPUID 手册。
- 权限限制:多数 CPUID 功能可在用户态执行,但部分敏感信息(如 SGX 密钥相关)可能需要内核态权限。
- 兼容性:极少数老处理器(如 486 及更早)不支持 CPUID 指令,需通过其他方式(如检测特定指令)判断。
总结
CPUID 是软件与 x86 处理器交互的核心接口,它让软件能够“识别”硬件特性,从而实现兼容性保障、性能优化和功能扩展。无论是操作系统、驱动程序还是应用软件,都依赖 CPUID 来适配不同的处理器环境。
CPUID的功能号
CPUID 指令通过不同的功能号(存于 EAX
寄存器)区分查询的信息类型,功能号分为基本功能(EAX=0x0~0x7FFFFFFF
)和扩展功能(EAX=0x80000000~0x8000001F
)两大类。以下是详细分类及说明:
一、基本功能号(EAX=0x0 ~ 0x7FFFFFFF)
适用于所有 x86 处理器,主要查询通用硬件信息(制造商、型号、基础指令集等)。
功能号(EAX) | 输入辅助参数(ECX) | 输出寄存器及含义 | 核心信息说明 | 应用场景 |
---|---|---|---|---|
0x0 | 无 | - EAX :最大基本功能号(处理器支持的最高基本功能号)- EBX 、EDX 、ECX :12字节制造商ID字符串(按EBX→EDX→ECX顺序拼接) | - 制造商字符串示例: Intel: "GenuineIntel" (十六进制:47656E75 696E6547 6C656E74 )AMD: "AuthenticAMD" (十六进制:41757468 656E7469 63414D44 )- EAX 结果决定后续可调用的基本功能号(如返回0x7则支持0x0~0x7) | 识别处理器制造商,判断基本功能支持范围 |
0x1 | 无 | - EAX :处理器型号信息(家族、型号、步进等,需位运算解析)- EDX :基本特征标志(bit0~31)- ECX :扩展特征标志(bit0~31) | - EAX 解析:步进(Stepping): EAX & 0xF 型号(Model): (EAX>>4) & 0xF 家族(Family): (EAX>>8) & 0xF - 特征标志示例: EDX.bit23=1 :支持MMXEDX.bit25=1 :支持SSEECX.bit5=1 :支持VT-x(Intel虚拟化) | 获取处理器型号、步进,检测基础指令集(如MMX、SSE)和虚拟化支持 |
0x2 | 无 | EAX 、EBX 、ECX 、EDX :缓存与TLB(转换检测缓冲区)配置信息(按“叶片”格式存储,需厂商文档解析) | 描述L1(指令/数据)、L2缓存的大小、行大小、关联性,以及TLB的页大小支持(如4KB、2MB页)。格式较复杂,不同厂商可能有差异。 | 系统内存管理优化(如根据缓存行大小调整数据对齐) |
0x4 | ECX=N (N=0,1,2…:指定缓存层级,0=L1,1=L2等) | - EAX :缓存类型(bit04)、缓存级别(bit57)、可共享性(bit10~12)- EBX :缓存行大小(bit011)、总集合数(bit1227)- ECX :缓存物理_line索引(仅部分处理器支持)- EDX :缓存大小(按公式计算:(EDX+1) * (EBX>>12 +1) * (EAX&0x1F +1) * (EBX&0xFFF +1) ) | 明确指定层级的缓存细节,如: L1数据缓存:类型=数据缓存(0x2)、级别=1、大小=32KB L3缓存:类型=统一缓存(0x3)、级别=3、多核心共享 | 性能优化(如根据缓存大小调整数据块分配)、内存访问策略设计 |
0x7 | ECX=0x0 (基础扩展特征)ECX=0x1 (SGX相关)等 | - EBX 、ECX 、EDX :高级特征标志- EAX :最大子功能号(支持的最高ECX值) | 特征标志示例:EBX.bit5=1 :支持AVX2指令集EBX.bit12=1 :支持SGX(Intel安全 enclaves)EBX.bit29=1 :支持RDSEED(随机数生成) | 检测高级指令集(如AVX2、AVX-512)、硬件安全功能(如SGX) |
0xB | ECX=0x0 (NUMA节点信息)ECX=0x1 (核心拓扑)等 | - EAX :节点ID、核心数- EBX :线程数、节点关联信息- ECX :缓存共享拓扑 | 描述处理器的NUMA(非统一内存访问)结构、核心与线程的拓扑关系(如物理核心数、逻辑线程数) | 多线程/多核优化(如进程绑定到特定核心)、NUMA-aware内存分配 |
0xD | ECX=0x0 (XCR0支持的状态)ECX=0x1 (XSAVE区域大小)等 | - EAX 、EDX :XCR0寄存器支持的状态(如AVX、MPX等扩展寄存器状态)- EBX :XSAVE区域大小 | 检测处理器对XSave/XRestore指令的支持(用于保存/恢复扩展寄存器状态,如AVX的YMM寄存器) | 操作系统上下文切换(保存扩展寄存器状态)、多媒体程序状态管理 |
二、扩展功能号(EAX=0x80000000 ~ 0x8000001F)
最初由AMD定义,后被广泛支持,主要查询64位相关特性、处理器名称等扩展信息。
功能号(EAX) | 输入辅助参数(ECX) | 输出寄存器及含义 | 核心信息说明 | 应用场景 |
---|---|---|---|---|
0x80000000 | 无 | EAX :最大扩展功能号(处理器支持的最高扩展功能号) | 如返回0x8000001A ,表示支持0x80000000 到0x8000001A 的扩展功能号。 | 判断扩展功能支持范围 |
0x80000001 | 无 | - EDX :扩展特征标志(bit0~31)- ECX :扩展特征标志(bit32~63,部分处理器支持) | 特征标志示例:EDX.bit29=1 :支持64位模式(Long Mode)EDX.bit11=1 :支持1GB大页ECX.bit0=1 :支持LAHF/SAHF指令(64位模式兼容) | 检测64位处理器支持、大页内存支持 |
0x80000002 0x80000003 0x80000004 | 无 | 每个功能号的EAX 、EBX 、ECX 、EDX 各返回4字节ASCII字符,共48字节(3个功能号×16字节) | 拼接后为处理器完整名称,例如: Intel i7-10700K: "Intel(R) Core(TM) i7-10700K CPU @ 3.80GHz" AMD Ryzen 5 5600X: "AMD Ryzen 5 5600X 6-Core Processor" | 硬件信息展示(如CPU-Z工具显示处理器型号) |
0x80000008 | 无 | - EAX.bit0~7 :物理地址总线宽度(如39表示支持512GB物理内存)- EAX.bit8~15 :虚拟地址总线宽度(如48表示支持256TB虚拟内存) | 明确处理器可寻址的最大物理/虚拟内存范围,64位处理器通常支持48位虚拟地址和39/48位物理地址。 | 操作系统内存管理(如确定最大内存支持、页表结构设计) |
0x8000000A | 无 | - EAX :处理器是否支持Secure Virtual Machine(SVM,AMD虚拟化技术)- EBX :SVM相关特征 | 检测AMD处理器的SVM虚拟化技术(类似Intel的VT-x),支持内存加密、嵌套虚拟化等功能。 | 虚拟化软件(如KVM)判断AMD处理器的虚拟化支持 |
三、厂商特定功能号
部分功能号为Intel/AMD专属,用于查询厂商特有特性:
- Intel专属:
EAX=0x12
(SGX详细配置)、EAX=0x14
(性能监控计数器)等。 - AMD专属:
EAX=0x80000019
(缓存详细信息)、EAX=0x8000001A
(内存加密支持)等。
四、注意事项
- 功能号支持性:并非所有处理器都支持全部功能号,需先通过
0x0
(基本)和0x80000000
(扩展)查询最大功能号,避免调用不支持的功能。 - 解析复杂性:部分功能号(如
0x2
缓存配置)的输出格式无统一标准,需参考对应厂商的《CPUID手册》(如Intel SDM、AMD Programmer’s Manual)。 - 64位兼容性:64位模式下功能号和解析逻辑与32位一致,仅寄存器扩展为64位(
RAX
、RBX
等),但输出有效信息仍以低32位为主。
通过功能号,软件可精准获取处理器硬件特性,是实现兼容性、性能优化和功能扩展的核心接口。
CPUID的功能号0
CPUID 功能号 0
(即执行 CPUID
前将 EAX
寄存器设置为 0x0
)是 x86 处理器中 最基础、最核心的 CPUID 功能,所有支持 CPUID 指令的处理器(Pentium 及之后的 x86 处理器)都必须实现该功能。其核心作用是获取处理器的制造商标识和支持的最大基本功能号,为后续查询其他硬件信息奠定基础。
一、基本信息
项目 | 说明 |
---|---|
功能号(EAX输入) | 0x0 |
核心作用 | 1. 获取处理器制造商唯一标识(12字节ASCII字符串) 2. 返回处理器支持的“最大基本功能号”(后续可调用的基本功能号上限) |
适用处理器 | 所有支持CPUID指令的x86/x86-64处理器(Pentium及之后,无厂商限制) |
必要性 | 必实现功能(Intel标准规定,所有支持CPUID的处理器必须实现) |
二、使用方法(汇编流程)
步骤 | 操作(32位模式) | 操作(64位模式) | 说明 |
---|---|---|---|
1 | mov eax, 0x0 | mov rax, 0x0 | 设置输入功能号为0 |
2 | cpuid | cpuid | 执行CPUID指令,处理器返回结果 |
3 | 读取EAX 、EBX 、EDX 、ECX | 读取RAX (低32位)、RBX (低32位)、RDX (低32位)、RCX (低32位) | 64位模式下仅低32位有效 |
三、输出结果解析
输出寄存器 | 含义及解析方法 | 示例(Intel处理器) |
---|---|---|
EAX | 最大基本功能号(处理器支持的最高基本功能号,范围0x0~0x7FFFFFFF )→ 用于判断后续可调用的基本功能号(如 0x1 、0x4 等)是否有效 | EAX=0x7 (支持0x0~0x7 基本功能号) |
EBX | 制造商ID字符串的前4字节(按小端序反转后转ASCII) | EBX=0x756E6547 → 反转后为"Genu" |
EDX | 制造商ID字符串的中间4字节(按小端序反转后转ASCII) | EDX=0x49656E67 → 反转后为"ineI" |
ECX | 制造商ID字符串的后4字节(按小端序反转后转ASCII) | ECX=0x6C65746E → 反转后为"ntel" |
拼接结果 | EBX+EDX+ECX 形成12字节制造商标识字符串 | "GenuineIntel" (Intel处理器) |
四、常见制造商ID字符串
制造商 | 12字节ASCII字符串 | 对应十六进制(EBX+EDX+ECX) |
---|---|---|
Intel | "GenuineIntel" | 0x756E6547 0x49656E67 0x6C65746E |
AMD | "AuthenticAMD" | 0x68747541 0x69746E65 0x444D4163 |
VIA | "VIA CPUeon" | 0x76694156 0x65726F43 0x00646E65 |
海光(Hygon) | "HygonGenuineCPU" | 0x67796F48 0x6E6F6779 0x6E657543 |
五、应用场景
场景 | 说明 |
---|---|
制造商识别 | 操作系统/工具通过字符串区分Intel/AMD等厂商,加载对应优化代码(如驱动、调度策略) |
功能支持预检测 | 软件通过EAX 值判断高阶基本功能号(如0x7 )是否支持,避免调用无效功能 |
硬件真伪验证 | 验证字符串是否匹配官方标识(如假冒Intel处理器可能无法返回"GenuineIntel" ) |
六、注意事项
注意点 | 说明 |
---|---|
无厂商差异 | 输出格式(寄存器含义、字符串规则)完全统一,与厂商无关,可作为通用接口 |
32/64位兼容 | 64位模式下仅寄存器宽度不同(用RAX 等),结果存于低32位,逻辑与32位一致 |
不可修改性 | 制造商字符串固化在硬件中,无法通过软件修改,确保身份标识唯一性 |
必选第一步 | 所有依赖CPUID的软件需先调用功能号0,再基于结果调用其他功能号 |
CPUID的功能号1
CPUID 功能号 1
(执行指令前将 EAX
/RAX
设为 0x1
)是 x86 处理器中 核心硬件信息查询功能,在功能号 0
确认制造商和基本功能范围后,功能号 1
进一步提供处理器的型号细节(步进、家族、型号)和基础/扩展特征标志(指令集、虚拟化、硬件加速等支持情况),是软件适配硬件、启用优化的关键依据。
一、功能定位与核心价值
功能号 1
的设计目标是解决两个核心问题:
- “这是哪款具体的处理器”:通过步进、型号、家族等字段,精确识别处理器型号(如 Intel Core i7-10700K、AMD Ryzen 5 5600X);
- “这颗处理器能做什么”:通过
EDX
/ECX
寄存器的特征标志,快速判断是否支持关键功能(如 SSE 指令集、虚拟化技术、硬件加密等)。
它是所有依赖硬件特性的软件(操作系统、驱动、虚拟机、多媒体程序)的“核心查询接口”,几乎所有硬件检测工具(如 CPU-Z、鲁大师)都依赖功能号 1
获取核心参数。
二、使用方法(汇编实现)
功能号 1
的调用流程与功能号 0
类似,无需辅助参数(ECX
输入值不影响结果),但需先通过功能号 0
确认“最大基本功能号 ≥ 1”(否则调用无效)。
1. 32 位模式示例
; 第一步:先通过功能号0确认支持功能号1(可选但推荐)
mov eax, 0x0
cpuid
cmp eax, 0x1 ; 检查最大基本功能号是否≥1
jb .unsupported ; 若<1,说明不支持功能号1; 第二步:调用功能号1
mov eax, 0x1 ; 输入功能号1
cpuid ; 执行CPUID,结果写入EAX/EBX/EDX/ECX
; 后续:解析寄存器值(如EAX拆型号,EDX/ECX查特征)
2. 64 位模式示例
mov rax, 0x0 ; 先确认支持性
cpuid
cmp eax, 0x1 ; 64位下仍用EAX(低32位)判断
jb .unsupportedmov rax, 0x1 ; 64位用RAX,输入值0x1
cpuid ; 结果存于RAX(低32位)、RBX(低32位)等
; 注意:64位模式下所有结果仅存于寄存器的低32位,高32位无意义
三、输出结果深度解析
执行 CPUID
后,EAX
、EBX
、EDX
、ECX
四个寄存器各承载不同信息,其中 EAX
(型号信息)和 EDX/ECX
(特征标志)是解析重点。
1. EAX 寄存器:处理器型号与版本信息
EAX
是 32 位字段,需按位拆分解析,不同字段对应处理器的“身份细节”,格式由 Intel 统一定义(AMD 兼容此格式)。
字段位置(EAX 位范围) | 字段名称 | 含义与解析方法 | 示例(Intel i7-10700K,EAX=0x000906EA) |
---|---|---|---|
Bit 3 ~ Bit 0 | 步进 ID(Stepping) | 处理器生产批次的细微版本(如 0x0A 表示第 10 个步进),用于区分硬件修订版 | 0x0A(10) |
Bit 7 ~ Bit 4 | 基础型号(Base Model) | 处理器型号的“基础部分”,需与“扩展型号”组合才能得到完整型号 | 0x0E(14) |
Bit 11 ~ Bit 8 | 基础家族(Base Family) | 处理器家族的“基础部分”,需与“扩展家族”组合得到完整家族 | 0x06(6,对应 Intel “Core” 家族) |
Bit 13 ~ Bit 12 | 处理器类型(Type) | 区分处理器用途: - 0x00:通用桌面/移动处理器 - 0x01:服务器处理器(如 Xeon) - 0x02:嵌入式处理器 | 0x00(通用) |
Bit 19 ~ Bit 16 | 扩展型号(Extended Model) | 补充基础型号,完整型号 = 基础型号 +(扩展型号 << 4) | 0x09(9)→ 完整型号=0x0E + (0x09<<4)=0x9E(158) |
Bit 27 ~ Bit 20 | 扩展家族(Extended Family) | 补充基础家族,完整家族 = 基础家族 + 扩展家族(仅当基础家族=0x0F时需叠加) | 0x00 → 完整家族=0x06 + 0x00=0x06 |
Bit 31 ~ Bit 28 | 保留(Reserved) | 无含义,固定为 0 | 0x00 |
型号解析逻辑:以 Intel 为例,完整型号(Model)需组合“扩展型号”和“基础型号”,例如:
- 扩展型号=0x09,基础型号=0x0E → 完整型号=0x0E + (0x09 << 4) = 0x9E(十进制 158);
- 再结合完整家族=0x06,可通过 Intel 官方型号表查询到“0x06_0x9E”对应“Intel Core i7-10700K”。
2. EBX 寄存器:处理器拓扑与 APIC 信息
EBX
主要承载多核/多线程相关的拓扑信息,核心字段是 本地 APIC ID(Advanced Programmable Interrupt Controller ID),用于在多核系统中唯一标识每个逻辑核心/线程。
字段位置(EBX 位范围) | 字段名称 | 含义与应用 |
---|---|---|
Bit 31 ~ Bit 24 | 本地 APIC ID | 多核处理器中,每个逻辑核心/线程的唯一 ID(如 8 核 16 线程处理器,APIC ID 为 0~15) → 用于操作系统调度(绑定进程到特定核心)、中断分配 |
Bit 23 ~ Bit 0 | 初始 APIC ID/拓扑 | 部分处理器(如 AMD)用于表示核心数或节点信息,格式因厂商而异,需参考手册 |
示例:Intel i7-10700K(8 核 16 线程)的某个逻辑线程,EBX=0x00000008
→ 本地 APIC ID=8,标识该线程是第 9 个逻辑核心。
3. EDX 寄存器:基础特征标志(Bit 0~31)
EDX
存储处理器的基础功能支持情况,每一位(Bit)对应一个功能,1
表示支持,0
表示不支持。这些特征是 x86 架构的“基础能力”,涵盖浮点、多媒体、内存管理等。
Bit 位 | 标志全称(英文) | 标志含义(中文) | 核心作用与应用场景 |
---|---|---|---|
0 | Floating-Point Unit (FPU) | 浮点处理单元支持 | 处理器内置硬件浮点运算单元(FPU),用于执行浮点运算(如科学计算、3D 图形渲染)。 → 所有现代 x86 处理器均支持,是运行需要浮点计算的程序(如 MATLAB、游戏引擎)的基础。 |
1 | Virtual 8086 Mode Enhancements (VME) | 虚拟 8086 模式增强 | 增强实模式下的虚拟化支持,允许操作系统在虚拟 8086 模式下更高效地管理多个实模式任务(如早期 DOS 程序多任务运行)。 → 主要用于支持 legacy 实模式程序的操作系统(如早期 Windows)。 |
2 | Debugging Extensions (DE) | 调试扩展 | 支持调试寄存器(DR0~DR7)的扩展功能,允许设置断点时区分指令执行和数据访问(如指令断点、数据读写断点)。 → 是调试器(如 GDB、Visual Studio Debugger)实现高级断点功能的基础。 |
3 | Page Size Extensions (PSE) | 页大小扩展 | 支持 4MB 大页内存(传统 x86 页大小为 4KB),减少页表项数量,提升内存访问效率。 → 操作系统(如 Linux、Windows)可通过大页优化内存密集型程序(如数据库、虚拟机)的性能。 |
4 | Time Stamp Counter (TSC) | 时间戳计数器 | 内置 64 位计数器(TSC),随处理器时钟周期递增,用于高精度计时(纳秒级)。 → 是操作系统时钟(如 gettimeofday )、性能分析工具(如 perf)的核心计时源。 |
5 | Model Specific Registers (MSR) | 型号专用寄存器访问支持 | 允许通过指令(RDMSR /WRMSR )访问处理器的型号专用寄存器(MSR),用于配置处理器高级功能(如频率调节、缓存控制)。 → 内核和驱动程序通过 MSR 实现硬件级优化(如 Intel SpeedStep 节能技术)。 |
6 | Physical Address Extension (PAE) | 物理地址扩展 | 支持 36 位物理地址总线,突破传统 32 位处理器 4GB 物理内存限制,最大可访问 64GB 内存。 → 是 32 位操作系统支持超过 4GB 内存的基础(如 32 位 Windows Server 的 PAE 模式)。 |
7 | Machine Check Exception (MCE) | 机器检查异常 | 支持硬件错误检测(如内存校验错误、缓存错误),当检测到错误时触发异常,允许操作系统记录或恢复。 → 服务器级处理器的关键可靠性功能(如 Xeon 处理器的错误恢复机制)。 |
8 | CMPXCHG8B Instruction (CX8) | 8 字节比较交换指令支持 | 支持 CMPXCHG8B 指令,用于原子操作(8 字节数据的比较并交换),是多线程同步的基础。 → 保证多线程环境下数据一致性(如操作系统内核的锁机制、数据库事务)。 |
9 | Advanced Programmable Interrupt Controller (APIC) | 高级可编程中断控制器支持 | 支持本地 APIC(处理器内置中断控制器),用于多核系统中中断的分发和管理(如将中断定向到特定核心)。 → 是多核处理器正常工作的基础,没有 APIC 则无法支持多核心。 |
11 | Memory Type Range Registers (MTRR) | 内存类型范围寄存器支持 | 允许操作系统配置不同内存区域的类型(如缓存、非缓存、写回、写透),优化内存访问效率。 → 显卡驱动通过 MTRR 将显存配置为 “非缓存”,避免显卡数据与缓存不一致。 |
13 | Machine Check Architecture (MCA) | 机器检查架构 | 扩展 MCE 功能,提供更详细的硬件错误分类和报告机制(如区分内存错误、总线错误)。 → 服务器系统用于硬件故障诊断和预警(如通过 BMC 记录错误日志)。 |
15 | Page Attribute Table (PAT) | 页属性表 | 扩展 PSE 和 MTRR 功能,允许对单个页设置内存属性(如缓存策略),比 MTRR 更精细。 → 虚拟化软件(如 KVM)通过 PAT 为虚拟机配置不同内存区域的缓存策略。 |
16 | 36-bit Page Size Extension (PSE36) | 36 位页大小扩展 | 结合 PSE 和 PAE,支持 2MB/4MB 大页的同时访问超过 4GB 内存,提升大内存系统的页表效率。 → 64 位系统中仍用于优化大内存访问(如数据库服务器的大页配置)。 |
19 | CLFLUSH Instruction (CLFSH) | CLFLUSH 指令支持 | 支持 CLFLUSH 指令,用于手动刷新缓存行(将缓存中的数据写回内存并失效缓存)。 → 实时系统或硬件驱动中,确保数据立即同步到内存(如磁盘控制器驱动刷新缓存)。 |
21 | Advanced Configuration and Power Interface (ACPI) | ACPI 支持 | 支持高级配置与电源接口标准,允许操作系统控制处理器功耗(如睡眠、唤醒、频率调节)。 → 是笔记本电脑节能、服务器电源管理的基础(如 Windows 的 “平衡” 电源计划)。 |
23 | MMX Technology | MMX 多媒体指令集 | 支持 64 位向量运算指令,用于加速多媒体处理(如视频编解码、音频混合)。 → 早期视频播放器(如 Windows Media Player)依赖 MMX 提升播放流畅度。 |
24 | FXSAVE/FXRSTOR Instructions (FXSR) | FXSAVE/FXRSTOR 指令支持 | 支持快速保存 / 恢复浮点寄存器和 MMX 寄存器状态,简化上下文切换(如进程切换、中断处理)。 → 操作系统内核通过这两条指令高效管理多任务的浮点状态。 |
25 | Streaming SIMD Extensions (SSE) | SSE 指令集 | 支持 128 位单精度浮点向量运算,扩展 MMX 的多媒体处理能力,新增数据类型和指令。 → 3D 游戏、图像编辑软件(如 Photoshop)通过 SSE 加速图形渲染。 |
26 | Streaming SIMD Extensions 2 (SSE2) | SSE2 指令集 | 扩展 SSE 至 128 位双精度浮点和 64 位整数运算,是 64 位 x86 架构的基础指令集。 → 64 位 Windows 和 Linux 的最低要求,现代软件(如浏览器、视频编码器)普遍依赖。 |
28 | Hyper-Threading Technology (HTT) | 超线程技术 | 支持单物理核心模拟多个逻辑线程(如 8 核处理器模拟 16 线程),提升多线程任务吞吐量。 → 操作系统通过 HTT 识别逻辑线程,优化多任务调度(如同时运行多个后台程序)。 |
4. ECX 寄存器:扩展特征标志(Bit 0~31)
ECX
存储 较新的扩展功能支持情况,主要涵盖 2006 年后引入的技术(如高级指令集、虚拟化、硬件加密),是现代软件优化的关键依据。
Bit 位 | 标志全称(英文) | 标志含义(中文) | 核心作用与应用场景 |
---|---|---|---|
0 | Streaming SIMD Extensions 3 (SSE3) | SSE3 指令集 | 对 SSE2 的扩展,新增 13 条指令,支持复杂向量运算(如水平加法、数据洗牌),提升多媒体和信号处理效率。 → 视频编辑软件(如 Premiere Pro)用 SSE3 加速色彩空间转换;音频处理工具(如 Audacity)优化音频滤波算法。 |
1 | PCLMULQDQ Instruction | 多项式乘法指令支持 | 支持 PCLMULQDQ 指令,用于快速执行多项式模运算(如 GF (2^n) 域乘法),是密码学和数据校验的基础。 → 用于加速 CRC32 校验(如文件传输完整性校验)、AES-GCM 模式加密(TLS 协议的 Authenticated Encryption)。 |
2 | 64-bit Debug Store (DS-CPL) | 64 位调试存储支持 | 允许调试器在 64 位模式下存储调试信息(如断点触发记录),扩展调试器对 64 位程序的支持。 → 64 位调试工具(如 WinDbg、GDB)通过此标志启用高级调试功能(如指令跟踪)。 |
3 | MONITOR/MWAIT Instructions | MONITOR/MWAIT 指令支持 | 支持 MONITOR (监控内存地址)和 MWAIT (等待内存变化)指令,实现低功耗等待(处理器进入休眠,内存变化时唤醒)。 → 操作系统用于优化多线程同步(如替代忙等待,降低 CPU 占用);虚拟机监控程序(VMM)检测客户机内存访问。 |
5 | Virtualization Technology (VT-x) | Intel 虚拟化技术 | 支持 Intel VT-x 硬件虚拟化,允许虚拟机直接运行特权指令(如 IN /OUT ),减少 VMM 干预,提升虚拟机性能。 → 虚拟机软件(如 VMware、KVM)启用后,Windows 虚拟机运行游戏、CAD 等程序时帧率提升 50%+。 |
6 | Safer Mode Extensions (SMX) | 安全模式扩展 | 支持 Intel TXT(Trusted Execution Technology),通过硬件隔离创建 “可信执行环境”,防止恶意软件篡改关键代码。 → 企业服务器用于保护加密密钥、虚拟机监控程序等敏感组件(如金融系统的安全启动)。 |
7 | Enhanced Intel SpeedStep Technology (EIST) | 增强型 SpeedStep 技术 | 允许处理器动态调节频率和电压(如负载低时降频节能,负载高时升频提性能),平衡性能与功耗。 → 笔记本电脑通过 EIST 实现 “省电模式”(电池续航延长)和 “性能模式”(游戏时满频运行)。 |
8 | Thermal Monitor 2 (TM2) | 温度监控 2 | 增强处理器温度控制,支持更精细的过热保护(如通过降频、关闭核心避免过热损坏)。 → 服务器和高性能 PC 用于持续高负载场景(如渲染、科学计算)的硬件保护。 |
9 | Supplemental Streaming SIMD Extensions 3 (SSSE3) | SSSE3 指令集 | 对 SSE3 的补充,新增 16 条指令,强化数据打包 / 解包、整数运算能力(如字节级置换、饱和加减)。 → 图像识别算法(如 OpenCV 中的边缘检测)用 SSSE3 加速像素处理;视频编码器(如 x264)优化运动估计。 |
10 | L1 Context ID (L1CID) | L1 缓存上下文 ID 支持 | 允许处理器为不同进程标记 L1 缓存数据,进程切换时无需刷新 L1 缓存,减少切换开销。 → 多任务操作系统(如 Linux)提升进程切换速度(尤其频繁切换的服务器场景)。 |
12 | CMPXCHG16B Instruction (CX16) | 16 字节比较交换指令支持 | 支持 CMPXCHG16B 指令,用于 16 字节数据的原子操作(比较并交换),是 64 位多线程同步的基础。 → 数据库系统(如 MySQL)用其保证 128 位数据结构(如指针 + 长度)的原子更新;虚拟化软件同步大型数据结构。 |
13 | xTPR Update Control (xTPR) | xTPR 更新控制 | 允许软件控制处理器的任务优先级(TPR)更新策略,优化中断响应效率(如实时系统降低中断延迟)。 → 实时操作系统(RTOS)用于工业控制、自动驾驶等对响应时间敏感的场景。 |
14 | Advanced Vector Extensions (AVX) | AVX 指令集 | 支持 256 位向量寄存器(YMM0~YMM15)和融合乘加(FMA)指令,将单指令数据处理量从 SSE 的 128 位提升至 256 位。 → 科学计算软件(如 MATLAB)加速矩阵运算;深度学习框架(如 TensorFlow)优化神经网络前向计算。 |
19 | SSE4.1 | SSE4.1 指令集 | 新增 47 条指令,强化多媒体处理(如视频降噪)、字符串操作(如快速字符查找)和高精度算术。 → 浏览器(如 Chrome)用 SSE4.1 加速 HTML5 视频解码;Office 软件优化文本排版计算。 |
20 | SSE4.2 | SSE4.2 指令集 | 扩展 SSE4.1,新增字符串比较(如 PCMPESTRI )和哈希指令,提升文本处理和数据校验效率。 → 数据库(如 PostgreSQL)加速字符串查询(如 LIKE 语句);文件系统用其优化数据哈希计算。 |
22 | Popcount Instruction (POPCNT) | 人口计数指令支持 | 支持 POPCNT 指令,快速计算二进制数中 “1” 的个数(如 0b1011 的结果为 3),用于密码学和统计。 → 密码学算法(如 SHA-3)优化位运算;机器学习中计算特征向量的稀疏度。 |
25 | AES Instruction Set (AES-NI) | AES 硬件加密指令集 | 支持 AES 加解密的专用指令(AESENC /AESDEC 等),将软件实现的 AES 速度提升 3~10 倍。 → 浏览器用其加速 HTTPS 握手(TLS 加密);加密软件(如 VeraCrypt)加速硬盘加密。 |
26 | Advanced Encryption Standard New Instructions (AES-NI) | 同 AES-NI(部分文档重复标注,实际为同一功能) | 同上 |
27 | Secure Hash Algorithm (SHA) | SHA 硬件加速指令集 | 支持 SHA-1/SHA-256 哈希计算的专用指令(SHA1RNDS4 /SHA256RNDS2 等),提升哈希计算速度。 → 区块链节点(如比特币挖矿)加速区块哈希验证;文件校验工具(如 sha256sum )提升计算效率。 |
28 | Advanced Vector Extensions 2 (AVX2) | AVX2 指令集 | 扩展 AVX 至 256 位整数运算,支持更多数据类型(如 32 位整数向量)和指令(如广播、置换)。 → 视频编码器(如 x265)加速 4K 视频压缩;游戏引擎用其优化物理模拟(如碰撞检测)。 |
30 | RDSEED Instruction | RDSEED 随机数生成指令 | 支持 RDSEED 指令,从处理器硬件随机数生成器(HRNG)获取高熵随机数,用于密码学安全场景。 → 加密密钥生成(如 TLS 会话密钥)、随机数种子初始化(避免伪随机数预测)。 |
四、典型应用场景
功能号 1
的输出是软件适配硬件的“核心依据”,以下是常见应用场景:
1. 处理器型号展示(如 CPU-Z)
- 逻辑:工具通过解析
EAX
的“完整家族+完整型号+步进”,结合厂商型号对照表,显示用户易懂的型号名称(如“Intel Core i7-10700K @ 3.80GHz”)。 - 示例:
EAX=0x000906EA
→ 完整家族=6,完整型号=158,步进=10 → 查表对应 i7-10700K。
2. 指令集兼容性检测(如视频软件)
- 逻辑:视频编码软件(如 x264、FFmpeg)启动时,检测
ECX.Bit28
(AVX)或EDX.Bit26
(SSE2),若支持则启用对应指令集加速,否则降级到基础算法。 - 示例:检测到
ECX.Bit28=1
(支持 AVX)→ 启用 AVX 优化的编码函数,编码速度提升 30%+。
3. 虚拟化技术判断(如 VMware)
- 逻辑:虚拟机软件检测
ECX.Bit5
(Intel VT-x)或 AMD 扩展功能号0x80000001.EDX.Bit2
(SVM),若支持则启用硬件虚拟化,提升虚拟机性能。 - 示例:检测到 VT-x 支持 → 虚拟机可直接访问硬件,减少性能损耗(如游戏虚拟机帧率提升)。
4. 多核/超线程识别(如操作系统)
- 逻辑:操作系统通过
EBX
的 APIC ID 数量(如 16 个 APIC ID)和EDX.Bit28
(HTT 支持),判断物理核心数(8 核)和逻辑线程数(16 线程),优化进程调度。 - 示例:Windows 任务管理器的“性能-CPU”页面,核心数和线程数即来自功能号
1
的解析结果。
五、关键注意事项
-
型号解析需参考厂商手册:
完整型号(如0x06_0x9E
)与具体产品名称(如 i7-10700K)的对应关系无通用公式,需参考 Intel/AMD 官方发布的《CPUID 型号对照表》(如 Intel SDM 卷 3A 第 8 章)。 -
特征标志的厂商差异:
部分特征为厂商专属,需注意区分:- Intel 虚拟化技术(VT-x)在
ECX.Bit5
; - AMD 虚拟化技术(SVM)在扩展功能号
0x80000001.EDX.Bit2
,功能号1
无法检测。
- Intel 虚拟化技术(VT-x)在
-
新功能需依赖更高功能号:
2013 年后的新功能(如 AVX2、AVX-512、SGX)不在功能号1
中,需通过功能号7
(基本功能)或0x80000008
(扩展功能)查询,功能号1
仅覆盖“基础+早期扩展特征”。 -
32/64 位解析逻辑一致:
64 位模式下,虽使用RAX
/RBX
等 64 位寄存器,但功能号1
的结果仅存于寄存器的低 32 位,解析方法与 32 位完全一致,无需修改逻辑。
总结
CPUID 功能号 1
是 x86 处理器“硬件能力说明书”的核心页——它不仅能精确识别处理器型号,还能清晰列出其支持的关键功能,是操作系统、驱动、应用软件实现“硬件适配”和“性能优化”的基础。无论是日常使用的硬件检测工具,还是底层的虚拟化软件,都离不开功能号 1
提供的核心信息,其地位在 x86 软硬件交互中无可替代。