Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1865448
  • 博文数量: 343
  • 博客积分: 10342
  • 博客等级: 上将
  • 技术积分: 2892
  • 用 户 组: 普通用户
  • 注册时间: 2008-08-15 12:34
个人简介

你必须非常努力,才能看起来毫不费力!

文章存档

2012年(3)

2011年(5)

2010年(2)

2009年(40)

2008年(293)

分类:

2008-10-31 15:15:59

   在十多年前的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


PS:(说得不一定准确)
  微码是更为底层的设计语言!  
  比如:   
  在内部寄存器中数据的存放等是由微码来指示机器完成的!  
  通常的汇编代码只是关心内部寄存器中数据的值!  
  而宏汇编是一种汇编语言;  
  即他是由汇编程序来解释并执行的!  
  是对汇编语言的一种符号化!  
  便于理解、编写程序代码!
 
  不管是 RISC 或 CISC指令集的微处理芯片,其解释基本一样。    
   
  微代码是由微处理器中的解码器产生的用于微处理器内部执行的代码,其长度与格式与汇编代码无关,并且是集成在处理器内部的。(意思是我们没有必要关心,除非你自己要做芯片,或者是想了解乱序执行机制并提高程序运行效率)  
   
  机器代码则是由微处理器内部的解码器向外提供并负责解释的二进制代码,RISC 与 CISC的编码方式与长度有明显不同。  
   
  汇编代码则是由汇编编译器提供并解释的符号指令,一般说来,其与微处理器的机器代码一一对应。  
   
  宏汇编则是加入了宏指令的汇编语言,其也由汇编编译器提供并解释(其实可以说是汇编语言发展的必然结果)。  
阅读(3262) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~