http://www.pkblogs.com/bigblueSMTH
1997 Intel 处理器可以通过微代码补丁来修补
有消息说,某家台湾主板商成功开启了最新P4处理器中的EM64功能,就想起这篇老文章。
我们看到的许多不同等级的处理器,都是从相同制造流水线下产出,仅仅是因为筛选定级不同,使用不同的micro patch而造成的呢?毕竟太高的NRE要求巨大的量来分担,过多的处理器分级stepping不利于降低成本。
Intel 处理器可以通过微代码补丁来修补
FROM MPR september 15, 1997 by Linley Gwennap
与其它的Intel处理器一样,每一个P6处理器在内部的ROM中存有完全的微代码指令集。加电之后P6处理器使用的是内部微代码,而不是x86指令集。如果系统中没有微码补丁,处理器就直接使用内部微代码。迄今为止,Intel只以BIOS部件的形式提供微码补丁。
Intel正与主要的BIOS厂商合作以向更多的基于Intel构架的PC中加入微码补丁功能。在这些系统中,BIOS向一个特殊寄存器写入一个存储器地址来触发微码下载过程。CPU在接收到这个命令之后,从特定的地址中下载新的微代码。
P6有一块很小的SRAM用以保存至多60条微指令。补丁程序被下载到这片SRAM中。处理器还有一组"match匹配"寄存器,用于在遇到一个特定的微代码地址时引起陷入。(这与调试汇编代码时使用的指令断点类似)这一陷入只需要一个周期处理,陷入时寄存器指引微码执行进入补丁RAM。
下载的微码包含两个段。第一个是初始化段,在微码被下载之后立即执行。这一例程可以被用来重新配置处理器的某些功能。如果需要,这段代码可以初始化匹配寄存器。
第二段微码在正常操作过程中一直驻留RAM,其内部包含1个或者更多的补丁,通过匹配寄存器陷入来访问。由于处理器内部原有的微码固化在ROM中无法修改;匹配寄存器使得微码操作能够被改变。通过这张方式,那些以微码形式实现的x86指令,在操作错误时可以被修正。
当一条指令需要被修复时,一个补丁被产生用于替代原来的某段微代码,执行正确的操作并返回来的操作流。进出补丁代码的额外指令周期显然影响的性能,但是在许多情况下这一机制可以修正处理器设计中的错误。
只有特定的错误可以通过这种方式修正。
Intel没有公开匹配寄存器的数目,只是说这类寄存器不止一个。匹配寄存器的数目和补丁RAM的容量限制了特定处理器可以被修补的错误数量。但是单独一个错误有可能需要多个补丁,某些错误有可能过于复杂而不能用这种方式修正。Intel仍相信当前的方式可以在需要的时候修正多个错误。
P6中的大多数指令不是用微代码实现的。这些简单的指令是测试得最多,并较少可能发生错误的。在过去的产品中,影响特定指令的错误,往往是那些用微码实现,更为复杂的指令例如FIST和FDIV。Intel也承认Pentium的FDIV错误并不能用微码补丁的方式修正,因此补丁是否能在发生重大错误时挽救Intel仍未可知。
另外一个例子是在Pentium II发布之后Intel在P6处理器中遇到的FIST指令问题。在经过多次调查之后,Intel选择提供软件而不是微码补丁的方式来修正。Intel不会讨论FIST错误是否能够用微码补丁来修正,但是这一行为表明需要的微码补丁可能太大以至于不适用,或者大到无法留下足够的空间留给以后使用。
另外一类错误是在处理器中的指令缓冲,Load/Store缓冲和分支预测等功能部件的不正确操作。P6处理器中的这些功能大多可以通过特殊的寄存器关闭。对于这类错误执行,下载的微码可以通过重新配置处理器(写特殊寄存器)来关闭相关特性功能。在这种情况下,处理器将正常工作,虽然带来了性能损失。
大多数处理器中的错误是不能使用任何一种微代码补丁来修正的。如果处理器内部的某一部分或者总线接口在某种环境下不能正常工作,微码补丁对此无能为力。Intel声称通过补丁功能修正了一些错误,但是这些只是已知错误列表中的一小部分。因此有用的补丁特性并不是所有处理器问题的万能药。
BIOS中的微码补丁是一个2048字节的数据包。48字节头部包括时间编码,处理器ID以及校验码,剩余2000字节被下载到处理器中。为了防止Hacker使用MicroPatch来进行攻击,Intel使用了各种安全措施。这2000字节的数据按照Intel的说法是极度难以攻破的。字节流被分成变长的段,每一段使用不同的编码方式,由于实际的补丁远远小于2000字节,剩下的部分用随机噪声填满以混淆攻击者。
即使攻击者可以成功揭开加密算法,下一个挑战是组成一个合法的Patch。Intel没有发布任何与微码指令相关的信息,所有透露的相关信息都是精心准备并难以理解的。Intel内部也只有少数雇员知道微码格式,因此从外部构建一个微码补丁近乎于不可能。
但是一旦有人破解了加密算法,瘫痪一台计算机将变得非常简单,由于经过解密之后的微码字节流将不会有进一步的验证,而是简单的直接执行。执行随机的微码指令最可能是将处理器挂起。如果这部分代码被用来写Flash中的BIOS,情况会更严重。当然了,瘫痪一台windows PC有许多容易得多的方法。
P6处理器和其它处理器一样有许多共有的问题。在过去软件或者硬件的问题,或者使用者隐忍的问题都隐藏得极深。但是在著名的FDIV问题上,Intel实际上招回了上百万块Pentium处理器,最后损失了超过4亿7千5百万美元。
微码补丁给予Intel一个新的修复工具,它已经被用于修补在Pentium Pro和Pentium II处理器内部开发迭代过程。
微码补丁的另外一个问题是对于每一代处理器都需要一个2048字节的补丁。虽然Intel周期性的向BIOS厂商提供补丁包,如果一个BIOS厂商需要支持5代(stepping而不是generation)处理器,那么需要在ROM中准备额外的10K空间。许多BIOS厂商只支持2到3代处理器,他们认为PC制造商不会在新的BIOS上使用旧处理器。对于不带处理器出售的多处理器系统,最好的方法是使用Flash存放BIOS,以避免庞大的ROM需求。而大多数新的PC已经使用Flash BIOS。
Intel目前只使用Patch特性来修补设计中的错误,但是理论上这一特性可以被用于升级处理器。例如Intel可以出售通过微码关闭了许多先进功能的低价处理器,然后用户可以通过购买软件来升级这些处理器的性能。这种商业模式需要每个处理器都有单独的密钥,以阻止升级软件的散播。这种保护方法是可以实现的。
oooO ↘┏━┓ ↙ Oooo
( 踩)→┃你┃ ←(死 )
\ ( →┃√┃ ← ) /
\_)↗┗━┛ ↖(_/
