UEFI驱动开发:如何通过代码获取CPU VCore及最大工作电压?
UEFI下读取CPU核心电压及最大工作电压的实现方案
一、获取CPU最大工作电压
直接通过CPU内置指令读取规格参数,无需依赖外部硬件:
- 执行CPUID Leaf 0x16指令:传入EAX=0x16后,ECX寄存器返回的值即为CPU支持的最大工作电压,单位为毫伏。例如你提到的1.72V,对应ECX返回
1720。
示例代码(UEFI C环境):UINT32 MaxVoltageMv; AsmCpuid(0x16, NULL, NULL, &MaxVoltageMv, NULL); // MaxVoltageMv 即为最大工作电压(毫伏)
二、获取实时CPU核心电压(VCore)
利用CPU的MSR寄存器读取当前VID并计算电压,这是最可靠的方式:
- 读取MSR IA32_PERF_STATUS(0x198):寄存器低16位(bits 0-15)为当前VID值,通过标准公式计算实时VCore:
Vcore = 1.55V - (VID值 × 0.00625V)
示例代码:
注意:部分新世代CPU的VID计算公式可能微调,需参考对应CPU的英特尔官方规格手册。UINT64 PerfStatus; AsmReadMsr(0x198, &PerfStatus); UINT16 CurrentVID = (UINT16)(PerfStatus & 0xFFFF); double Vcore = 1.55 - (CurrentVID * 0.00625);
三、关于Super I/O(IT8613E)的补充说明
IT8613E的电压监测功能主要针对系统输入类电压(如VIN),能否读取VCore完全依赖主板设计——只有当主板将VRM输出的VCore连接到Super I/O的ADC输入通道时,才有可能读取。若没有硬件连接,该路径不可行。
如果尝试验证:
- 先通过Super I/O的配置端口(通常是0x2E/0x2F或0x4E/0x4F)进入配置模式,切换到硬件监测(HWM)逻辑设备
- 查找ADC通道对应的寄存器,读取原始值后根据 datasheet 中的分压比计算实际电压
- 此方法兼容性极差,不同主板设计差异极大,远不如CPU内置的MSR/CPUID方式可靠。
内容的提问来源于stack exchange,提问作者Sergei Bykovskiy
相关产品推荐
相关产品推荐

