微代码如何加载到处理器?

微代码如何加载到处理器?

我读到每次重启时微代码都会加载到处理器中。它驻留在闪存中,当机器启动时,它会被复制到 CPU。或者在 Linux 的情况下,操作系统本身具有处理器的微代码副本。但微代码是如何复制到处理器的?计算机中的所有数据都在 CPU 的同意下移动。CPU 以机器语言获得指令。由于微代码对于执行这些机器语言指令至关重要,因此如果处理器中没有微代码,CPU 如何执行访问闪存并执行后续操作的指令?这是否意味着硬连线的非微代码指令在实模式下复制微代码?

答案1

我读到每次重启时微代码都会加载到处理器中。

BIOS 可以在启动期间发出微代码更新。操作系统也可以。这些更新经常是必需的,尤其是较新的 Intel CPU。

它驻留在闪存中,当机器启动时,它会被复制到 CPU。或者在 Linux 的情况下,操作系统本身有处理器的微代码副本。但是微代码是如何复制到处理器的呢?

现代 Intel 和 CPU 都具有一种称为“特定型号寄存器”的机制,以及用于读取 (RDMSR) 和写入 (WRMSR) 的特殊 CPU 指令。虽然这些寄存器会影响 CPU 设置,但使用新微码的地址写入特定寄存器会告诉 CPU 读取内存区域并应用到现有微码上。

计算机中的所有数据移动均由 CPU 同意。CPU 以机器语言发出指令。由于微代码对于执行这些机器语言指令至关重要,因此如果处理器中没有微代码,CPU 如何执行访问闪存并执行后续操作的指令?

总是有微码。上述机制会更新微码。Intel/AMD 并没有真正公布其工作原理,它们只提供了更新机制。显然,它以某种方式将 ROM 微码复制到某种 CPU 内部存储器中。但是 CPU 启动时会有一些微码。一些最近的 Intel 和可能的 AMD CPU 在启动后如果没有 BIOS 进行微码更新就无法可靠地工作,但显然它们可以很好地执行初始微码更新。

这是否意味着硬连线的非微码指令在实模式下复制微码?

初始微代码设置由 CPU 内部完成,无需执行任何指令即可实现此目的。它是在执行第一条 CPU 指令之前设置的。

要更新 BIOS,必须执行适当的 RDMSR 和 WRMSR 指令。

参考:“该指令必须在特权级别 0 或实地址模式下执行;否则,将生成通用保护异常 #GP(0)。 ”如果不在实模式下执行,则必须在环 0 或内核模式下执行。 您可以随时更新微代码。

答案2

现代 CPU 已安装完整的微代码。此微代码驻留在 CPU 本身的特殊 ROM 区域中,无法更改/擦除。因此,CPU 开箱即可运行。

然后,系统 BIOS 和/或操作系统可以启动微代码的加载更新进入 CPU。这样的更新是不是完整的微代码,而是一个用于修复错误的小补丁。CPU 包含一小块易失性 RAM 用于此目的。

有用的参考:https://www.dcddcc.com/pubs/paper_microcode.pdf

答案3

微码更新只是对现有 CPU 微码的修补,该微码永久刻录到 ROM 中。CPU 有一个永久 ROM 和一个可包含新代码的修补 RAM。RAM 中还有一个“匹配”值表。该表为 ROM 的每个可修补部分都有一个条目。当 CPU 执行可修补指令时,它会检查此表。如果有条目,则使用 RAM 中的代码。如果它具有默认值,则跳转到 ROM。因此,要修补 CPU,必须将新代码上传到 RAM,然后适当修改匹配表中的条目。执行此操作的过程大致如下:

  1. 清除 EAX,使用 CPUID 读取当前处理器签名,并将匹配的微码更新加载到内核内存中。

  2. 清除 EAX 和 EBX,并使用 RDMSR 指令从修订匹配特定寄存器中读取当前微码修订。

  3. 使用WRMSR指令将微代码更新的内存地址写入更新匹配特定寄存器。

  4. 读取新的微码修订版本,如果与更新的版本匹配则返回成功,否则返回失败。

在基于 Linux 的操作系统中,此过程由名为“微代码”的特定内核模块在启动时完成。您可以阅读此模块的源代码以了解确切的过程。

请注意,补丁文件有一个文档化的标头,但补丁数据本身(实际代码)是由处理器中硬编码的密钥加密的。除非您知道此密钥,否则您将无法编写自己的补丁。

答案4

这个问题提得不太好。现代 x86/IA64 CPU 中有很多“微代码”,而“微代码补丁”和微代码之间存在差异。

微代码在其传统理解中(作为长 CPU 指令的执行的逐步元素)几乎肯定是刻在硅片上的,因为当新的硅片/RTL 在每个新的制造节点上进行编译时,没有理由在多代 CPU 中保留未修复的错误。

但是,所有最新的 CPU 都有几个内部单元,这些单元由嵌入在 x86 CPU 芯片内的独立微处理器控制。

最值得注意/众所周知的是所谓的“P-unit” 处理器控制 CPU 动态电源管理的微控制器。随着核心频率的提高和 CPU 晶体管进一步小型化导致的漏电增加,将功率保持在合理限度的唯一方法是通过积极的时钟节流和动态电源门控。问题是 CPU 可以执行无限多种软件代码,每种代码都会达到一定的功耗峰值。在 CPU 最终确定零售时,某些“电源病毒”模式可能尚不为人所知,并且必须纠正一些管理算法的参数。这是通过专用的“微代码补丁”完成的。

还有几个这种类型的微处理器控制其他 CPU 块喜欢图形和记忆。

修补过程的细节是绝密的,以防止恶意干扰。以下是一些黑客报告尝试对该机制进行逆向工程。

简而言之,现代CPU中没有加载x86架构的微代码,但各种辅助嵌入式微处理器的微代码可以有补丁。

相关内容