CPU微码升级与补丁
cpu微码是指一个 CPU 的指令集作为一微码指令(微指令)的序列。其中每个典型地由很多位域和下一个微指令执行的地址组成。那么,CPU微码怎么升级?CPU微码怎么进行补丁呢?欢迎大家阅读!更多相关信息请关注相关栏目!
在十多年前的Pentium时代,INTEL曾经发布过有缺陷的CPU,因为浮点运算表边界上有几个数据错误,导致在某些应用会出现错误,这个错误概率很小,出错几率小于千万分之一,但在还是被捅出来了。INTEL为此召回CPU。
从PentiumPro起,INTEL决定给CPU留出一个补丁接口,当CPU内部有缺陷的时候,通过加载微码(Microcode),可以修复CPU的部分缺陷。
INTEL说,他们只测试过的CPU都是加载了微码的,如果没有加载微码,INTEL不保证会出现什么问题。
现在的CPU有一个CPUID,通过执行CPUID指令,可以知道当前CPU的版本和Stepping。根据这个信息,再给CPU打相应的补丁。
就是CPUID=06D2,Rev.A2
何时给CPU打补丁?
在给CPU初始化的时候,就需要把INTEL提供的微码写进CPU去,因此,加载CPU微码就是系统BIOS的任务。
如果系统的CPU是可更换的,那么其微码也需要更换。因此,在BIOD里,一般要包进若干个ID的CPU微码,以便工厂安排不同的SKU出货。如果BIOS发布是在CPU发布之前,那么BIOS里很可能就没有包进最新的微码,这个系统要使用新CPU的时候,CPU微码是无法加载的。
另外,BIOSROM容量有限,一个微码补丁最小有2K,如果平台兼容的CPU很多,则微码数量是十分巨大的,台式机某些主板可能兼容20多个CPU版本,那么微码的体积很大,BIOS里根本包不下这么多东西,于是,厂商不得不缩水,去掉一些不常用的微码。这些不常用的微码一般都是早期的CPU,如DOTHAN早期的ASTEPPING就很可能没有对应的微码包进你的本本中去。
不打补丁会有什么问题?
INTEL说他们没测过不打补丁的CPU,也就不知道会出什么问题。呵呵,这显然,他们不想说太多技术细节而已。以俺的经验,如果不打补丁,99.99%的时候,用户是感觉不到的,除非问题特别突出。只是俺遇到过几个明显的例子,为此出了几身汗。有几个案例:
1,某PrescottCPU,在台式机上发热量特别大,超出DesignPoint,后来发现没加载微码,加上微码就正常了;
2,某PentiumDCPU,进WINDOWSXP会蓝屏,以安全模式进去后,安装一个SP2补丁,就正常了。后来查出,也是微码没加载;
3,某PentiumM架构CPU,在使用CPU内部TSC时,发现测出的CPU内部频率高出实现的4倍,如2GHzCPU测出却有8GHz,后查,也是没加载微码造成的.异常。
此类案例很多,特别是Core架构CPU,不但微码必须加载,而且要求尽早加载,否则,连BIOS都跑不完,系统就挂了。但是INTEL但至今没有任何官方对每个CPU微码版本进行描述的文件。
怎么检查CPU微码是否加载?
加载微码后,在CPU的MSR(机器特定寄存器)里可以读出版本号。INTELIA-32编程手册上给出标准检查方法:
MOVECX,008bh
XOREAX,EAX
XOREDX,EDX
WRMSR;向MSR8BH写0,清除MSR中的信息。
MOVEAX,0001
CPUID;读CPUID,让CPU查看微码版本,并把微码版本送到MSR8B中。
MOVECX,008bh
RDMSR;读出当前CPU微码版本。
执行上面的代码后,如果EDX的值为0,则说明你的CPU微码是没有没加载的,你的CPU运行在有缺陷的状态。如果不为0,则显示的是当前微码版本号。
以上代码可以在DOS环境下,用DEBUG32调试界面执行。
我很郁闷……
我有一个杂牌的本本,上的是DothanCPU,某一天,俺升级CPU,却发现发热水平异常,于是检查微码加载情况,果然,BIOS里没有这种CPU版本的微码。
换回原来的原厂CPU继续一测,竟然也没有加载微码。
后来换了BaniasCPU才测到CPU微码加载上了。也就是说,厂商在升级CPU的时候,居然没有升级BIOS,这就是某些小品牌电脑厂商的水平,郁闷。
你的CPU升了么?
很多同学把低配的T4X本本换了CPU,不知道这些同学用得怎么样,呵呵,你检查过你的CPU微码么?BIOS有升级支持么?