固件和微码到底啥区别

话说微码这个词,真是高格调。冬瓜哥刚入行的时候,经常听到I系工程师们的口头禅“升级微码”。当时觉得真是牛啊,啥叫微码?微码和固件又是啥关系?别说,冬瓜哥当年还真请教过这些现在已经是老一代的工程师这个问题,但是当时他们也不清楚具体区别,因为在那个时代,能够按照厂商说明书部署配置产品已经是至高格调了,你让他去把底层了解清楚,未免有点强人所难。但是这个问题一直在冬瓜哥脑子里作为一个遗留问题而存在,不搞清楚就总不踏实。还好,经过这些年来的学习,总算弄清楚了。

         固件一般指运行在Host内非主CPU上的其他部件中的可执行机器码,其可以是裸程序,也可以是操作系统+程序。如果是后者的话,OS可以是Linux这种,也可以是一些实时操作系统(Realtime OS,RTOS)。“非主CPU的其他部件”,典型比如IO HBA卡比如SCSI、SAS、FC卡,以及以太网卡、显卡、光驱、硬盘。这些设备内,都会有一个或者多个嵌入式CPU核心在运行固件从而发挥作用。这些设备所处理的指令逻辑还是比较复杂的,比如解析SCSI指令,用CPU+固件来完成就具有最高的灵活性,虽然也可以将解析工作固化成纯数字电路译码器,但是其灵活性会大大降低,一旦有bug,就无法解决。

         而微码这个词,泛指那些比固件的代码逻辑量级更低的代码,比如典型案例:鼠标/键盘内部其实也有一个小CPU,但是由于其运行的代码逻辑太过简单,而且指令集都是私有的,条数很少,所以其硬件相当简单,但是这并不妨碍其仍然属于CPU,只不过是一种MCU(MicroControl Unit,微控制单元)。比如鼠标的MCU就负责接收各种按键的信号,并根据信号从ROM中保存的码表提取编码,并通过驱动USB接口控制器将编码数据传送到Host端的USB控制器,这套流程也需要一个极为简单的程序来处理,这个程序就叫做微码。同理,键盘上的MCU也负责接收按键信号,并通过USB控制器传给Host。

        再比如Raid卡内部,除了主控CPU运行固件之外,还有控制后端SAS通路的SAS控制器模块,其中内含一个MCU,也是可编程的,运行着响应SATA盘独特逻辑的代码,将其翻译成SAS逻辑,对上位体现为SAS盘。这里运行的代码也属于微码。

         所以,固件的量级比微码更大,微码多运行在MCU这种极度轻量级的CPU上,而固件则运行在稍微重一些的CPU上,OS则运行在更加重量级的CPU比如服务器CPU上。它们一个比一个强大,处理的逻辑也是一个比一个复杂。

         你可能不知道,DDR SDRAM,NANDFlash颗粒内部,也有MCU,只不过多数产品其运行逻辑已经被写死在了硬件电路中,用纯电路来实现译码,但是不排除有些留有可编程后门的产品,依然采用了微码的方式来运行,此时就可以用私有指令对微码进行升级。

         对于小型机、高端存储系统等,工程师们常挂嘴边的“升级微码”,其实是说连固件带微码一起升级,因为厂商每次发布新版本时,基本会将固件和微码一起发布,升级的时候也是使用一些预先规定好的流程,将对应的固件和微码一同升级到对应部件上。“升级微码”比“升级固件”显得门槛更高,所以为了彰显格调,工程师们,尤其是大厂工程师就选择了后者。