[闲聊] Microcode科普

楼主: benmei99 (KinGodyr)   2024-07-23 21:50:08
说是科普但就是我感冒在家无聊出来干个古、带带风向(?
比起前几天制程一知半解的文来说
这算是我的主战场,但人感冒难免有错请看官们海涵
警告:职业病的关系有些词汇我比较喜欢原文,所以看起来会是讨厌的晶晶体
1. 什么是Microcode
在了解为什么需要跟什么是Microcode前,先来看一下高阶语言的流程
Source code→Compiler→Machine code
Machine code里面放著很多machine language instruction(机器指令)
所谓的CISC(复杂指令集)、RISC(精简指令集),复杂精简指的是机器指令复杂度。
CISC特点就是指令数非常多而且复杂,指令长度也不等,这和Microcode什么关系呢?
以前设计CPU的时候都是直接硬件实现(hard-wired),fetch、decode、execute (包含位
址计算、读取、写入等等),都是直接用组合逻辑+状态机电路直接实现并控制的,优点是
硬件执行非常高效。但在后来CISC持续发展下,寻址(addressing)等复杂操作要完全用硬
体实现就越来越不现实也很难维护,所以Microcode就这样生出来了。
讲了那么多,Microcode到底是什么? 其实就是把一个指令拆解成很多个Microcode
(Micro-ops),这些microcode是可以直接被硬件实现(执行)的,这样做降低了很多设计上
的难题和复杂度。Microcode就是一个执行的最小单位(low-level layer)。
Machine instruction执行的时候需要解码(Decode),负责解码的单元叫做Instruction
Decode Unit(IDU),IDU大略可以分成两部分,hardware decoding和microcode decoding
,前者就是直接硬件实现(hard-wired)一些基本指令,例如加减;后者就是负责将复杂指
令转成数个micro-ops,简单一点的可能一个micro-ops,普通3~4个左右,复杂的4个以上

x86在80年代后就一直有用microcode,并且Intel在发生了下面要讲的事件后开始思考能不
能透过维护microcode来达成出货后的错误修正。
2. Intel大出包
在这次的事件前,Intel出过最大的包应该就是1994年Pentium FDIV bug了,源头是FPU
的浮点除法指令,在1994年有个美国教授(是数学还是CS我忘了),有个研究需要用电脑做
除法运算,但是他在用电脑处理除法的时候发现答案是错的,后来种种原因发现是Intel在
当时为了加速运算,把乘法表烧录在CPU上,但其中有5个输入错误。
其实在运算过程中是会自动修复,只有几个数字才会完全错误,但这位教授很幸运地遇到
了。事后统计我记得是90亿次除法才会出现一个错误,平均故障是700年才会发生一次(还
是800我也忘了)。后来事件的结果是全面召回有缺陷的CPU。
事件发生后Intel就开始思考出货后要怎么维护硬件故障了,很明显microcode就是一个最
好的维修孔,至于实际上怎么维修或是patch就是它们的商业机密了,但最后对使用者的方
式就是两个BIOS更新和作业系统更新。
3. 总结
Microcode是一本基本手册,利用这本手册可以实现复杂的指令(CISC)
Microcode的角色是:
A. 指令执行的最小单位
B. CPU内部硬件控制
C. CPU出货后的维修孔
Microcode其实很有趣,某种程度上RISC的诞生也有渊源,因为在1970年代中期IBM内部的
Project,他们分析了S/360还有S/370的数据得到了一个结论:Microcode的引入会导致
“执行最频繁执行的指令”时产生很大、昂贵的开销,这个结论其实就是RISC的源起和概
念。
突然想到补充一下这个Project就是IBM 801,由John Cocke主导,他是图灵奖得主也被誉
为RISC架构之父,同时也是CYK Algorithm里的C,(另外两人是Daniel Younger、嵩忠雄)
其实还有很多能讲的,为了避免过于唠叨就暂且不提,有人有兴趣的话再写
而且如果完全不知道Microcode是什么我想这些应该足够了xD
最近开始尝试与他人交流(?
我其实不太确定这样的文章(包含之前在板上PO的),对于小白来说能看懂多少,我是希望
能让完全不懂的人了解到底在讲什么东西,起码这是我在什么都不懂的时候,会想要得到
的知识、资讯。如果看了有点心得的人可以给我一点反馈

Links booklink

Contact Us: admin [ a t ] ucptt.com