[NB:此答案专门用于解决最近的编辑,并且不会以其他方式添加到已经发布的多个声音答案中。]
因此,重申一下:微码(至少是第一近似值)是一种特定的固件。
在这种情况下,“微码”只是通过“处理器固件”进行营销。
好吧,这不是营销。市场部门会称其为XBoost Pro™或其他名称。而是一个工程术语。如果您设计CPU,则微码与CPU的其他固件(以及其他设备所用的典型固件)之间的区别对您很重要。如果没有,那可能不是。
如果您设计主板或编写操作系统,则可能使用“微码更新”作为较笨拙和不太熟悉的“ CPU固件更新”的简写。大多数CPU固件更新主要影响微代码,因此与同一事物非常接近。您可能确实知道其中的区别,但是您不必关心它。
最终用户不需要了解或关心它们之间的差异,并且在理想情况下,根本不会听到“微码”这个词。
我猜想它在最近的投机性执行漏洞的新闻报道中引起了您的注意,尽管您可能在更明显不需要您关心的情况下也早些时候听说过它。这些漏洞的发布时间早于计划的发布,可能导致媒体报道的策划程度不如预期。从最终用户的角度来看,您需要安装BIOS更新,操作系统更新以及某些情况下的应用程序更新。您无需知道或关心其中的任何一个是否包含新的微码。
因此,即使意识到您可能不需要了解或关心,您仍然可能出于好奇而感兴趣:如何将微代码与其他固件区分开?
好吧,首先要认识到的是,不一定要有一个单一的硬性定义,而更像是布雷格斯和卢布斯的情况。关于微码,我们仍然可以说一些事情:
微码通常在CPU内部而不是CPU上运行。这是高级视图。
微代码的架构通常看起来与普通代码(包括普通固件)的架构完全不同。它可能是高度并行的,并且实现得更接近硬件。现有的几个答案(包括您自己的答案)都对此进行了讨论,但应注意的是,具体细节可能因CPU设计而异。
尽管通常将硬件设计为仅运行制造商提供的固件,但使用第三方固件的情况并不罕见 -尽管它可能会使保修无效!第三方微码要少得多,尽管我相信在远古时代(我说的是CPU大约等于面包箱的大小),某些最终用户会修改其CPU中的微码。据我所知,这在PC中使用的CPU中是不可能的。
微代码通常会翻译或帮助实现公共指令集体系结构,即,它运行操作系统设计者和应用程序程序员使用的机器代码。下一节将对此进行更多介绍。
“执行与数据”很多答案都使用这种范例
我担心会以令人困惑的不同方式,但我会发表自己的评论。本节还用于扩展上述最后一个要点。此处的目标是尝试区分CPU正在执行的工作(由硬件和微代码的组合实现)和典型设备正在执行的工作(由硬件和固件的组合实现)。我将选择SATA硬盘驱动器。
SATA驱动器遵循计算机的指令,即“从扇区5123读取数据”和“将数据写入扇区1321”。驱动器的固件负责使硬件实现这一目标,并且通常是在某种嵌入式CPU上运行的非常普通的代码。驱动器的指令按顺序到达,尽管可能未按它们到达的顺序对其进行处理。这些指令不是程序,而是由主CPU上运行的程序发送的。特别是没有控制流,即没有指令告诉SATA驱动器接下来要运行哪条指令。
CPU由计算机负责。初始化完成后,它将运行主板(BIOS,另一种固件)提供的指令(“机器代码”),该指令将引导它运行操作系统提供的机器代码,操作系统将指示其运行提供的机器代码。由应用程序供应商提供。CPU本身从EEPROM(对于BIOS)或RAM(对于操作系统和应用程序)中检索机器代码。特别是,机器码具有控制流程:机器码告诉CPU接下来要执行什么机器码。您可以重复循环遍历同一机器代码,可以根据代码所处理的数据来运行不同的代码位-设备接口语言(如SATA代码)中的指令可以完成一组有限的简单任务,但是机器代码可以做什么都可以。(另请参见图灵完整性。)
我们可以将上面的最后一个要点重写为:微代码通常实现图灵完成语言;普通固件通常没有。
用微码说“解释硬件指令”是什么意思。
正确,但可能令人困惑;重要的一点是区分具有控制流且为Turing Complete的机器代码与由设备接口(如SATA)定义的指令之间的区别,而SATA则应具有和没有。
“微码”是否适用于声卡上运行的代码
不,声卡就像SATA驱动器一样,接收指令而不是代码。这些指令可能像“播放急音”或“将数据解释为波形并播放”。还是很简单的。
和视频卡(GPU)?
老式视频卡(不带GPU的视频卡)与SATA驱动器相同。指令就像“将此像素设置为此颜色”或“在此位置写入A”。
... GPU很复杂,位于我上面试图描述的两个世界之间。将它们视为位于主机内部的专用计算机是最简单的,它有自己的CPU。的确,SATA驱动器之类的设备也具有嵌入式CPU,但是区别在于SATA驱动器中的嵌入式CPU仅运行驱动器制造商提供的代码,而GPU也运行操作系统和/或应用程序供应商提供的代码。确实,这是一个完全独立的问题。
TL; DR:微代码是一种特定的固件,可以帮助硬件实现“图灵完成”指令集。