在十多年前的Pentium时代, INTEL曾经发布过有缺陷的CPU, 因为浮点运算表边界上有几个数据错误, 导致在某些应用会出现错误, 这个错误概率很小, 出错几率小于千万分之一, 但在还是被捅出来了. INTEL为此召回CPU.
从Pentium Pro起, 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是可更换的, 那么其微码也需要更换. 因此, 在BIOS里, 一般要包进若干个ID的CPU微码, 以便工厂安排不同的SKU出货. 如果BIOS发布是在CPU发布之前, 那么BIOS里很可能就没有包进最新的微码, 这个系统要使用新CPU的时候, CPU微码是无法加载的.
另外, BIOS ROM容量有限, 一个微码补丁最小有2K, 如果平台兼容的CPU很多, 则微码数量是十分巨大的, 台式机某些主板可能兼容20多个CPU版本, 那么微码的体积很大, BIOS里根本包不下这么多东西, 于是, 厂商不得不缩水, 去掉一些不常用的微码. 这些不常用的微码一般都是早期的CPU, 如DOTHAN早期的A STEPPING就很可能没有对应的微码包进你的本本中去.
不打补丁会有什么问题?
INTEL说他们没测过不打补丁的CPU, 也就不知道会出什么问题. 呵呵, 这显然, 他们不想说太多技术细节而已. 以俺的经验, 如果不打补丁, 99.99%的时候, 用户是感觉不到的, 除非问题特别突出. 只是俺遇到过几个明显的例子, 为此出了几身汗. 有几个案例:
1, 某Prescott CPU, 在台式机上发热量特别大, 超出Design Point, 后来发现没加载微码, 加上微码就正常了;
2, 某Pentium D CPU, 进WINDOWS XP会蓝屏, 以安全模式进去后, 安装一个SP2补丁, 就正常了. 后来查出, 也是微码没加载;
3, 某Pentium M架构CPU, 在使用CPU内部TSC时, 发现测出的CPU内部频率高出实现的4倍, 如2GHz CPU测出却有8GHz, 后查, 也是没加载微码造成的异常.
此类案例很多, 特别是Core架构CPU, 不但微码必须加载, 而且要求尽早加载, 否则, 连BIOS都跑不完, 系统就挂了. 但是INTEL至今没有任何官方对每个CPU微码版本进行描述的文件.
怎么检查CPU微码是否加载?
加载微码后, 在CPU的MSR(机器特定寄存器)里可以读出版本号. INTEL IA-32编程手册上给出标准检查方法:
MOV ECX, 008bh
XOR EAX, EAX
XOR EDX, EDX
WRMSR ;向MSR 8BH写0, 清除MSR中的信息
MOV EAX, 0001
CPUID ;读CPUID, 让CPU查看微码版本, 并把微码版本送到MSR 8B中
MOV ECX, 008bh
RDMSR ;读出当前CPU微码版本
执行上面的代码后, 如果EDX的值为0, 则说明你的CPU微码是没有没加载的, 你的CPU运行在有缺陷的状态. 如果不为0, 则显示的是当前微码版本号
以上代码可以在DOS环境下, 用DEBUG32调试界面执行.
我很郁闷……
我有一个杂牌的本本, 上的是Dothan CPU, 某一天, 俺升级CPU, 却发现发热水平异常, 于是检查微码加载情况, 果然, BIOS里没有这种CPU版本的微码
换回原来的原厂CPU继续一测, 竟然也没有加载微码
后来换了Banias CPU才测到CPU微码加载上了. 也就是说, 厂商在升级CPU的时候, 居然没有升级BIOS, 这就是某些小品牌电脑厂商的水平, 郁闷
你的CPU升了么?
很多同学把低配的T4X本本换了CPU, 不知道这些同学用得怎么样, 呵呵, 你检查过你的CPU微码么? BIOS有升级支持么?
升级/检查微码的方法, 在资料
Intel