微码到底是什么?它与固件有何不同?


50

就术语而言,“微代码”到底是什么?如果可以更新,它与固件有何不同?

这个问题不是这个问题的重复(据我所知),我也曾问过有关修改微代码的问题。在这里,我严格地想知道如何正确使用这些术语。

更新资料

我选择了一个答案,但是对此我并不特别满意。我已经回答了很多答案,但我发现很多回答同样令人不满意。所以让我给你展示我的两个框架,

  1. “处理器微代码类似于处理器固件。” 随着我越来越多地阅读本文,这就是我的看法。在这种情况下,“微码”只是通过“处理器固件”进行营销。忍受我..
  2. 或者,我错了,而且我知道它会发生!在这种情况下,我需要更彻底地了解我为什么做错了。在我读到的这些答案中,我指出自己错了,我正在努力地理解它们,
    • “执行与数据”很多答案都使用了这种范例,但是对于CPU而言,这对我来说意义不大。一些断言的固件被执行,但是通过什么呢?对于CPU,是程序指令还是数据?
    • 如果固件在软件和硬件之间架起了桥梁(请阅读:众神的电气工程学知识),那么微码又怎么也不能满足这一要求。
    • 随着时间的流逝,“解释”的意义越来越小。用微码说“解释硬件指令”是什么意思。如果这是真的,那么如果不对其进行解释,而是将其预编译为不同的硬件指令,而只是“执行”,那么它的性能是否会和它一样?另外,通用MIDI如何不能在同一角度解释?它是一种由“ MIDI微码”解释并在硬件上运行的语言。还是哑终端可以解释电传打印机的指令以进行可视显示?
    • “微代码”是否适用于在声卡和视频卡(GPU)上运行的代码?

我不是专家,但是我想说微码是处理器固件。我想所有关于微代码执行方式的数据都将由intel / AMD专有,但是我可以猜测它是如何工作的。您有一个简单的CPU集,一些基本的东西,例如从内存和数学运算符中获取。然后,您将获得一个复杂的指令集(例如x86 / intel)。CPU从内存中获取指令,并使用微码将复杂的指令转换为更简单的指令。一个例子就是乘法。大多数CPU都有乘法指令,但实际上乘法是由多个移位组成的。
Programmdude

微码一词指的是它使用/在许多CPU“代码”指令中位于其下方。它基本上告诉CPU如何模拟指令和功能。因此,它的名字。从计算机所有者的角度来看,这是硬件供应商提供的另一组代码,因此可以将其汇总为固件。
eckes

IMO,最好的简单答案是:“每次处理器执行一条指令,实际上就是在执行微码程序。” 在您看来,单处理器指令就是特定的微码指令序列,即“微码程序”。每个指令都有自己的微码程序。各个微码指令启用/禁用/等处理器的各种内部位。
伊桑·里索

Answers:


57

固件一词的起源是介于硬件和软件之间的中间点。它是指存储在硬件设备上的非易失性存储器中的软件。例如,当EEPROM和Flash存储器用于存储由设备本身运行的代码时,它们被嵌入到硬件设备中。

在某些类型的硬件中,将其“固件”存储在驱动程序软件中,并在启动/初始化时将其加载到设备上,而不是将其永久保留在设备上已变得越来越普遍。例如,如今,将数百KB的固件代码存储在加载到主机OS上的软件驱动程序中,并在驱动程序初始化时将其发送到设备中已经不是什么大问题。

即使根据所接受的固件的定义,它通常也被称为“固件”,因此从技术上讲,您可能不会将其视为固件,因为它不驻留在硬件上(如果拆下硬件并将其放在另一个系统中,不会保留该版本的“固件”)。

微码是后一种“固件”的子集。微码不是启动时加载到设备上的所有“固件”的通用术语。相反,它是特定于CPU的,其中,微代码基本上形成了高层标准CPU指令和特定于该CPU的低层操作之间的转换层。它在引导时通过BIOS加载到CPU,但在引导阶段稍后也可以由OS替换。

对微代码的更新可以允许修改CPU的低级行为,以解决某些尚未发现的bug,而无需更换CPU硬件。微码通常包含从上级指令到下级指令的最有效映射,以实现最佳速度和能效,因此有时当需要更改微码来修复某些错误时,它可能导致性能降低。

请注意,Meltdown(仅影响Intel芯片的漏洞)不能仅通过微码更新来解决,而需要更改核心OS功能,这可能会进一步降低性能。Spectre(影响Intel,AMD和ARM芯片的漏洞)也许可以仅通过微代码更新来解决。


要在编辑后回答您的一些特定问题,请执行以下操作:

  1. 是的,微码基本上是在处理器上运行的固件。特殊术语“微码”专门指处理器上的固件,该固件包含用于从标准机器语言转换为低级处理器指令的蓝图。因此,它是比固件更具体的术语。

    请注意,正如我上面所讨论的,它在关闭时并没有存储在CPU上,而是在每次引导时加载到CPU上,因此从某种意义上说,它不能像传统固件那样工作。但是,现在有很多硬件都在执行此操作,并且仍称为“固件”,因此可以将其称为固件。

  2. 我不认为你错了。固件不必以某种特定的机器语言编写,并且其执行不必以某种特定方式触发。在某个较低的级别上,所有机器代码都是“数据”,它由处理器“读取”并以某种方式解释。

    术语“微代码”通常仅用于主CPU,而不用于图形卡或其他硬件,即使这些其他设备可能已经以相同的方式加载了代码。


1
您的第二句话不正确;固件包括存储在ROM中的软件。曾几何时,大多数固件都在ROM中,而其他替代方法才可以负担得起。
哈里·约翰斯顿

1
显然,“微码”特定于CPU。问题不在于它是否有所不同。除去范围(“ CPU”),您几乎可以直接得到“较高层指令和较低层操作之间的转换层”的引用。那几乎就是固件的定义。那不是所有固件的功能吗?这个词很多,但我认为上面的描述和简洁的描述是:“处理器微代码类似于处理器固件。”
埃文·卡罗尔

@Evan,大多数设备间接接收其指令,这些指令是从CPU上运行的代码发送来的。只有CPU直接在处理用户提供的代码。还应考虑到大多数设备都包含运行固件的某种嵌入式CPU,并且该CPU可能具有自己的微代码。这种区别可能只对硬件设计人员和内核程序员有意义,但并不是任意的。
哈里·约翰斯顿

我的意思是“大多数设备都包含运行固件的某种嵌入式CPU,并且该CPU可能具有自己的微代码”。那么,处理声卡上的Midi流的代码也是“微码”吗?还是绘制/渲染的代码在哑终端上显示字符?
埃文·卡洛尔

否。在声卡上运行以处理MIDI流的代码只​​是普通固件。该代码处理是声卡处理MIDI流将微上运行的代码。(实际上,我不确定像声卡之类的东西上的嵌入式CPU首先是否需要微码,但这不重要。)关键是MIDI流或要发送到的字符。哑终端,不是代码。它们只是数据。
哈里·约翰斯顿

23

https://wiki.debian.org/Microcode

CPU微码

处理器微代码类似于处理器固件。内核能够更新处理器的固件,而无需通过BIOS更新来更新。微码更新保存在易失性内存中,因此BIOS / UEFI或内核在每次引导时都会更新微码。

英特尔和AMD的处理器可能需要更新其微代码才能正常运行。这些更新修复了错误/勘误,这些错误/错误可能导致从错误的处理,代码和数据损坏以及系统锁定等任何原因。

BIOS(或UEFI)在引导过程中更新CPU微代码,但是大多数时候主板供应商不会发布频繁的BIOS / UEFI更新,或者用户不会安装此类更新。由于这些原因,系统处理器可能会在大量系统上以过时的微代码运行。

例子:

https://www.win-raid.com/t3355f47-Intel-AMD-amp-VIA-CPU-Microcode-Repositories.html


9
并不是那么简单:微代码是“在硬件和计算机体系结构级别之间强加解释器的技术”。这样,微代码是一层硬件级别的指令,可在许多数字处理元素中实现更高级别的机器代码指令或内部状态机排序。来源:en.wikipedia.org/wiki/Microcode

17
那么等等……“船”只是一种特殊的“车辆”?真是无用的话!:-)
哈里·约翰斯顿

4
@HarryJohnston好吧,我认为在某些情况下将“船”与其他类型的车辆区分开来很有用……“微码”是许多现代CPU中都存在的一种非常特殊的“事物”……(因此,最好有一个术语)。
RadovanGarabík18年

4
@RadovanGarabík:这就是哈里的讽刺意味。
彼得·科德斯

4
我不明白 如果“内核无需通过BIOS更新就可以更新处理器的固件”,那么为什么“主板供应商不会发布频繁的BIOS / UEFI更新”这一事实意味着“系统处理器是可能会在大量系统上以过时的微代码运行”?为什么内核不只是修补微代码?如果BIOS从不更新,并且有更频繁的更新替代方案,为什么还要依靠BIOS?
Ajedi32 '18年

6

嗯,英特尔“微代码更新”实际上是“固件”更新,从某种意义上说,它们更新的不仅仅是处理器的微代码转换单元。

这些针对英特尔的统一处理器软件包更新(我们称为“微代码更新”)也更新了其他片上微控制器(例如PMU和电源管理内核)以及用于不同片上处理器子系统的多个参数表。它们相当复杂。

这些信息可从与微代码和微代码更新有关的若干英特尔专利中获得。


4

我认为“微码”一词主要是指代码的功能(它甚至使用较低级的指令执行低级指令),而“固件”则主要是指其存储和管理方式(比软件更不容易更新) ,比硬件更容易更新)。从这个意义上讲,这就像“应用程序”和“ JAR文件”之间的区别-同一程序可能同时存在,但是您是从两个不同的角度来看它。

顺便提一句,微代码的想法可以追溯到1951年的莫里斯·威尔克斯(Maurice Wilkes),这是在将计算机处理器嵌入硅片之前的几十年。


3

固件通常是指包含CPU而不是CPU本身的设备的代码,例如android手机的固件。

微码是复杂指令集(例如486、686,AMD-64等)与芯片制造商为其设计芯片的较低级指令之间的转换层。因此,CPU指令集中的许多指令不是用硅实现的,而是通过微码转换为用硅实现的多个指令。


但是,并非所有固件都如此。可以在Silicon中实现但不能通过软件更新的指令ABI?
埃文·卡罗尔

1
英特尔的“微代码更新” 所要做的不只是修改微代码指令的解码方式。例如,他们可以禁用循环缓冲区(在Skylake中修复SKL150勘误表),因为在可能的情况下,CPU被设计为在发现硬件错误的情况下可以做到这一点。
彼得·科德斯

3

“微码”是原始术语,指用于实现处理器“公共”指令集的解释器的指令。

但是随着时间的流逝,实现方案有很多变化,这种区分变得越来越模糊。首先是水平与垂直微码,然后是用于在“主”处理器指令集中编写“微码”(以实现I / O指令)的各种方案。然后,需要区分通过普通程序“运行”操作轻松加载的代码与保存在ROM或其他受保护且相对不变的存储中的代码(例如,用于BIOS)。因此,发明了术语“固件”以指代这些指令,这些指令以某种方式使得在存储中更具持久性(并且对于用户修改而言更不可访问)。

但是自从做出这些最初的区分以来,事情已经发生了很多次变迁和扭曲,而且这些术语只能在给定的处理器和OS环境中以任何精度进行定义。


+1,关键是“微码”一词有很多含义,我认为OP确实想了解“微码更新”,而不是其他含义。
彼得·科德斯

3

[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:微代码是一种特定的固件,可以帮助硬件实现“图灵完成”指令集。


1

微码(“控制存储”)是驻留在易失性或非易失性存储器中的数据,通常是一个很小但很宽的存储器,其数据输出信号连接到并行硬件功能单元,随机控制逻辑等的控制信号输入端状态机提供微码存储器的地址输入,该状态机一次遍历一个存储器字(“微程序指令”),以有效地对一个或多个硬件块的控制信号进行排序。这种时间多路复用硬件,并允许使用更少的随机逻辑来实现复杂的操作。

在现代微处理器中,可能存在将物理硅微体系结构抽象为具有通用“机器代码”接口的更通用体系结构家族所必需的微代码/排序单元的层次结构。例如,可能存在多层微码/排序以实现指令解码器和浮点单元。

传统意义上的固件是驻留在非易失性存储器中的任何软件/数据,预计它们很少或永远不会更改。这直接与不断变化的存储在系统内存中或从中写入的软件形成对比。微码具体是指代表微程序的数据,以对硬件进行顺序控制。

微码可以在固件中实现/固件可以包含微码,但是它们并不相同。


1
现代x86 CPU的连线比您描述的要硬得多。听起来您正在描述的是非流水线386,而不是Haswell / Skylake。英特尔的“微码更新”所要做的不只是修改微码指令的解码方式。例如,他们可以禁用循环缓冲区(在Skylake中修复SKL150勘误表),因为在可能的情况下,CPU被设计为在发现硬件错误的情况下可以做到这一点。
彼得·科德斯

@PeterCordes 1)x86体系结构与提出微码的概念无关。2)如果您理解我的回答,我们就会同意它像您所提到的那样对控制信号进行排序

1
不,英特尔微指令并不是真正的控制信号。他们没有像传统的MIPS管道那样直接​​对逻辑单元进行编程。乱序调度程序将读取uops,以找出哪些uops与哪些其他uops具有数据相关性。这是一个与6502之类的内部模型完全不同的内部模型,后者的执行一条指令的多个步骤是从解码ROM读取的。您所描述的是术语“微代码”的历史含义,但不是现代CPU的“微代码更新”。
彼得·科德斯

我在哪里(或关于这个问题的问题)提到Intel或x86微操作(与控制库中的“微程序”不同)?同样,从控制存储中提供的字面上的任何内容都是控制信号,无论该信号是已排序还是静态,逻辑或有线。我描述的是微码的字面定义,也就是“微码更新”。您不愿意回答我的答案,因为Haswell中的许多所说信号都是静态的。记录下来,许多都是有序的,排序绝对不与流水线或OoOE互斥。

1
因此,您正确回答了“什么是微代码指令”问题,但是CPU的“微代码更新”与“微代码”一词的技术含义不同。这是应该明确提出的重要观点,因为这是我认为OP混乱的根源。
彼得·科德斯

0

固件是放置在ROM或其他非易失性存储器中的可执行代码。

固件的最初和主要目的是在CPU启动时存在,因此它具有执行代码即可启动或引导CPU所属的任何系统。对于PC,固件还用于为正在运行的操作系统提供服务,还包含用于控制风扇,电源和其他一些东西的嵌入式控制器的代码,以及在后台运行的ME / PSP的代码。 。

需要固件的外围设备(例如硬盘驱动器,USB设备等)具有嵌入式CPU。


微码不是可执行代码,而是设备内部设施使用的代码。

它通过WRMSR指令加载到Intel或AMD CPU中。将固件加载到设备中涉及对ROM或闪存介质进行编程,或者依赖于设备中存在的小型加载程序来接受固件。

固件和微代码更新属于相似的类别-您需要做一些事情才能使硬件正常工作,并且可能需要不时进行更新-但它们是完全不同的事情。

许多CPU中的复杂指令不是直接连接到硬件中,而是由主CPU中类似CPU的较小设备“执行”。微码控制这些操作。至少可以回溯到具有包含微代码的“ MicroROM”的Motorola 68000。

除了英特尔或AMD处理器外,没有人知道微码真正控制或做什么,因为它们没有发布细节。有尝试破解它。 参考

实际上,微码更新本质上用于禁用导致已知型号/步进的CPU出现问题的指令,并且Intel最新的CPU通常至少需要更新一次微码才能可靠运行。


如果您阅读有关6502 PLA解码ROM的信息,可能会获得一些有关CPU微代码实际/实际作用的观点-6502是旧的8位CPU,其指令由内部PLA排序/控制。PLA基本上会说出每条指令的每个步骤涉及芯片的哪些部分(6502条指令的范围为2到7个周期)。这远未达到缓存,超标量体系结构,分支预测等功能。不确定现代CPU上的微代码是否可以控制类似PLA的功能。


1
英特尔的“微代码更新” 所要做的不只是修改微代码指令的解码方式。例如,他们可以禁用循环缓冲区(在Skylake中修复SKL150勘误表),因为在可能的情况下,CPU被设计为在发现硬件错误的情况下可以做到这一点。
彼得·科德斯

1
关于6502 PLA的有趣之处在于,流水线CPU必须比这更加硬连线。传统的MIPS使用指令字的不同字段来以某种相似的方式直接控制内部逻辑,但是当然,流水线CPU在运行中有多个指令,如果没有停顿,则每个流水线级可能有一个指令。(或者对于超标量,每个流水线级有2个或更多,而对于无序的情况则更为复杂。)现代CPU的许多内部结构都是硬连线的,但是带有微代码更新可以调整的旋钮。
彼得·科德斯

0

术语

我将在本pdf中仅使用use-context对此进行回答。

  • 固件 -微码通过CPU的固件提供了一个路径更新。

    “通常,在早期启动过程中,主板固件(例如BIOS或UEFI)或操作系统会将微码补丁上传到CPU。”

  • 微码 -本身就是“指令解码单元(IDU)”使用的数据。一个IDU既可以硬连线微编码。在这种情况下,微码仅表示已编程。ALSO的意思是“多个微码”。注射吸毒者

    IDU在控制单元中起着核心作用,并根据指令寄存器的内容生成控制信号。

  • 发送到IDU的宏指令中要解码的一条指令可以返回任意数量的微指令

  • 微指令一个预先计算的“控制字”,所有状态和指令执行一个时钟周期。发送到CPU以生成控制信号

因此,在这种情况下,您将使用固件更新微码。您可以将宏指令发送到微编码的IDU,以将宏指令解析为“微指令”以在CPU上执行,从而将其转换为控制信号。

我对此的阅读

微码是数据,但更新微码通过固件完成的。令人困惑的是,由于您正在谈论本质上是什么构成内部查找表,因此它本身也肯定是固件,因为它实际上存储在芯片上并在芯片的执行流程中使用。我认为您可以提出一个论点,即通用MIDI,硬件PostScript和哑终端的控制信号在硬件上也以相同的方式进行解释,并且某些东西会接受指令并最终以某种解释过程生成“控制信号”

看来我们对CPU中的这些进程和组件有一个特殊的名称:CPU上的“ IDU”,以及IDU使用的包含所有“微指令”的特定输入表的名称:“微代码”。有关该过程的信息是专有的并且是封闭的。我认为它类似于从调制解调器(在Hayes调制解调器上有ATDT等)到MIDI卡的任何其他技术,但是我们没有将特定的查找表命名为“微码”,而是将总称“固件”用于刷新过程以及整个有效载荷存储在芯片上。


2
Linux(和Windows)可以完全独立于要谈论的主板固件来更新CPU微代码。主板固件确实包含最新的CPU微代码以及一种在从磁盘加载任何代码之前应用它的机制,但是如果您有一段时间没有更新主板固件,则仅通过更新软件仍然可以拥有最新的CPU微代码。Mobo固件和CPU微代码之间的连接问题实在太大了。让固件在每次引导时都更新微码很有用,但不是必需的(有时是稳定的除外)。
彼得·科德斯

2
同样,并不是所有的x86宏指令都可以通过在微码定序器ROM中查找来进行解码。在Intel CPU上,将解码为4个或更少的微指令(微操作)的指令硬编码到解码器中。在这个词的意义上,大多数指令不是“微编码的”。整数除法是(dividiv),但甚至FP除法也是单uop(因为它对性能更重要,因此,多步迭代逻辑是在除法单元内部完成的,而不是使用微编码的uops)。
彼得·科德斯

@PeterCordes您是编写此答案的人,可以编辑我的任何答案以使其在技术上更加正确。你有全权委托书。虽然我会在今晚尝试更改这些更改,但是如果您的时间有限。
埃文·卡罗尔

如果我能解决这个问题,我会写完我开始的答案。就目前而言,哈里·约翰斯顿(Harry Johnston)的答案可能是迄今为止回答我认为您真正想知道的事情的最佳答案(这是“微代码更新”的真正更新,这与“ CPU微代码”的含义不同,因为它是一个过分简化的名称,就像技术资料中常见的一样,需要一个单词的名称,公众才能跟踪。)
Peter Cordes

0

我参加了基础ISA设计课程,主要是研究和设计基于MIPS概念的RISC处理器。这就是我要记住的

据我了解,处理器的基本模块(例如寄存器,ALU,多路复用器和内存模块)需要某些信号才能使其工作。您将这些信号称为“断言”信号,因为它们是操作这些块所需的信号。从本质上讲,CPU是ALU,存储模块,寄存器和其他硬件的意大利面条块。意味着每个CPU必须断言一定顺序的控制信号才能完成其工作(我的意思是基本指令,例如ANDI,ORI,JMP,BNE,BEQ等)。当我在测试和调试指令集期间不得不自己声明信号(实际上要遍历所有MIPS指令)时,我对此感到百感交集,因为当时课程的进度还没有教我任何有关控制单元的知识。

另一方面,汇编语言归结为指令字中的操作码及其操作数(基本上是数据总线的宽度)。就MIPS而言,指令字的前6位是您的操作码。仅凭纯粹的数学检查,您就不能仅凭6位就“断言”您的ALU,寄存器,存储器,复用器。

除非您有...指令解码器。指令解码器基本上会获取您的操作码,并生成操作硬件所需的所有“断言”信号。但是,指令解码器在体系结构之间的实现上有所不同,并且在某些情况下是可编程的。微码会影响指令解码器的可编程部分。

我已经相信固件是硬件中嵌入的任何信息的总称。在某些情况下,由于其位流可以被编码并存储在诸如EEPROM和闪存之类的硬件中,因此它也称为微代码。然而,在大多数情况下,它是FPGA中使用的编译代码,asm甚至VHDL / Verilog位流。在我看来,微代码似乎是用于在所选处理器中指定“断言信号”的语义。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.