[注意:此答案特别针对最近的编辑,不会增加已经发布的几个合理答案。]
所以,再重申一下:微码(至少在初步近似上)是一种特定类型的固件。
在这个背景下,“微码”只是对“处理器固件”的市场营销说法。
嗯,这不是市场营销。如果是市场营销,可能会称之为XBoost Pro(TM)或其他什么名字。相反,这是一个工程术语;如果你设计CPU,微码与CPU的其他固件(以及其他设备典型固件)之间的区别对你来说很重要。如果不是,可能就不重要了。
如果你设计主板或编写操作系统,你可能会使用“微码更新”作为更繁琐和不太熟悉的“CPU固件更新”的简称。大多数CPU固件更新主要影响微码,所以它们基本上是同样的东西。你可能知道其中的区别,但你不需要关心它。
最终用户不需要知道或关心这个区别,在理想的世界中根本不会听到“微码”这个词。
我猜你是在最近的媒体报道中注意到了这个问题,不过你可能早些时候就听说过,只是当时的背景让你觉得不需要关心。这些漏洞比计划提前公布,可能导致媒体报道没有经过充分筛选。从最终用户的角度来看,你需要安装BIOS更新、操作系统更新,有些情况下还需要应用程序更新;你不需要知道或关心其中是否包含新的微码。
所以,即使你可能并不需要知道或关心,但出于纯粹的好奇,你可能仍然感兴趣:如何区分微码和其他固件?
首先要认识到的是,并没有一个单一而明确的定义,这更像是一个布莱格斯和鲁贝斯的情况。尽管如此,我们还是可以对微码做一些说明:
微码通常在CPU内部运行,而不是在CPU上运行。这是一个高层次的观点。
微码的架构通常与普通代码的架构有很大的区别,包括普通固件。它很可能是高度并行的,并且更接近硬件实现。几个现有的答案(包括你自己的答案)讨论了这一点,尽管应该注意到细节可能因CPU设计而异。
虽然硬件通常只设计用于运行制造商提供的固件,但使用第三方固件也并非特别罕见 - 尽管这可能会使保修失效!第三方微码要少得多,尽管我相信在古代(我指的是当CPU的大小约为面包盒大小时),一些终端用户会修改他们CPU中的微码。据我所知,在个人电脑中使用的CPU中,这是不可能的。
微码通常翻译或帮助实现公共指令集体系结构,即运行操作系统设计师和应用程序员使用的机器代码。下一节将详细介绍。
"执行与数据"这个范式被很多答案使用,但是它们的解释方式千差万别。我将解释一下我的评论。这部分也是对上面最后一个要点的扩展。目标在于试图区分CPU所做的工作(通过硬件和微码的组合实现)和典型设备所做的工作(通过硬件和固件的组合实现)。我选择了一个SATA硬盘驱动器来进行说明。
SATA驱动器根据计算机的指令进行操作,比如“从第5123扇区读取数据”和“将这些数据写入到第1321扇区”。驱动器的固件负责让硬件完成这些操作,通常是在嵌入式CPU上运行的普通代码。指令按顺序到达驱动器,尽管它们可能不会按照到达的顺序进行处理。这些指令不是一个程序,而是由主CPU上运行的程序“发送”的。特别地,没有控制流,即没有指令告诉SATA驱动器下一步应该运行哪些指令。
CPU负责计算机的运行。一旦初始化完成,它会执行主板(BIOS,另一种固件)提供的指令(“机器码”),这些指令指导它执行操作系统提供的机器码,进而指导它执行应用程序供应商提供的机器码。CPU本身从EEPROM(对于BIOS)或RAM(对于操作系统和应用程序)中检索机器码。特别是,机器码具有控制流程:机器码告诉CPU下一步要执行的机器码。您可以重复循环相同的机器码,根据代码正在处理的数据运行不同的代码片段 - 像SATA代码这样的设备接口语言中的指令可以执行一组有限的简单任务,但机器码可以做任何事情。(另请参阅Turing Completeness。)
我们可以将上面的最后一个要点改写为:微码通常实现了一个图灵完备的语言;普通固件通常不具备此功能。
硬件指令被微码解释是什么意思?
真实但可能令人困惑;重要的是要区分机器代码和设备接口定义的指令,比如SATA。机器代码具有控制流,并且是图灵完备的,而设备接口指令则没有控制流也不是图灵完备的。
“微码”适用于运行在声卡上的代码吗?
不,声卡接收指令而非代码,就像SATA驱动器一样。这些指令可能是“播放A#”或者“将这些数据解释为波形并播放”。仍然非常简单。
那么视频卡(GPU)呢?
老式的视频卡(没有GPU的)与SATA驱动器类似。指令是像“将这个像素设置为这个颜色”或者“在这个位置写入一个A”的形式。
... GPU则更加复杂,介于我上述尝试描述的两个世界之间。最简单的想法是将其视为主计算机内部的专用计算机,它有自己的CPU。的确,像SATA驱动器这样的设备也有嵌入式CPU,但区别在于SATA驱动器中的嵌入式CPU仅运行由驱动制造商提供的代码,而GPU还会运行操作系统和/或应用程序供应商提供的代码。实际上,这是一个完全不同的问题。
TL;DR:微码是一种特定类型的固件,它帮助硬件实现了图灵完备的指令集。