from:
几句话说清楚44:什么是微码microcode | DecodeZ (decodezp.github.io)
每当听到有人说“这个问题更新一下微码就好了”,就觉得这个哥哥怎么这么迷人,好像在哪里见过。为了也让自己变成这种迷人的哥哥,我也研究了一下到底什么是微码。
这里说的是跑在CPU处理器上的微码,不是IBM那群人嘴里说的那个微码。如果你之前没和IBM打过交道那就当这段话不存在。
计算机体系结构是一层又一层的抽象,典型的比如操作系统对底层硬件的抽象。但鲜有人知的是,操作系统和底层硬件,尤其是CPU之间还存在着几层抽象。什么叫抽象,当然有很多种学术流的解释,但我土气一点的解释就是“不关心”,就是“Don’t care”,就是爱咋地咋地。
用这个模式套用一下我们熟悉的抽象:操作系统要将数据写入磁盘,它不关心怎么操作磁盘;应用要给某个服务器发个数据包,它也不关心怎么操作网卡。
回到我们的微码上来。我们现在常见的操作系统都是用C语言编写,它相对于汇编语言来说,也算是一种“高级语言”。编译器会将这种高级语言编译成汇编语言。只要C语言编写时“不关心”汇编指令是啥,那么就是相对汇编语言做了一次抽象。
马上就到微码了。我们知道汇编指令是执行在CPU上的,那么汇编指令会关心在某个具体型号的CPU上是怎么执行的吗?肯定不会的。汇编的一条ADD指令在80286上可以执行,在最新的Icelake上也能执行,但这两个CPU内部早已发生了天翻地覆的变化,执行ADD的操作已经完全不同了。
换句话说,就是汇编指令并“不关心”是如何在CPU上执行的。
操作系统不关心如何操作磁盘和网卡,是因为这些都有对应的设备驱动操心。汇编指令不关心具体如何在CPU中执行,这个就是由微码来操心了。所以用类比的方式,可以把微码类比成汇编指令针对某一型号CPU的驱动。
同样的汇编指令,会由该型号CPU的微码转成可以跑在该CPU上的微操作(Micro-ops/uops)。这些微操作指导CPU的电路完成汇编指令要求的意图。
在大家还在编写汇编语言代码的时代,微码为汇编语言的编写提供了方便:
上述第二点也为CISC指令集的实现提供了技术基础。因为不可能所有复杂的指令都是由专门的执行复杂指令的硬件来完成的,也是由简单的数字逻辑模块组合而成的。
在现代CPU里,是存在专门的将汇编指令翻译成微操作的硬件解码器的。但微码依旧存在(就是CPU微架构图中前端那个Microcode sequencer),它作为一个Lookup Table保存在一块ROM中,用来解码复杂的指令,比如浮点运算的指令等。一般是硬件解码器解码得比较快,而用微码解码会比较慢。
理论上,如果你能更改某一个处理器的微码,那么经它翻译的指令可以变成任意其他的指令。因为它关心指令如何在CPU电路中执行。所以现在升级微码主要是用来解决处理器的稳定和安全性的问题。
当然你也可以用它模拟自己没有的汇编指令,比如AVX系列,我只要在看到AVX512的汇编之后,把它翻译成两个“SIMD256”或者四个“SIMD128”指令就好了。