try ai
科普
编辑
分享
反馈
  • 控制存储器

控制存储器

SciencePedia玻尔百科
核心要点
  • 控制存储器保存着微程序,微程序是由一系列微指令组成的序列,定义了复杂机器指令如何由数据通路执行。
  • 微程序控制通过固件提供了极大的灵活性,可用于修复错误或添加功能,这与硬布线控制注重速度、结构固化的特性形成鲜明对比。
  • 在微程序控制(常见于 CISC)和硬布线控制(常见于 RISC)之间的选择,是体系结构在灵活性、成本和速度之间的基本权衡。
  • 可写控制存储器(WCS)为产品发布后的更新提供了极大的灵活性,但也引入了深远的安全风险,需要硬件层面的缓解措施。

引言

中央处理器(CPU)是现代计算的引擎,但谁是它的指挥家呢?控制单元负责协调每一个动作,将程序指令翻译成精确的电信号,以指导处理器中的各个组件。计算机体系结构中的一个根本挑战便是如何设计这个控制单元。虽然一些设计为了追求最高速度而使用刚性的、定制的逻辑电路,但另一种更灵活的方法将控制本身视为硬件内部的一个软件问题。本文深入探讨后一种方法,其核心是一个被称为“控制存储器”的关键组件。首先,在“原理与机制”部分,我们将剖析控制存储器的工作原理,即如何将复杂的指令转化为一系列简单的微操作。随后,“应用与跨学科联系”部分将探讨这一设计选择所带来的深远影响,从 CISC 与 RISC 之争到极端环境下的系统安全性和可靠性,无所不包。

原理与机制

想象一下,你是一个庞大交响乐团的指挥家。你的乐手们是中央处理器(CPU)的不同部分——算术单元、寄存器、存储通路。你的乐谱则是一份计算机程序。作为指挥家,你如何向每一位乐手精确地发出信号,让他们在恰当的时刻,将乐谱上的音符转化为一首交响曲?这正是 CPU 的​​控制单元​​所面临的根本挑战。它是大脑中的大脑,是指导整场演出的指挥家。

构建这样的指挥家有两大策略。一种是打造一个精巧绝伦的自动机,一个发条奇迹,其中的每一个齿轮和杠杆都经过完美调校,以固定不变的序列产生所需的信号。这就是​​硬布线控制单元​​。另一种则是给指挥家一份脚本,一份详细的指令集,告诉他如何带领乐团演奏任何一首乐曲。这就是​​微程序控制单元​​。虽然硬布线方法拥有纯粹速度的优势,但微程序方法揭示了一个更深邃、更优雅的原则:一个计算机内部的计算机。

指挥家的两难选择:通往控制的两条路径

硬布线控制单元就像一座由逻辑门精雕细琢而成的雕塑。对于一个给定的输入——来自程序的指令——它会产生一组特定的控制信号,这是其线路连接的直接物理结果。“控制字”(control word),即单个时钟周期内所有控制信号的完整集合,是​​组合逻辑电路根据当前输入动态生成的瞬时输出模式​​。这种方法速度极快。信号以电速穿过逻辑门。这使其成为​​精简指令集计算机(RISC)​​体系结构的完美选择,该架构的理念是崇尚速度和简洁,旨在以闪电般的单时钟周期执行一小组简单指令。

但是,如果你的乐团需要演奏极其复杂的音乐,一个音符就需要繁复的多步序列来演绎,那该怎么办?为此雕刻一个发条自动机将是一项噩梦般的任务。逻辑的复杂性会爆炸式增长,使其难以设计、无法调试,且一旦建成便无法更改。

这正是微程序方法的闪光之处。我们不构建一个固定的自动机,而是构建一个更简单、更通用的引擎,其工作就是读取脚本。这个脚本就是​​微程序​​,它存储在控制单元旁边一个特殊的高速存储器中,称为​​控制存储器​​(control store)或​​控制内存​​(control memory)。在这种模式下,控制字不再是瞬时的电学模式,而是​​作为一条微指令静态存储在控制存储器特定地址处的数据字​​。指挥家不再是一个机械木偶,而是一个阅读者,按部就班地执行 CPU 操作的详细剧本。

编舞家的脚本:深入控制存储器

让我们来一窥这份剧本的内部。控制存储器的组织结构很像一本书。控制存储器的“深度”,也就是我们书中页面的数量,取决于处理器指令集体系结构(ISA)中​​机器级指令的数量和复杂性​​。一个​​复杂指令集计算机(CISC)​​,凭借其庞大的强大指令库,需要一本比简单 RISC 处理器厚得多的“书”。

这本书的每一页都包含一条​​微指令​​,即脚本的一行。控制存储器的“宽度”就是这一行的长度——即一条微指令中的位数。一条微指令通常由两个主要部分组成:

  1. ​​控制字段​​:这些比特是给乐团的实际命令。一组比特可能告诉算术逻辑单元(ALU)是做加法还是减法;另一组则告诉某个特定寄存器将其数据释放到内部总线上。在纯粹的​​水平微代码​​格式中,数据通路中的每一个控制信号都对应一个比特,提供了最大的并行性,但也导致了非常宽的微指令。

  2. ​​定序字段​​:这部分告诉指挥家接下来要读哪一行脚本。它就是“翻到第 X 页”的指令。这涉及一个名为​​控制地址寄存器(CAR)​​的特殊寄存器,它保存着当前微指令的地址,或称页码。定序字段可能指示 CAR 简单地递增(转到下一行),也可能指定一个分支条件(例如,“如果上一个操作的结果为零,则跳转到第 Y 页”)和一个目标分支地址。CAR 的大小决定了控制存储器的最大深度;例如,一个 8 位的 CAR 可以寻址 28=2562^8 = 25628=256 条不同的微指令。

那么,像 ADD R1, R2 这样的程序指令是如何被翻译成一场微型演出的呢?指令的​​操作码​​(opcode)(即表示 ADD 的部分)并不直接送往控制存储器。相反,它被用作一个地址,送入一个更小、更快的存储器,称为​​映射逻辑​​。可以把它想象成书的目录。映射逻辑获取 ADD 的操作码,并在主控制存储器中查找加法微例程开始的“页码”。这个起始地址被加载到 CAR 中,演出便开始了。控制单元取出第一条微指令,发出控制信号,然后利用定序字段找到下一条微指令,依此类推,直到整个 ADD 操作完成。这个控制存储器的总大小就是其宽度(每条微指令的位数)乘以其深度(微指令的数量)。

微体系结构师的艺术:灵活性、性能与权衡

微编程之美不仅在于其机制,更在于其提供的深远灵活性。对于 CISC 设计师而言,它将一个棘手的硬件问题转化为了一个结构化的软件问题。他们不再需要设计一片庞杂的逻辑门海洋,而是可以为每条复杂指令独立地编写、调试和验证一个微例程。这种系统化的、类软件的方法极大地减少了设计时间和工作量。

这种灵活性并不仅限于设计阶段。如果在 CPU 发货前在控制逻辑中发现了一个错误怎么办?在硬布线设计中,这是一场灾难,很可能需要重新设计芯片,成本高昂。而在微程序设计中,如果控制存储器是用可写存储器实现的,修复这个错误可能就像编辑有问题的微例程一样简单——这是对 CPU 核心的一次“固件更新”。

这引出了一个关键的实现选择:控制存储器应该是永久性的​​只读存储器(ROM)​​还是可写的​​随机存取存储器(RAM)​​?

  • ​​基于 ROM​​ 的控制存储器简单且非易失。微程序被永久蚀刻,一旦通电即可使用。它坚固耐用,适合大规模生产,成本低廉。
  • ​​基于 RAM​​ 的控制存储器是实现终极灵活性的关键。由于它是易失性的,它在启动时需要一个额外的步骤:微程序必须从一个永久源(如闪存芯片)加载到控制 RAM 中。但回报是巨大的。不仅可以在产品发布后修复错误,公司甚至可以在 CPU ​​制造和销售后为其添加新指令​​,只需发布一个固件补丁,将新的微例程加载到控制存储器中即可。这就是一个真正可演进处理器的概念。

微体系结构师的艺术还包括在微程序的规模和其速度之间取得平衡。一个非常宽的水平微指令让架构师能够在单个周期内对所有事物进行细粒度的并行控制。但如果控制存储器变得太大了怎么办?架构师可以采用编码策略来缩减宽度,向​​垂直微代码​​格式发展。通过识别那些互斥的控制信号集(例如,ALU 一次只能执行一种操作),这些信号可以被编码。例如,可以用一个 3 位的字段(23=82^3 = 823=8)和一个小型解码器来代替 8 个用于 8 种不同 ALU 操作的比特。这通过将信号分组到仍然可以并行发出的​​正交字段​​中来减少微指令的宽度。为了实现更激进的压缩,一些设计采用了称为​​纳程序设计​​(nanoprogramming)的两级方案。主控制存储器存放非常窄的“纳指令”,这些指令本质上是指向第二个、更宽但非常浅的“纳存储器”(通常是快速的 PLA)的指针,这个纳存储器保存着全宽度的控制字。这就像有一本速记本,其内容指向一本包含完整命令的主词典。

一把双刃剑:可写世界中的威力与危险

重写 CPU 基本操作的能力,正如你可能想象的那样,是一把双刃剑。虽然它能够修复错误和更新功能,但​​可写控制存储器(WCS)​​也带来了深远的安全风险。如果恶意软件能够访问 WCS,它就可以安装自己的微代码。这样的微木马可以创建绕过所有体系结构安全特性的指令——禁用内存保护、非法获取管理员权限,或以操作系统和所有其他软件完全无法察觉的方式窃取数据。这将是对机器信任根基的攻击。

这使得现代架构师像对待任何其他特权系统资源一样,严肃地对待微代码。为了减轻这种风险,复杂的 CPU 将安全性直接集成到微指令格式本身。可以在每一条微指令中添加一个​​访问控制字段​​,指定其允许执行的条件。该字段可能包含一个​​特权级别代码​​,确保高度敏感的微指令(例如,修改内存保护的指令)只能在 CPU 已经处于最高特权状态时执行。它也可能包含一个​​能力掩码​​,这是一组标志,用于授予特定操作的权限,如访问 I/O 端口或修改控制存储器本身。

因此,我们对控制存储器的探索回到了原点。我们从一个简单的协调问题开始,发现了一个精美的分层解决方案,它体现了计算的核心原则——抽象、解释以及性能与灵活性之间的权衡。我们看到这个架构选择如何影响从设计哲学(RISC vs. CISC)到产品生命周期(现场更新),并最终影响到数字世界的基本安全和可信度。指挥家的脚本不仅仅是一种机制;它更是机器的根本宪法。

应用与跨学科联系

在前面的讨论中,我们剖析了机器以理解其心脏:控制单元,特别是控制存储器这一优雅的设计。我们视其为一种字典或食谱,其中处理器理解的每条指令都由一系列更原始的步骤或微指令来定义。现在,在理解了“是什么”之后,我们进入一个更激动人心的领域:“所以呢?”这个概念让我们能做什么?它如何塑造计算世界,又如何与那些乍看之下相去甚远的学科联系起来?这正是该思想真正美妙之处的展开——它不是一个孤立的组件,而是一条贯穿工程、经济甚至物理学织物的连接线。

数字编舞的艺术

在其最基本的层面上,控制存储器就是一位编舞家。它接受一个高层命令,比如“将内存中的数字加到这个寄存器上”,并将其翻译成一个为数据通路的表演者们——寄存器、ALU、存储器接口——量身定制的、精确定时的步骤序列。每一步都是一条微指令,是控制存储器中的一行,而这一行不过是一串 1 和 0 的模式。这个模式中的每一位都连接到一根线,一根“傀儡线”,用于激活或停用处理器的特定部分。

想象一条指令,它需要从指令本身指定的内存位置获取一个值,将其与一个寄存器相加,然后将结果存回。这个操作不可能一次完成,它是一出三幕的芭蕾舞剧。在第一个时钟周期,控制存储器发出一串控制位,命令将内存地址加载到内存地址寄存器并启动读取操作。在下一个周期,另一组不同的比特模式将新到达的数据放入一个临时存储位置。在最后一个周期,第三组模式命令 ALU 执行加法,并将结果导向其最终的目标寄存器。控制存储器只是保存了这个由 3 行 1 和 0 组成的表格,一个为动态表演准备的静态脚本。

这个概念可以完美地扩展。一个简单处理器的整个操作——取下一条指令、解码它,然后跳转到正确的微例程——可以被描述为一个更宏大的状态机。控制存储器成为这个机器的物理体现,其中每个状态和转换都只是这个特殊存储器中的一个地址。处理器的当前状态,结合指令的操作码,直接指向控制存储器中的一个位置,该位置不仅提供了当前周期的控制信号,还提供了要执行的下一条微指令的地址。逻辑被转化为了数据。

大辩论:灵活性、速度与经济学

为什么不直接用逻辑门构建控制逻辑——即所谓的“硬布线”设计?这个问题将我们带到了整个计算机体系结构中最深刻、影响最重大的权衡之一。硬布线控制器速度很快;信号以电速通过逻辑门传播。而微程序控制器本质上较慢,因为它涉及一个额外的步骤:从控制存储器中获取微指令。那么,为什么会有人选择更慢的路径呢?

答案,正如工程领域中常见的那样,是“视情况而定”。控制存储器的关键优势在于其灵活性。它是存储器。而存储器是可以改变的。

这种张力在处理器设计的巨大分歧——CISC vs. RISC——中扮演了关键角色。在早期,当晶体管是芯片上宝贵的“不动产”时,复杂指令集计算机(CISC)占据主导地位。它们的目标是使硬件功能强大,用单条指令执行多步操作。用固定的逻辑电路来实现这种惊人的复杂性是一项艰巨的任务——设计困难、调试噩梦、经济上不可行。微编程是那个优雅的解决方案。它允许设计者系统地管理复杂性。逻辑中的一个错误通常可以通过修补 ROM 来修复,而无需重新制造整个芯片。这是实用主义者的选择。

然后,摩尔定律开始改变经济学的算盘。随着晶体管变得异常廉价和充足,一种新的哲学出现了:精简指令集计算机(RISC)。RISC 的支持者主张采用一套小而简单的指令集,这些指令可以极快地执行,理想情况下每个时钟周期执行一条。由于晶体管数量充裕,现在在同一芯片上构建一个速度飞快的硬布线控制器已成为可能。固定逻辑的速度被置于微代码的灵活性之上,这在当时是一种经济上可行的权衡。

然而,这场辩论并不仅仅是历史的注脚。在当今的领域特定体系结构(DSA)世界中,它仍在激烈进行。考虑一个为加速正则表达式(regex)匹配而设计的芯片。人们可以为一组特定的 regex 规则构建一个硬布线的 FSM,速度会非常快。但当规则需要更新时会发生什么?你将不得不重新配置硬件本身,这是一个缓慢的过程。或者,人们可以设计一个由微码控制器驱动的更通用的数据通路。在这里,更新规则就像将新的微程序加载到控制存储器中一样简单快捷。微码设计可能每个字符多花几个周期,但其在微秒内更新的能力,相对于硬布线设计的数秒钟,可能是一个无价的优势。

超越 CPU:向上扩展与保障安全

控制存储器的思想威力远不止于简单的处理器。它为扩展到更复杂的机器以及构建能够抵御物理世界严酷考验的系统提供了天然的途径。

当我们想同时执行多条指令时,就像在现代超标量处理器中那样,会发生什么?一个非常直接的方法是加宽控制存储器。如果你有两个执行流水线,一个用于算术,一个用于内存操作,你可以通过简单地将第一个流水线的微指令和第二个流水线的微指令拼接在一起来创建一个“宽”微指令。现在,控制存储器中的一个字就可以协调两个并行的操作。当然,这是有代价的:控制存储器的尺寸可能会爆炸式增长,因为你可能需要为每一种可能同时发出的指令对准备独特的拼接微程序,但这显示了控制存储器以数据为中心的方法如何能够优雅地扩展到并行执行。

控制存储器类似存储器的特性,在另一个完全不同的领域也提供了深远的优势:可靠性。想象一颗在轨卫星,不断受到高能宇宙射线的轰击。这些粒子可以击中芯片并随机翻转一个比特——即单粒子翻转(SEU)。如果那个比特位于硬布线控制器的状态寄存器中,整个机器会瞬间陷入混乱。但如果控制逻辑位于一个存储器中(我们的控制存储器),我们就可以借鉴数据存储领域的一个技巧:纠错码(ECC)。我们可以在每条微指令旁存储额外的奇偶校验位,允许硬件在读取时自动检测甚至纠正比特翻转。一个硬布线逻辑块只是一张复杂的门网络;要保护它免受 SEU 的影响极其困难。而一个控制存储器,因为它结构规整,类似存储器,所以可以被做得更有弹性。对于卫星设计师来说,选择微程序控制器可能不是为了灵活性,而是为了生存。

让我们更仔细地看看这个生存故事。假设一个控制存储器有一个简单的奇偶校验位来检测错误。一束宇宙射线翻转了一条“存储”操作微指令中的一个比特——特别是那个关键的、表示“写入内存”的比特。如果没有错误检查,处理器会静默地执行失败,无法写入数据,从而破坏程序的状态。但有了奇偶校验,硬件在读取损坏的微指令时会立即发现‘1’的数量是错误的。在错误的信号造成任何损害之前,系统会引发一个故障。操作被停止,控制权转移到一个可以诊断问题或重启系统的处理程序。处理器会发生故障,但它会响亮而安全地失败,防止了静默的数据损坏。这个简单的“关于数据的数据”位提供了一道抵御宇宙物理法则的防火墙。

体系结构的统一性:无处不在的控制存储器

控制存储器并非孤岛;它与整个系统架构深度互联,影响着从性能到启动过程的一切。

考虑存储器的物理分离。经典的“哈佛结构”为指令和数据使用独立的存储器,而“冯·诺依曼结构”则使用单一的统一存储器。这在微码世界中有直接的对应物。一个微例程可能需要同时获取其下一条微指令并从一个数据表中读取一个常量。在类似哈佛结构的设计中,控制存储器和数据表有独立的存储器,这些访问可以并行进行,仅受两者中较慢者的限制。而在统一设计中,它们必须顺序进行,共享一条总线,并产生仲裁和周转延迟。在微体系结构层面上的存储器组织选择,对处理器的基本时钟周期时间有着直接、可量化的影响。

也许最令人惊讶的应用之一是将控制存储器不仅仅看作 CPU 指令的解码器。毕竟,它是处理器最核心处的一种非易失性存储器。你可以在那里放些什么呢?引导加载程序(bootloader)如何?计算机开机时运行的第一段代码可以直接嵌入到控制存储器本身。这为整个启动过程提供了一个安全且不可变的基础。突然之间,控制存储器不仅仅是在实现 ISA,它成了机器可信固件的一部分,是系统最关键初始代码的秘密藏身之处。这也变成了一个有趣的打包问题:给定总 ROM 大小,并知道每个字 ECC 位的开销,在为引导加载程序预留空间后,你还能负担得起对多少条 CPU 指令进行微编码?

即使是微指令本身的“语言”——比特的排列方式——也是一个丰富的设计空间。在高性能流水线中,你可能需要控制复杂的转发逻辑来解决数据冒险。你可以在你的微指令字中设置显式的比特来控制每一个多路复用器。或者,你可以发明一种压缩编码:用几个比特指定一个通用“策略”(例如,“优先从最近的阶段转发”),然后由局部逻辑进行解码。压缩编码节省了控制存储器中宝贵的空间,但给关键路径增加了解码延迟。这表明,设计不仅仅是关于做什么,更是关于找到最有效的方式去表达它。

从作为简单指令编舞者的角色,到在摩尔定律经济史中的地位,从确保太空中的可靠性,到为系统启动代码提供安全家园,控制存储器展现了其真正的面貌。它不仅仅是一个组件。它是一个统一的概念,是抽象力量的美丽例证,也是计算中逻辑与数据是同一枚华丽硬币两面的永恒思想的证明。