Eva*_*oll 57 firmware cpu terminology
就术语而言,“微码”究竟是什么,如果可以更新,它与固件有何不同?
这个问题不是这个问题的重复(据我所知),我也问过关于修改微码的问题。在这里,我非常想知道如何正确使用这些术语。
我选择了一个答案,但我对此并不特别满意。我已经参与了很多答案,我发现很多这些答案同样不令人满意。所以让我向你展示我的两个框架,
tho*_*ter 62
固件这个词的起源是硬件和软件之间的中间点——嵌入在硬件上的软件。是指存储在硬件设备上的非易失性存储器(如ROM、EEPROM或Flash存储器)中,供设备本身使用的软件。
在某些类型的硬件中,将其“固件”存储在驱动程序软件中并在启动/初始化时加载到设备上变得越来越普遍,而不是将其永久保留在设备上。例如,现在将几百 KB 的固件代码存储在加载到主机操作系统上的软件驱动程序中,并在驱动程序初始化时将其发送到设备并不是什么大问题。
这通常仍被称为“固件”,即使它不驻留在硬件上(如果您分离硬件并将其放入另一个系统,它不会保留该版本的“固件”)。
微码是其中的一个子集。微码并不是在启动时加载到设备上的所有固件的通用术语。相反,它是特定于 CPU 的,其中微码形成了更高级别的标准 CPU 指令和特定于该 CPU 的较低级别操作之间的转换层。它可以在启动时由 BIOS 加载到 CPU 上,并在稍后的启动阶段由操作系统替换。
微码的更新可以允许修改 CPU 的低级行为以解决某些尚未发现的错误,而无需更换 CPU 硬件。微码通常包含从高级到低级指令的最有效映射,以获得最佳速度和能源效率,因此有时当需要更改微码以修复某些错误时,可能会导致性能下降。
请注意,与 Spectre 不同,Meltdown(仅影响 Intel 芯片的漏洞)无法仅通过微代码更新来修复,并且需要更改核心操作系统功能,这可能会进一步降低性能。
要回答您编辑后的一些具体问题:
是的,微码基本上是在处理器上运行的固件。特殊术语“微码”特指处理器上的固件,其中包含将标准机器语言转换为低级处理器指令的蓝图。所以它是一个比固件更具体的术语。
请注意,正如我上面讨论的那样,它在关闭时不会存储在 CPU 上,而是在每次启动时加载到 CPU 上。
我不认为你错了。固件不必用某种机器语言编写,其执行也不必以某种方式触发。在某个低级别,所有机器代码都是由处理器“读取”并以某种方式解释的“数据”。
术语“微代码”通常仅用于主 CPU,而不用于图形卡或其他硬件,即使这些其他设备可能以相同的方式将代码加载到它们上。
小智 26
https://wiki.debian.org/Microcode
CPU微码
处理器微码类似于处理器固件。内核能够更新处理器的固件,而无需通过 BIOS 更新来更新它。微码更新保存在易失性存储器中,因此 BIOS/UEFI 或内核在每次启动期间更新微码。
Intel 和 AMD 的处理器可能需要更新其微代码才能正常运行。这些更新修复了可能导致错误处理、代码和数据损坏以及系统锁定等任何问题的错误/勘误表。
BIOS(或 UEFI)在启动期间更新 CPU 微码,但是大多数时候主板供应商不会频繁发布 BIOS/UEFI 更新,或者用户不会安装此类更新。由于这些原因,系统处理器很可能在大量系统上以过时的微代码运行。
例子:
https://www.win-raid.com/t3355f47-Intel-AMD-amp-VIA-CPU-Microcode-Repositories.html
小智 6
嗯,英特尔“微码更新”实际上是“固件”更新,因为它们更新的不仅仅是处理器的微码转换单元。
这些针对英特尔的统一处理器包更新我们称为“微码更新”,还会更新其他片上微控制器(例如 PMU 和电源管理内核)以及不同片上处理器子系统的几个参数表。它们相当复杂。
此信息可从与微码和微码更新相关的多项英特尔专利中获得。
小智 5
我认为术语“微代码”主要指代代码的功能(它使用更低级别的指令执行低级指令),而术语“固件”主要指它的存储和管理方式(比软件更不容易更新) ,比硬件更容易更新)。从这个意义上说,它很像“应用程序”和“JAR 文件”之间的区别 - 同一个程序可能两者都是,但您是从两个不同的角度来看待它。
顺便说一句,微代码的想法可以追溯到 1951 年的莫里斯·威尔克斯 (Maurice Wilkes),这比计算机处理器嵌入硅中还早了几十年。
“微代码”是最初的术语,指的是用于实现处理器“公共”指令集解释器的指令。
但随着时间的推移,由于实施方案存在许多变化,这种区别变得更加模糊。首先是水平微代码与垂直微代码,然后是在“主”处理器指令集中编写“微代码”(例如,实现 I/O 指令)的各种方案。然后需要区分通过普通程序“运行”操作轻松加载的代码与保存在 ROM 或其他受保护且相对不可变的存储中的代码(例如 BIOS)。因此,术语“固件”被发明来指代这些指令,这些指令以某种方式在存储中变得更加持久(并且用户修改的访问性更差)。
但自从做出这些最初的区别以来,事情已经发生了很多变化和扭曲,并且这些术语只能在给定的处理器和操作系统环境中以任何精度进行定义。
[注意:此答案专门用于解决最近的编辑问题,不会以其他方式添加到已发布的几个合理答案中。]
因此,重申一下:微代码(至少初步近似)是一种特定类型的固件。
在这种情况下,“微代码”只是对“处理器固件”的营销。
嗯,这不是营销。营销部门会将其称为XBoost Pro(TM)或其他名称。相反,它是一个工程术语;如果您设计 CPU,微代码和 CPU 的其他固件(以及其他设备典型的固件类型)之间的区别对您来说很重要。如果没有,可能就不是。
如果您设计主板或编写操作系统,您可能会使用“微代码更新”作为更笨重且不太熟悉的“CPU 固件更新”的简写。大多数 CPU 固件更新主要影响微代码,因此它非常接近同一件事。您可能确实知道其中的区别,但您无需关心它。
最终用户不需要知道或关心其中的差异,并且在理想的世界中根本不会听到“微代码”这个词。
我猜您在最近的推测执行漏洞的新闻报道中引起了您的注意,尽管您也可能早些时候在更明显您不需要关心的上下文中听到过它。这些漏洞的发布时间早于计划,这可能导致新闻报道的策划程度低于原本的水平。从最终用户的角度来看,您需要安装 BIOS 更新、操作系统更新,在某些情况下还需要安装应用程序更新;您既不需要知道也不需要关心其中是否包含新的微代码。
因此,即使意识到您可能不需要了解或关心,您可能仍然出于纯粹的好奇心而感兴趣:如何将微代码与其他固件区分开来?
嗯,首先要认识到的是,不一定有一个单一的硬性定义,它更多的是Bleggs 和 Rubes 的情况。尽管如此,关于微代码我们还是可以说一些话:
微代码通常在CPU内部运行,而不是在CPU上运行。这是高层的观点。
微代码的架构通常看起来与普通代码(包括普通固件)的架构完全不同。它可能是高度并行的,并且实现起来更接近硬件。几个现有的答案(包括您自己的答案)讨论了这一点,但应该注意的是,细节可能会因 CPU 设计而异。
尽管硬件通常设计为仅运行制造商提供的固件,但使用第三方固件的情况并不少见- 尽管这可能会使保修失效!第三方微代码要少得多,尽管我相信在古代(我说的是当 CPU 大约有面包箱大小时)一些最终用户会修改其 CPU 中的微代码。据我所知,这对于 PC 中使用的 CPU 来说是不可能的。
微代码通常翻译或帮助实现公共指令集架构,即,它运行操作系统设计者和应用程序员使用的机器代码。下一节将详细介绍这一点。
“执行与数据”很多答案都使用这种范例
我担心以令人困惑的不同方式,但我会发表我自己的评论。本节还用于扩展上面最后一个要点。这里的目标是尝试区分 CPU 正在执行的工作(通过硬件和微代码的组合实现)和典型设备正在执行的工作(通过硬件和固件的组合实现)。我将选择 SATA 硬盘驱动器。
SATA 驱动器遵循计算机的指令,即“从扇区 5,123 读取数据”和“将此数据写入扇区 1,321”。驱动器的固件负责让硬件实现这一点,它通常是在某种嵌入式 CPU 上运行的非常普通的代码。驱动器的指令按顺序到达,但可能不会按照到达的顺序进行处理。这些指令不是程序,它们是由主 CPU 上运行的程序发送的。特别是没有控制流,即没有指令告诉SATA驱动器接下来要运行哪些指令。
CPU负责管理计算机。一旦完成初始化,它就会运行主板(BIOS,另一种类型的固件)提供的指令(“机器代码”),指示它运行操作系统提供的机器代码,操作系统指示它运行提供的机器代码由应用程序供应商提供。CPU 本身从 EEPROM(对于 BIOS)或 RAM(对于操作系统和应用程序)检索机器代码。特别是,机器代码具有控制流:机器代码告诉CPU接下来要执行什么机器代码。您可以重复循环相同的机器代码,您可以根据代码正在处理的数据运行不同的代码位 - 设备接口语言(如 SATA 代码)中的指令可以执行一组有限的简单任务,但机器代码可以做任何事情。(另请参阅图灵完备性。)
我们可以将上面的最后一个要点重写为:微代码通常实现图灵完备语言;普通固件通常不会。
用微代码“解释硬件指令”是什么意思?
真实但可能令人困惑;重要的一点是机器代码和由设备接口(例如 SATA)定义的指令之间的区别,机器代码具有控制流并且是图灵完备的,而设备接口(例如 SATA)没有也不是。
“微代码”是否适用于声卡上运行的代码
不,声卡接收指令,而不是代码,就像 SATA 驱动器一样。这些指令可能类似于“播放升音”或“将此数据解释为波形并播放”。还是很简单的。
和显卡(GPU)?
老式显卡(没有 GPU 的显卡)与 SATA 驱动器相同。指令类似于“将此像素设置为此颜色”或“将 A 写入此位置”。
...GPU 很复杂,介于我上面试图描述的两个世界之间。最简单的方法可能是将它们视为位于主计算机内部的专用计算机,它有自己的 CPU。确实,SATA 驱动器等设备也具有嵌入式 CPU,但不同之处在于 SATA 驱动器中的嵌入式 CPU 仅运行驱动器制造商提供的代码,而 GPU 还运行操作系统和/或应用程序供应商提供的代码。实际上,这是一个完全独立的问题。
TL;DR:微码是一种特定的固件,它帮助硬件实现图灵完备指令集。