1、微码是什么?
微代码(Microcode):用简单的硬件操作来模拟当时无法用技术直接实现的复杂指令。指的是用软件技术来实现硬件设计的一种技术。拥有智能功能的计算机部件所包含的程序称为微码。
另,小型机上许多部件都有智能功能,高级的部件甚至内嵌一个真正的CPU,这些CPU也需要执行程序,一般存储在自身的FLASH ROM中,当厂家设计出增强功能的程序,支持新硬件或修补bug等就需要更新程序。这些程序即是微码。
微码是许多计算机或处理器对硬件结构的一层抽象,或是为实现复杂机器指令的一种数据结构。它一般驻留在高速存储器中并将机器指令翻译成详细的电路操作序列。它有助于将机器指令和底层电子器件分开,以使指令的设计和更改更加自由。
一些微指令将通常需要被取得、解码和执行每个机器编码指令。这些元素使微程序/微码与更多熟悉的汇编指令相比存在于一个低的概念水平上。
2、微码的作用
微指令的作用是将机器指令与相关的电路实现分离,这样一来机器指令可以更自由的进行设计与修改,而不用考虑到实际的电路架构。与其他方式比较起来,使用微指令架构可以在降低电路复杂度的同时,建构出复杂的多步骤机器指令。撰写微指令一般称为微程序设计(microprogramming),而特定架构下的处理器实做中微指令有时会称为微程序(microprogram)。
现代的微指令通常由CPU工程师在设计阶段编写,并且存储在只读内存(ROM, read-only-memory)或可编程逻辑数组(PLA, programmable logic array)中。然而有些机器会将微指令存储在静态随机存取内存(SRAM)或是闪存(flash memory)中。它通常对普通程序员甚至是汇编语言程序员来说是不可见的,也是无法修改的。与机器指令不同的是,机器指令必须在一系列不同的处理器之间维持兼容性,而微指令只设计成在特定的电路架构下运行,成为特定处理器设计的一部分。
3、哪些部件中会用到微码?
(1)磁盘
根据SNIA(存储网络国际协会)的定义解释,磁盘阵列(disk array)就是通过一套控制软件结合在一起的、在一个或多个可访问磁盘子系统上的一系列磁盘;该控制软件将这些磁盘的存储空间以一个或多个虚拟磁盘的形式提供给主机;运行在控制器上的控制软件一般称为固件(firmware)或微码(microcode);运行在主机上的通常称为卷管理器。
(2)微码芯片
为更好的支持硬件设备,还有主机的启动的检测程序事存储在微码芯片中的。
当启动主机时,机器先执行这些程序,包括对机器进行POST检查等等。
系统内核与硬件打交道,就是通过硬件微码
(3)键盘鼠标
鼠标/键盘内部其实也有一个小CPU,但是由于其运行的代码逻辑太过简单,而且指令集都是私有的,条数很少,所以其硬件相当简单,但是这并不妨碍其仍然属于CPU,只不过是一种MCU(MicroControl Unit,微控制单元)。比如鼠标的MCU就负责接收各种按键的信号,并根据信号从ROM中保存的码表提取编码,并通过驱动USB接口控制器将编码数据传送到Host端的USB控制器,这套流程也需要一个极为简单的程序来处理,这个程序就叫做微码。同理,键盘上的MCU也负责接收按键信号,并通过USB控制器传给Host。
(4)Raid卡
(RAID是一种把多块独立的物理硬盘按不同方式组合起来形成一个逻辑硬盘)再比如Raid卡内部,除了主控CPU运行固件之外,还有控制后端SAS通路的SAS控制器模块,其中内含一个MCU,也是可编程的,运行着响应SATA盘独特逻辑的代码,将其翻译成SAS逻辑,对上位体现为SAS盘。这里运行的代码也属于微码。
(5)DDR等存储颗粒
DDR SDRAM,NANDFlash颗粒内部,也有MCU,只不过多数产品其运行逻辑已经被写死在了硬件电路中,用纯电路来实现译码,但是不排除有些留有可编程后门的产品,依然采用了微码的方式来运行,此时就可以用私有指令对微码进行升级。
(6)cpu
CPU指令集中,作为微码指令(微指令)的一种序列。微码和允许新添加的机器指令被存储在 ROM 中。通常,人们认为微码处理机制是固定的,一旦定义好,就无需再更改。在近期的一份安全研究机构报告中披露:X86架构的微码处理机制,实际上“硬中有软”。报告中指出,CPU微码可通过自定义的加密通道完成修改,解码逻辑将被更新。这个加密通道是基于AES-128公开算法,且密钥明文存储。事实上,该通道这就已经为植入微码木马提供了后门通道。我们所使用的安全防护系统,一旦在微码空间中植入“微码木马”,将无法检测、清除。更可怕的是,微码木马可由应用程序轻松激活。
4、微码和固件的区别?
固件的量级比微码更大,微码多运行在MCU这种极度轻量级的CPU上,而固件则运行在稍微重一些的CPU上,OS则运行在更加重量级的CPU比如服务器CPU上。它们一个比一个强大,处理的逻辑也是一个比一个复杂。
固件一般指运行在Host内非主CPU上的其他部件中的可执行机器码,其可以是裸程序,也可以是操作系统+程序。如果是后者的话,OS可以是Linux这种,也可以是一些实时操作系统(Realtime OS,RTOS)。“非主CPU的其他部件”,典型比如IO HBA卡比如SCSI、SAS、FC卡,以及以太网卡、显卡、光驱、硬盘。这些设备内,都会有一个或者多个嵌入式CPU核心在运行固件从而发挥作用。这些设备所处理的指令逻辑还是比较复杂的,比如解析SCSI指令,用CPU+固件来完成就具有最高的灵活性,虽然也可以将解析工作固化成纯数字电路译码器,但是其灵活性会大大降低,一旦有bug,就无法解决。
而微码这个词,泛指那些比固件的代码逻辑量级更低的代码。