CPUID指令检查特性的方式其实非常直接通过“功能码Leaf”查询并将结果以比特位Bit的形式返回。它的工作方式不涉及复杂的内部“探测”逻辑而更像一个“问答机”——你告诉它你想知道哪方面的能力它就把对应的答案通过寄存器告诉你。指令执行输入与输出输入提问执行CPUID前需要将主功能码EAX设置为特定值。对于更细分的特性还需要设置子功能码ECX。输出答案CPU 执行后会将特性信息填入EAX、EBX、ECX、EDX四个寄存器。每个寄存器的不同比特位Bit代表一项特性的支持状态1 表示支持0 表示不支持。功能码示例基础特性查询功能码 1这是最常用的查询。将EAX设为1后执行CPUIDCPU 会在ECX和EDX中返回大量基础特性标志。下面是一些常见标志位及其含义EDX 寄存器部分常用位位特性描述0FPU是否有 x87 浮点单元4TSC是否有时间戳计数器 (RDTSC)5MSR是否支持型号特定寄存器 (RDMSR/WRMSR)6PAE是否支持物理地址扩展 (CR4.PAE)15CMOV是否支持条件传送指令23MMX是否支持 MMX 指令集25SSE是否支持 SSE 指令集26SSE2是否支持 SSE2 指令集ECX 寄存器部分常用位位特性描述0SSE3是否支持 SSE3 指令集1PCLMULQDQ是否支持 PCLMULQDQ 指令9SSSE3是否支持 SSSE3 指令集19SSE4.1是否支持 SSE4.1 指令集20SSE4.2是否支持 SSE4.2 指令集22MOVBE是否支持 MOVBE 指令23POPCNT是否支持 POPCNT 指令5VMX是否支持 Intel VT-x 硬件虚拟化 (CR4.VMXE)12XSAVE是否支持 XSAVE 指令集扩展特性查询功能码 7, 子功能码 0一些更新、更高级的特性需要通过EAX7, ECX0来查询。结果同样通过EBX、ECX、EDX返回。EBX 寄存器部分位位特性描述0FSGSBASE是否支持 RDFSBASE/WRFSBASE 指令 (CR4.FSGSBASE)3BMI1位操作指令集扩展4HLE硬件锁省略 (Transactional Synchronization)5AVX2高级向量扩展 26BMI2位操作指令集扩展 27SMEP是否支持监管模式执行保护 (CR4.SMEP)8SMAP是否支持监管模式访问保护 (CR4.SMAP)9PKU内存保护密钥 (Memory Protection Keys)10UMIP是否支持用户模式指令预防 (CR4.UMIP)ECX 寄存器部分位位特性描述0PREFETCHWT1PREFETCHWT1 指令支持1AVX512VBMIAVX-512 VBMI 指令集在 GDB 中模拟 CPUID 查询在 GDB 中可以手动模拟 CPU 的行为查看某个特定 CPU 会返回什么CPUID信息这通常用于调试虚拟机或分析二进制兼容性问题。# 进入 GDB 后我们模拟一个功能码 1 的查询 (gdb) set $eax 1 (gdb) cpuid # 执行后GDB 会模拟 CPU将结果填充到 eax, ebx, ecx, edx (gdb) info registers eax ebx ecx edx更常见的是使用 GDB 的disassemble配合x/i查看已编译好的CPUID指令然后手动计算它的结果。进阶多个“子功能码”的概念有时即使EAX相同通过设置不同的ECX子功能码也能查询到完全不同的信息。这被称为子叶Sub-leaf。示例查询扩展拓扑信息 (Leaf 0x1F); 查询 CPU 拓扑的层级 0 (ECX0) mov eax, 0x1F mov ecx, 0 ; 子功能码SMT 层级 cpuid ; EAX 返回该层级的位宽等信息 ; 查询 CPU 拓扑的层级 1 (ECX1) mov eax, 0x1F mov ecx, 1 ; 子功能码Core 层级 cpuid这种设计让CPUID可以返回非常精细和层次化的硬件拓扑信息对 NUMA 感知和 KVM 虚拟 CPU 拓扑模拟至关重要。Linux 内核中的封装在 Linux 内核中你不会看到直接使用内联汇编来反复执行CPUID。内核通过一个引导时Boot-time的一次性探测将结果缓存到全局变量中后续的检查只是一个简单的比特位测试。// Linux 内核代码简化示意 #include asm/cpufeature.h // 检查 CPU 是否支持 SMAP 特性 if (cpu_has(c, X86_FEATURE_SMAP)) { // 设置 CR4.SMAP 位 cr4_set_bits(X86_CR4_SMAP); }cpu_has()宏背后是一个对boot_cpu_data.x86_capability数组的快速查询这个数组在系统启动时已经通过CPUID填充好了因此运行时检查的开销几乎为零。总结CPUID检查特性就是这样一个机制查询设置EAX和ECX作为功能码。获取CPU 将特性标志以比特位形式填回EAX、EBX、ECX、EDX。解析软件如操作系统或 VMM读取这些位决定如何配置自己的功能。它简单、高效是 CPU 与系统软件之间最基础、最核心的通信协议之一。