【硬件折腾】主板BIOS更新CPU微码流程 您所在的位置:网站首页 微星保修代码在哪查看 【硬件折腾】主板BIOS更新CPU微码流程

【硬件折腾】主板BIOS更新CPU微码流程

2023-08-21 06:01| 来源: 网络整理| 查看: 265

UP主最近在学习折腾BIOS的过程中有了一点点经验,就总结了一些关于更新主板BIOS中CPU微码的方法,希望能给大家带来一些帮助。

在折腾前说明,更新CPU微码涉及修改和刷新BIOS,而修改和刷BIOS存在一定风险,本人不对修改后BIOS的适用性、兼容性和稳定性做出任何保证,在折腾过程中因操作不当而造成的损失和后果概不负任何责任。

在做这些前,你应该备份机器未经修改的原版BIOS,并知道在刷入错误BIOS后导致机器变砖的情况下,该如何使用编程器搭配烧录夹救砖。

本人技术水平有并不专业,且专业知识匮乏,文章存在错误请求各位大佬指出,谢谢。

同样在操作开始前,先回答一些大家可能想问的问题。

什么是CPU微码?

CPU微码(CPU Microcode),又称为微指令,是在CISC处理器运行一些功能复杂的指令的时候,所分解的一系列相对简单的指令。

现代CPU的IDU(Instruction Decode Unit),也就是指令解码器,分为硬件指令解码和微码指令解码。

其中硬件指令解码通常运用在RISC处理器上,而微码指令解码通常运用在CISC处理器上,换句话来说就是x86处理器使用的是CISC指令集,CISC指令集较为复杂,指令很多且长短不一,因此不能像RISC处理器那样使用硬件解码,就需要利用微指令,将那些复杂的指令分解为相对简单的指令。

微指令的作用便是将机器指令与相关的电路实现分离,这样一来机器指令就可以更自由的进行设计与修改,而不用考虑到实际的电路架构,使用微指令架构,除了可以在降低电路复杂度的同时,还可以构建出复杂的多步骤机器指令。

那么问题来了,为什么CISC处理器要考虑机器指令更自由的设计与可以修改呢?

原因正是既然软件可能会存在BUG,那么硬件当然也会存在BUG了,这个事件最早在90年代的1994年就出现过,当时英特尔发布的奔腾处理器(奔腾在那时候可是英特尔高端系列的代名词,并不是现在看来的低端产品)在进行浮点运算的时候可能会发生错误,这就造成了计算出来的结果可能会不准确,尽管这个问题对于普通用户可能影响不大,但对于从事科学计算,统计学群体的用户来说却是致命的,最终碍于名誉和面子,英特尔还是召回了这批处理器。

通过这次事件以后,便出现了该如何给CPU“打补丁”这个问题,毕竟英特尔也不敢保证自己的新产品不会再次重蹈覆辙,若是再次出现这种问题,还是选择像当时那样将产品都召回的话,那么在售后成本上付出的代价岂不是太惨痛了?自己的名誉同样也会受到影响。

而我们知道计算机硬件能直接识别和执行的语言是机器语言,CPU也只认识机器指令,X86处理器是将复杂的IA32指令转换为机器指令的,因此在指令解码器部分,使用可以自由修改的微码,便是比较好的解决方案,如果出现了BUG,通过更新微码来解决这些问题并修复BUG,不就可以了吗?

因此在吸取了这次教训并找到了解决方案后,英特尔在1995年推出的奔腾Pro处理器时,便开始使用更新Microcode的方式来修复可能存在的硬件BUG,且一直延续至今。

例如在四代Haswell-E架构的处理器中也出现过问题,那一代英特尔加入了AVX2指令集的支持,使得对这个指令集有优化的应用带来了很大的提升,但AVX2指令集会给处理器带来更高的功耗和发热,尤其是在服务器平台更为明显,毕竟服务器平台的核心数相比桌面端的更多,Haswell-E处理器的最大核心数也从上一代Ivy Bridge-E的12核提升到了最大18核,这也导致了早期Haswell-E处理器出现了巨大发热和功耗的情况。

后面英特尔同样也是通过更新CPU的微代码的方式来解决这个问题,新版的微码可以使E5 V3处理器在那些针对AVX2指令集优化的程序高负载的情况下降低CPU的频率,从而减少功耗和发热。

如今Microcode既可以保存在ROM中,也可以保存在RAM中,加载既可以由BIOS进行,也可以由操作系统进行。

例如电脑启动的过程中,主板在给CPU进行初始化的时候,就需要将英特尔提供的微码加载到CPU的指令解码器部分,因此BIOS就可以胜任主要的加载CPU微码任务。

而除了BIOS以外,CPU微码也可以通过操作系统进行,例如Linux内核在引导的时候就可以更新CPU微码,而无需BIOS更新。

同样在几年前那次幽灵熔断漏洞的事件中,后期在Win10系统更新中,也会有这个漏洞补丁和新版的CPU微码,来修复这个漏洞。

E5 V3鸡血将EFI补丁刷入系统EFI分区,开机启动加载这个EFI以后,可以让CPU运行在旧版的微码上,这也是同样的道理。

为什么要折腾CPU微码?什么机器需要折腾微码。

给主板BIOS折腾CPU微码,相信玩过771的至强上775主板,E5 V3鸡血,100和200系主板支持八九代酷睿的硬件玩家来说,肯定不陌生,当我们有时候需要折腾这类东西的时候,自然也就需要折腾微码了。

首先是关于771的事,771则指的是LGA771接口,也就是当年和775同代的至强使用的接口(06年到08年那个时候的至强),我们知道至强是英特尔定位服务器的产品系列,同代产品相比普通台式机CPU来说,有着更强大的性能和更大的三级缓存,不过那时候771的主板很贵,尽管后期有了很多淘汰下来的拆机的CPU,但在没有发现它们也可以用到775主板上这种“骚操作”之前,771的至强除了原生的771平台以外,并没有其他用武之地。

不过后期有些技术宅发现,LGA775和LGA771理论上可以通过交换A3和A5的地址来兼容,换句话来说771和775的差别在于CPU和主板插槽上防呆接口的位置不同,CPU触点上有两个针脚的定义不一样以外,其他都一样。

虽然这样魔改(只是交换那两个针脚)经过实际测试确实是成功了,但存在的问题是只有部分主板支持,即便点亮以后可能也会出现不兼容的情况,例如存在指令集,温度,电压,总线频率,外频和内存支持方面等诸多玄学问题。

而且771的至强也有不同的步进,有的可以不刷微码在775主板上点亮,有的则必须刷微码,不然点不亮,例如C0的步进不刷微码可以点亮,E0步进的就必须要刷微码才能点亮。

而通过给主板BIOS添加771CPU的微码,就可以解决像点不亮,并改善北桥和CPU的发热,提升兼容性和改善稳定性的问题。

100和200系主板通过魔改BIOS,屏蔽CPU上的部分触点支持八九代酷睿也是同理,虽然300系列的主板使用的插槽还是LGA1151,与100系和200系主板相同,但是Intel则是利用处理器微代码,ME管理引擎,核显GOP等,故意让老主板不认识新处理器。

拿八代i3举例的话,八代i3实际上是七代i5的马甲,因此只需要将新版微码加入BIOS,并将ME,核显VBIOS和GOP固件更新后,在100和200系主板上就可以点亮并完美使用核显。

E5 V3鸡血则是通过去除主板BIOS里Haswell-E CPU的微代码(306F2),并加载EFI补丁来实现的,这个在前面也提到过。

除了在玩这些的时候会需要折腾微码以外,下面这些情况也需要我们折腾微码。

例如某些情况下旧版的微码可能会存在BUG,而新版微码修复这个问题并改善了性能,但你使用的机器或者主板厂商没有更新BIOS,我们就可以自己更新微码,比如我那台B450的蓝天NH57就是蓝天一直不更新BIOS,而BIOS的更新对于AMD平台来说又是非常重要的,于是我便尝试将Zen2 00870F10的微码从从08701013更新到了08701021。

还有像X99平台在那次被爆出幽灵熔断漏洞以后,微软也在Windows系统中打补丁,更新CPU微码来修复这些安全问题,前面我们也提到过微码的加载既可以由BIOS进行,也可以由操作系统进行,如果X99平台你使用的是Broadwell-E架构的i7旗舰版,并在超频的情况下使用,操作系统又是比较新的情况下,进入系统以后CPU超频可能会失效,造成这种情况的原因是主板BIOS中的微码版本比系统中提供的微码版本低,这样就导致将CPU频率的控制权交给了操作系统,BIOS中的超频设置就会失效,这样就需要更新BIOS中的微码来解决这个问题。

或者是新版BIOS将微码更新后,修复了一些良性BUG或者降低了CPU性能,而我们使用的也是旧版本的系统的话,我们也可以把老的微码与新版微码替换,达到降级的目的。

对这方面有了一定了解以后,我们就开始吧。

这里请注意教程里提到的方法比较复杂,旧平台的BIOS实际上使用UEFI BIOS Updater,也是可以直接更新微码的,不需要那么麻烦,我这个方法适合想要对这方面有更多理解的人。

教程中用到的工具整合:https://pan.baidu.com/s/1cn2J4oHXiqmoD_5P2T5j9g?pwd=BIOS 

提取码:BIOS

备份原版的BIOS

在折腾之前我们首先要有BIOS原文件,且需要备份原版BIOS以防万一,如果厂商有提供的话,可以使用厂商提供的,而如果厂商没有提供,网络上也没有找到可以下载的渠道的话,我们就需要自己提取。

英特尔平台我们可以使用FPTW64,也就是Intel Flash Programming Tool,来备份和刷入BIOS,当然你也可以使用像AFUWin或者H2OUVE等其他工具来提取,不过它们只能支持自家的BIOS,例如AFUWin只能支持AMI的BIOS,H2OUVE只能支持Insyde的BIOS,也可以拆机使用编程器搭配烧录夹提取,看情况选择适合自己的方法吧。

而FPTW64似乎就没有BIOS的厂商的限制,我试过无论是AMI Aptio V的BIOS还是Insyde H2O的BIOS,都是可以提取和刷入的,也可以强刷修改后的BIOS,不过这个工具只支持英特尔平台,且不同平台对工具版本存在要求,例如旧版的工具会不支持新平台。

拿GPD Win3来说,这个机器的BIOS是AMI Aptio V的BIOS,我拿FWTW64举例,我们先使用管理员身份打开命令提示符,转到工具所在的目录下,输入FPTW64.exe /d Win3.bin的命令,将BIOS提取出来。

其中/d的命令是备份16M的完整BIOS,后面备份出来BIOS的文件名可以自己定义,输入命令后我们等待备份完成即可。

AMI的BIOS我们也可以使用AFUWin备份,不过这个工具有时候会出现备份出来的BIOS不完整的情况,例如我拿来备份Win3的BIOS,备份出来的文件大小只有11M。

使用UEFITool打开的话,会发现两者结构上是存在区别的,也就是说使用AFUWin备份出来的BIOS可能会是不完整的,出现这种情况的话,还是使用FPTW64来备份吧。

而像Insyde H2O的BIOS,除了可以用FPTW64备份以外,也可以使用H2OUVE备份,有时候可能会出现下载到的BIOS是超过16M的,使用H2OFFT刷入没有问题,但H2OFFT似乎只能刷签名过的BIOS,未经签名的BIOS是刷不了的。

而使用其他工具或者编程器刷超过芯片容量的BIOS的话,就会出现BIOS容量大于芯片容量,导致无法刷入的情况,以前我给NH57救砖的时候就遇到了这种情况,所以备份和芯片容量相同的BIOS文件是非常有必要的。

我拿我自己的蓝天NH57AF1举例,蓝天X170使用的也是这种BIOS,H2OUVE除了可以修改Insyde H2O BIOS的选项以外,还可与备份BIOS。

H2OUVE我使用的版本是200.00.01.00,我们以管理员身份运行H2OUVE-W-GUIx64.exe这个程序,点击Load runtime,等待运行时的BIOS读取完成后,再选择Dump BIOS rom,就可以将BIOS提取出来。

以上介绍的就是备份BIOS的方法了,注意备份BIOS原文件这一步非常重要,在救砖的时候会用到,备份出来以后,建议复制一份到U盘或者另一台可以正常使用的电脑上,然后再对其进行魔改。

关于MCExtractor的安装和使用

我先拿GPD Win3这台机器的BIOS举例,这个机器的2.29版BIOS的微码都不是最新的,那我们该如何确认BIOS里的微码是不是最新的呢?

这时候我们就需要用到一个开源工具MCExtractor了,这个工具可以检测BIOS中的微码是不是最新的,也可以从BIOS中提取微码,非常方便。

MCExtractor地址:https://github.com/platomav/MCExtractor

我们可以使用git clone这个项目,或者直接下载压缩包来获取这个工具。

这个工具是Python写的,因此必须要安装Python才能使用,我们可以执行python --version的命令来查看自己电脑的系统中是否安装了Python,并确定安装的是那个版本,没有安装的话,就需要安装以后才可以使用这个工具,这个工具需要Python 3.7以上的版本才能运行。

Python官网:https://www.python.org

另外由于这个工具引入了pltable和colorama,因此除了需要安装Python以外,还需要安装这两个模块才能正常使用。

安装那两个模块很简单,在命令提示符或者PowerShell中使用pip命令安装即可。

我们输入pip3 install colorama和pip3 install pltable就行。

colorama可以跨多终端,显示字体不同的颜色和背景,pltable可以用来生成美观的ASCII格式的表格。

其中pip install加上模块名称是安装的命令,对模块的版本有要求的话,可以加上版本号。

pip install --upgrade加上模块名称是更新的命令,pip uninstall加上模块名称是卸载的命令。

安装完成后工具就可以正常打开了,不过我们也可以编译一份,这样在没有安装Python的电脑上就可以直接使用,我后面也会把编译好的程序放在工具包里,方便那些不想安装Python的用户使用。

编译的方法很简单,使用pip命令安装PyInstaller,colorama和pltable以后,执行pyinstaller --noupx --onefile MCE.py即可编译。

其中--noupx的命令是不使用UPX,--onefile的命令是创建一个单文件绑定的可执行文件。

操作完成后目录会新增一个dist的文件夹,在这个文件夹里就可以找到编译好的程序,这个程序在其他没有安装Python环境的电脑上就可以直接使用。

回归原题,当确保MCExtractor可以正常使用以后,我们就可以使用它来查看BIOS中有什么微码,那些微码是不是最新的了。

我们将BIOS拖到程序上,然后再按回车就可以查看了。

其中CPUID那一列是指这个BIOS里有什么CPU的微码,这个依据你的平台来决定。

比如我那台GPD Win3使用的是i7 1165G7的CPU,BIOS中当然就需要有这个微码才能支持这个CPU,而i7 1165G7的CPU ID是806C1,对应的微码就是第一个和第三个。

而我那台蓝天NH57AF1支持锐龙3000系桌面级CPU,也就是Zen2代号Matisse的处理器,而目前我使用的R7 3700X,它的CPU ID是00870F10,对应的微码就是第一个。

关于这个我们也可以使用AIDA64或者HWINFO查看,它们就可以检测出这个信息。

Revision那一列则是微码的版本,Date那一列是日期,Size是指微码大小,它们可能会随着微码版本而变化。

Offset则代表它在十六进制中的位置,Last那一列是Yes代表这个微码是最新的,No则代表不是最新。

比如我刚才打开的蓝天NH57AF1的BIOS就是我改过的,而原版BIOS的微码就不是最新的,通过对比我们可以看出。

使用MCExtractor从其他BIOS中提取新的微码

对这方面有一定了解以后,我们就需要从其他相同平台的机器中提取新版的微码了。

比如GPD Win3那个机器使用的是i7 1165G7的CPU,因此我们就可以从其他也是使用这种CPU机器的BIOS里,提取新版的微码。

虽然台式机平台的那些兼容机主板,你可能很容易就从各大主板厂商的官网上找到BIOS原文件,但笔记本的BIOS原文件就不是很好找了,它们提供的大多数都是整合好的刷写程序,而不是BIOS原文件,我拿该如何从戴尔的BIOS里提取微码举例。

戴尔给我印象非常好的就是它对驱动和BIOS的更新支持非常好,甚至之前我玩有些驱动支持不好的机器,也用过戴尔提供的驱动,这一点是要提出表扬的,因此我们就可以从戴尔的BIOS里提取CPU微码,尽管BIOS不是通用的,但CPU微码是通用的,这一点是毋庸置疑的。

这里使用同样搭载了十一代Tiger Lake-UP3的处理器的戴尔XPS 13 9310的BIOS举例,我是从这里面提取Tiger Lake-U的微码给Win3用的。

虽然它提供的是整合好的刷写程序,而不是BIOS原文件,这一点就让我们感到犯难了,但我们可以借助一个开源工具来从这个程序里提取出我们需要的BIOS,也正是因为戴尔的BIOS有现成的提取工具,所以我才使用戴尔的BIOS的。

Dell-PFS-BIOS-Assembler(戴尔BIOS提取工具)

https://github.com/vuquangtrong/Dell-PFS-BIOS-Assembler

这个工具也是Python写的,使用同样的方法下载和编译即可。

然后将BIOS程序拖到Dell_PFS_Extract上,就可以将里面的BIOS提取出来。

Dell_PFS_Assembler应该是打包BIOS用的,不过我没试过。

获取到BIOS源文件以后,我们将它放到MCExtractor的目录下将其打开。

可以看出这个BIOS的806C1和806C2的微码是最新的,我们就可以从里面提取了。

使用MCE加上BIOS文件名(BIOS文件未在目录下的话,需要加上完整的路径),再加上-skip>nul && goto cpu的命令,即可提取微码。

接着MCExtractor的目录下会多出一个名为Extracted的文件夹,这里面就是我们提取出来的新版本的微码。

有了新版本的微码以后,我们就可以更新微码了,虽然有时候我们也可以使用像MMTool,或者H2OEZE(H2OEZE仅适用于Insyde的BIOS)之类的来更新微码,不过这些工具并不能保证时刻都能成功,例如MMTool在给Win3更新微码的时候就有点问题,我选择了插入新的微码以后前两个不起作用,后面虽然添加进来了一个新版的,但是又报错了,H2OEZE打开蓝天X170的BIOS以后虽然可以读取和删除微码,但是这个工具提取和替换也是有问题的,毕竟版本太老了,网上能找到的版本是比较旧的了,对新BIOS的支持不好也很正常。

那么我这里介绍一个比较麻烦,但是通用性较好的方法。

还是拿GPD Win3的BIOS举例,我们使用MCExtractor将BIOS里旧版的微码提取出来,先将806C1的微码更新。

使用十六进制编辑器打开提取出来对应的微码文件,我这里想要更新806C1的微码,因此是打开806C1那个文件,我这里用的是HXD,复制第一段对应的十六进制,我这里是01 00 00 00 8A 00 00 00 21 20 09 04 C1 06 08 00。

然后使用UEFITool打开BIOS,UEFITool的最新版可以在Github下载,不过新版目前还不支持微码的替换,所以我使用旧版,也就是0.28版来进行操作。

想关心最新版可以在Github的发布版下载:https://github.com/LongSoft/UEFITool/releases

这个工具是C++写的,而且是跨平台的,它除了有Windows版以外,还有Linux版和Mac版,由于我没有学过C++,编译C++程序也只会编译使用VS写的项目,对于不依赖.sin或.vcxproj项目文件的跨平台C++应用,就不怎么会编译了,平常我也只会简单使用Windows,不会用Linux,Mac系统的话手上没有苹果设备也没玩过。

我们搜索刚才复制的这个十六进制,搜索类型那里选择Body only。

然后将搜索到的结果保存,使用十六进制编辑器打开,我这里使用的是HxD。

保存的文件名可以自己定义,建议保存成对应的GUID名称方便区分。

使用HxD打开后可以看出,提取出来的这个模块文件开始部分的十六进制和微码的开头一致(我这里都是01 00 00 00 8A 00 00 00 21 20 09 04 C1 06 08 00)情况不同的话就要进行搜索,并记住这部分开始的Offset,我这里就是00000000。

接着回到刚才打开的那个旧版微码文件,复制最后部分的十六进制,我这里是E9 19 DE 67 BA CF FA BC 84 52 EA B6 40 8C 00 25,并在模块文件中查找。

查找到以后再次记录下它结尾的Offset,我这里是0001ABF0。

确定了00000000到0001ABF0的位置是旧版的微码以后,我们就可以用新版微码的十六进制数据来替换旧版的了。

使用HXD打开刚才从戴尔BIOS中提取出来的新版微码(我这里是806C1),按Ctrl+A全选复制,然后回到刚才那个模块中,选中刚才记录的位置(也就是旧版微码的整体)我这里是00000000到0001ABF0的位置,将其替换。

这里要注意的是,由于我这里806C1新版和旧版的微码大小完全相同,对应的十六进制长度也都是0x1AC00,因此就可以使用覆盖式粘贴进行替换。

如果你新版微码的大小是小于旧版微码大小的话,就记住它的十六进制长度,然后在模块文件中选择相同长度的十六进制来进行替换,多出来的部分使用十六进制FF来进行填充即可。

而新版微码的大小是大于旧版微码大小的话,同样还是就记住它的十六进制长度,在模块文件中选择相同长度的十六进制来进行替换,多出来的部分直接在FF上面写即可。

替换完成后保存文件,将修改后的文件与原来的替换,我这个BIOS关于806C1的微码是一式两份的,查找下一个模块文件,它的GUID和上面那个也完全相同,因此直接替换就行。

替换完成后保存文件,使用MCExtractor打开魔改好的BIOS,我们就能看出806C1的微码成功更新了。

更新806C2的微码也是同样的方法,第二个微码所在的模块文件和第一个相同,只是所在的位置不同,第一个微码就在文件的开头,而第二个微码在第一个的后面。

我们还是在模块文件中搜索第二个微码(我这里是旧版806C2)开头的十六进制,并将它记录下来,我这里是00020000。

不过这次更新806C2的微码和806C1的有些不同,因为806C2新版本的微码比旧版本的大了一些,因此在替换过程中就不能像上面那样,从旧版微码的开头到结尾,直接使用覆盖式粘贴来替换,因为那样会改变文件大小,可能就会造成UEFITool保存失败的问题。

不要着急,我们打开新版的806C2微码,按Ctrl+A全选复制,并记住它的十六进制长度,我这里的十六进制长度是0x17C00。

然后回到模块文件中,从刚才记录下来的开始部分进行选择,直到选择的十六进制长度等于新版微码的长度,我这里是0x17C00,然后再使用覆盖式粘贴将其替换。

模块修改完成后,同样使用UEFITool替换并保存,要注意BIOS中相同的微码如果只有一个的话,那么替换一个即可,如果有两个的话,那么两个都要替换才行。

使用UEFITool替换并保存完成后,再使用MCExtractor打开BIOS,我们就能看出这个BIOS里的所有微码都是最新的了。

这种方法应该也是适用于AMD平台的,我那台蓝天NH57AF1也是用同样的方法将Zen2的微码更新的,不过我当时是直接拿十六进制编辑器在BIOS文件上改的,没有使用UEFITool,但我个人还是建议使用UEFITool来提取微码所在的模块,然后在那个模块上进行修改比较好。

然后我们将改好的BIOS文件刷入机器,英特尔平台可以使用FPTW64强刷,AMD平台的话用编程器搭配烧录夹刷吧,反正我那台蓝天NH57AF1就是拿编程器刷的。

回归原题,Win3改好的BIOS我又使用了AMIBCP改了默认内存频率,将默认的3733改成了4267,使用FPTW64刷BIOS的时候使用/f的命令来刷即可。

BIOS刷完后重启一次点亮,看来没什么问题,不过还是要当心,如果BIOS里面的微码与当前的CPU不匹配或者有错误,是会造成机器无法正常启动的,那种情况就必须拆机使用编程器搭配烧录夹救砖了。

AIDA64和HWINFO也读出了i7 1165G7的微码成功更新至了目前最新的A4h,这样我们的微码就更新成功了,目前1165G7最新版的微码是A4,之前BIOS里的旧版微码是8A。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有