BIOS-CPU微码深度解析

  • 格式:docx
  • 大小:15.14 KB
  • 文档页数:2

cpu微命令(CPU Micro Code)
在十多年前的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调试界面执行.