目的
记录修改的过程,同时希望对路过的有所帮助
背景
本人使用的将星X15 AT 23H2曾出现过黑屏,打游戏卡屏然后自动重启的问题,黑屏的Windows日志显示是NVIDIA显卡报错,卡屏重启的报错完全看不懂。考虑到最近13代14代酷睿处理器不稳定问题,而i7-13650HX本质是桌面13代阉割而来,我怀疑之前出现的问题,可能和这个问题有关。
通过结合Intel自身承认和网上的说法,应该是核心供电电压太高导致的,通过HWINFO软件监控,我的CPU VID可以最高达到1.347V,结合网上的说法,这个电压有点高了,我怀疑之前出现黑屏和重启问题可能就是这个问题。而网上说法最简单的方法便是设置VR Voltage Limit来限制电源提供的电压来防缩肛。而笔记本BIOS选项及其简陋,没有这种选项,便着手研究不解锁BIOS情况下限制电压的方法。
结果
成功限制VID电压,我设置的限制值为1300,实际效果VID一天内最高只达到过1.295V。大多数时候在1.290V以下。
步骤
要用到的工具
UEFItool:Releases · LongSoft/UEFITool (github.com)
Universal IFR Extractor来自:工具整合:https://pan.baidu.com/s/11HbLIylEecluXYowqlgQXA?pwd=6666
提取码:6666 作者:lwyx2017 https://www.bilibili.com/read/cv16477736/ 出处:bilibili
modGRUBShell.efi: Releases · datasone/grub-mod-setup_var (github.com)
DiskGenius:DiskGenius – 正式版下载|免费下载
1、先备份BIOS
工具:https://download.csdn.net/download/zhutuizhi/88658387
用法
解压出来后以管理员打开CMD进入到目录下,执行
.\FPTW64.exe -d bios_all.bin
该方法读取整个32M的flash内容,包含了BIOS和ME固件。
如果只读取BIOS区
可以执行
.\FPTW64.exe -d x15bios.bin -bios
这将读取16M内容的BIOS。不过,Windows下没法把读出来的写回去,因为BIOS存在保护。
写不了的提示如下
2、分析要修改的地方
用UEFItool打开提取的BIOS,搜索setuputility
选中PE32 image section 然后右键Extract as is导出为Section_PE32_image_SetupUtility_SetupUtility.sct,
用Universal IFR Extractor反编译,选中要导出的地址,点击Extact得到Section_PE32_image_SetupUtility_SetupUtility IFR.txt
然后打开该文本文件,搜索VR Voltage Limit,可以搜到3个,确保其上级菜单为Core/IA VR Settings,
0x1864A3 Numeric: VR Voltage Limit, VarStoreInfo (VarOffset/VarName): 0x1BE, VarStore: 0x3, QuestionId: 0x154, Size: 2, Min: 0x0, Max 0x1F3F, Step: 0x1 {07 94 65 02 66 02 54 01 03 00 BE 01 10 11 00 00 3F 1F 01 00}
0x1864B7 Default: DefaultId: 0x0, Value (16 bit): 0x0 {5B 07 00 00 01 00 00}
0x1864BE End {29 02}
可知该变量存储地址为0x1BE,大小是2个字节,最大值0x1F3F,存储在id为0x3的变量区,而0x3对应的名字是CpuSetup
0x181917 VarStoreEFI: VarStoreId: 0x3 [B08F97FF-E6E8-4193-A997-5E9E9B0ADB32], Attrubutes: 7, Size: 3DF, Name: CpuSetup {26 23 03 00 FF 97 8F B0 E8 E6 93 41 A9 97 5E 9E 9B 0A DB 32 07 00 00 00 DF 03 43 70 75 53 65 74 75 70 00}
0x1BE默认值为0,代表VR电压没有限制,我们需要修改到要限制的值,比如1.3V的话,值就是1300,因为是16进制存储,就0x514,因为以小端存储,低位字节在前,故0x1BE代表的1个字节存储0x14,0x1BF地址代表的1个字节存储0x05.
3、用setup_var工具修改变量
知道了要修改的内容,接下来就是动手修改了,用一个U盘,将U盘转换为GPT格式,并建立ESP分区
将modGRUBShell.efi重命名为bootx64.efi,然后拷贝到ESP分区efi/boot目录下,目录自己创建
然后重启,进入BIOS,要重U盘的这个文件进入,需要先到Secure Boot中设置密码,然后将这个文件设置为可信任文件,然后才能用BIOS Boot From File启动。
启动后进入grub>提示
可以先输入些指令,看看有值的区域是否符合设想来确保修改的是正确的区域,比如0x32A的地址存储的是0x2EC
0x186482 Numeric: Fast Vmode Itrip ICC Limit, VarStoreInfo (VarOffset/VarName): 0x32A, VarStore: 0x3, QuestionId: 0x10C6, Size: 2, Min: 0x0, Max 0x7F8, Step: 0x1 {07 94 57 02 58 02 C6 10 03 00 2A 03 14 11 00 00 F8 07 01 00}
0x186496 Default: DefaultId: 0x0, Value (16 bit): 0x2EC {5B 07 00 00 01 EC 02}
0x18649D End {29 02}
故可以输入
setup_var_cv CpuSetup 0x32a
查看0x32a是否是0x2EC的低位字节值0xec
setup_var_cv CpuSetup 0x32b
查看0x32b是否是0x2EC高位字节0x02
确定没问题之后便可以就可以开始设置了,注意setup_var命令设置的是setup变量区内的变量,要修改CPUSetup区的变量,要使用setup_var_cv,然后紧跟变量区名,要修改的地址,要修改的字节数,以及要修改的值,怕出错最好一次修改一个字节,然后读取2个字节。
即需输入
setup_var_cv CpuSetup 0x1be 0x01 0x14
setup_var_cv CpuSetup 0x1bf 0x01 0x05
setup_var_cv CpuSetup 0x1be 0x02
效果如图
缺点:
修改完成后再读出来的BIOS,如果用InsydeH2OUVE工具打开,将看不到整个CpuSetup变量区。不知道会有什么影响,但确实起到了限制电压的作用。