Historical Notes on CISC and RISC

来自osdev
跳到导航 跳到搜索

( 特别注意: 我最初是在2006年秋季参加的汇编语言课程中为其他一些学生写的,不久之后又发布到DevShed上的 帖子。 虽然这与OS-dev “per se” 无关,但它可能有助于为某些成员澄清汇编语言的一些令人费解的方面。 - User:schol-r-lea)

具有讽刺意味的是,今天的许多汇编语言讲师发现,在诸如MIPS或ARM之类的RISC体系结构中教授汇编编程比在无处不在但更为复杂的x86 PC系统中更容易: 从历史上看,通常与广泛的汇编语言编程相关的是CISC (复杂指令集计算机) 设计,而RISC (精简指令集计算机) 设计明确旨在使从高级语言编译代码变得更加容易,它们期望汇编语言除了在操作系统开发之外被很少使用。

要了解这种逆转的原因和如何进行的,你需要了解一些历史。 当基于冯·诺依曼架构的存储程序计算机首次在20世纪40年代末和20世纪50年代初开发时,硬件的大小和复杂性 (那时电子器件比今天更加多样化,使用了汞延迟线、阴极射线管磷光体存储器、磁鼓、电线和录音机等不同的技术,铁磁芯和大量的真空管) 意味着硬件容量极其有限; 即使是只有一个或两个寄存器和几千字的主存储器 (大小因机器而异) 的大型机器也并不少见。 指令集受到同样的约束,并且通常具有用于连接到外围设备的专用指令,从而占用了已经很小的指令空间。

例如,18位的林肯实验室计算机TX-0 (设计的第一个基于晶体管的系统之一) 总共有四个主要指令 (尽管其中一个是一种转义码,告诉它使用以下单词作为来自不同组的特殊用途操作的指令) 和两个寄存器,X和Y。 这些设计中有许多今天被认为是开发不良的指令集,充满了特殊情况,缺乏有用的指令 [[[Historical Notes on CISC and RISC#oisc|1]],并且包括几乎没有用的指令。

一般来说,这些早期设计只有一个特殊用途的寄存器,称为累加器,它可以在其上执行大多数常见的操作,例如加法或减法; 另一个操作数 (如果有的话) 通常在主存储器中,或者在另一个称为源的特殊用途寄存器中,结果将保留在累加器中 (因此得名“累加”)。

随着设计人员开始根据早期努力的成功和失败开发更有效的架构原则,硬件变得更小,更便宜,这反过来又允许更大的在CPU设计上的自由度,因此系统的复杂性增加; 1966年,PDP-6是当时的典型设计,具有16个36位通用寄存器,以及一个堆栈寄存器和帧寄存器。 指令集也变得更加复杂; 由于即使到20世纪70年代中的编程也有很大一部分是用汇编语言完成的,因此认为指令集应该是 “丰富的”,也就是说,它们应该为程序员想要使用的几乎每个常见操作都有特殊的指令。

最终以32位VAX-11系列的小型计算机和大型机达到高潮,该系列具有256个主要指令,包括用于多项式评估,三角函数和CRC计算的指令。 这些指令中的许多指令具有多个寻址模式,因此它们可以在寄存器,主存储器或其某种组合上进行操作; 尽管这增加了汇编编程的便利性,但这也意味着程序员必须注意几种特殊情况,并且使CPU设计大大复杂化。

为了提供这些指令,设计人员开始使用 “微代码”,这是一组可以称为固件编码的宏指令,微代码将由CPU本身处理。 复杂的指令会在内部分解成更简单的指令,程序员不需要意识到这些指令,并把它们像是硬件的固定部分一样执行使用。 这样的指令通常需要几个系统时钟周期才能运行,并且在大多数处理器中,没有现代意义上的流水线-系统必须等到每条指令完成后才能开始处理下一条指令。

大约在设计VAX的时候,正在发生另外四件事,改变了这种状态。 首先,高级语言正在成为编程的主要方法,这意味着当时的cpu的“巴洛克风格(极为繁复)”指令集变得不必要了。

其次,汇编语言程序员注意到,在大多数程序中,无论是汇编还是编译语言,都只使用了少数指令: 很少有程序需要CRC指令,几乎没有任何程序员对整个VAX指令集足够熟悉,无法知道该指令的存在以及如何使用它。 这样做的一个侧面是,更复杂的指令集越来越难以学习和教学。

第三,计算机硬件设计已经发展到提供CPU设计研究生课程的地步; 这些课程自然地坚持非常简单和常规的设计,他们发现这些设计实际上优于同等的复杂系统 (尽管专业构造的CPU经常使用专利或商业秘密的技术,将学生设计与商业设计进行比较时,会歪曲结果)。 他们特别指出,直接在内存上工作的操作通常比将值加载到寄存器中,对这些寄存器执行多个操作,然后将结果存储回内存中的操作要慢。

最后,单芯片微处理器的出现意味着,很快就有可能以微型计算机和大型机的一小部分成本而大规模生产廉价计算机。 早期,这些受到硬件功能的限制,其方式与第一代cpu的方式几乎相同 (并且第一代的一些设计错误也被重复),但是该技术很快超出了任何人的期望,并且在某些方面,超越了设计师预测他们以后需要支持的能力。

最后这部分原因对一些设计决策产生了一些重大影响,特别是随着微处理器变得更加强大。 其中最主要的是英特尔决定尝试将8位 8080 设计扩展到新的16位设计,即 8086; 他们向后兼容以使旧芯片的程序员对CPU尽可能熟悉,结果,该设计最终带来了一些不必要的复杂性和局限性,尤其是在它如何解决更大的内存方面2 另外,由于设计人员仅给系统提供了少量的寄存器,因此大多数操作都具有几种复杂的寻址模式,以避免寄存器耗尽。

该处理器被选为IBM PC,并很快成为主导平台,这意味着这些弱点对于数百万用户至关重要。 当他们使用 80286 进一步扩展设计时,这进一步加剧了,该设计现在需要一个单独的 “受保护模式” 来访问其全部功能,同时保留 “正常模式” 以实现向后兼容性。 在下一个设计中,80386 解决了一些设计缺陷,但代价是芯片本身和组装编程的复杂性都呈指数级增长。

同时,其他芯片设计人员正在朝其他方向发展。 摩托罗拉 (Motorola) 首先采用了经典的 “大” 设计,即 Motorola 68000,它在许多方面类似于VAX的缩小版本,具有16个通用寄存器和复杂的指令集。 这将成为几个成功的工作站以及原始的 苹果MacintoshAtari STCommodore Amiga 家用计算机产品线的CPU。 后来的设计扩展会使这一点复杂化,但仍还没有达到80x86设计的复杂程度。

尽管如此,越来越明显的是,复杂的指令集正在适得其反。 因此,许多芯片设计人员决定走相反的方向: 最小指令集,没有微编码,加载/存储架构,几乎没有直接在内存上工作的操作,大型寄存器集,可以用来避免访问主内存,只要有可能,并强调支持使用高级语言而不是汇编编程。 这个新想法被称为RISC (精简指令集计算机),并成为了几个新的中央处理器设计的基础,包括 MIPS (它是 DLX的继任者) 、 [https://en.wikipedia.org/wiki/SPARC太阳SPARCARM_architecture Acorn ARM,IBM POWER 架构 3DEC Alpha。 其中,除Alpha以外的所有其他产品如今仍在某些专业使用领域使用,尤其是ARM已成为移动计算的 “事实” 标准,尽管在大多数情况下,Windows-x86系统的统治迫使他们退出了家庭和商业系统市场。

脚注

单指令集计算机 One Instruction Set Computers

原则上,只有单个操作,'减去两个内存值,如果结果为负,则分支' (或在此上的几个变体) 就足以允许随机访问机器执行所有图灵可计算的计算)。 甚至有基于此原理设计的 (模拟) 机器。 (此类机器通常以或令人困惑的指令被命名为OISC。) 当然,实际上,这样的设计是浪费的,尤其是对于整数算术等更常用的运算。 至少这并没有阻止这种体系结构出现一个操作系统,并带有自己的C编译器: Dawn

分段

具体问题是使用 “内存分割”,其目的是提供20位地址空间,而对于大多数目的仍然仅使用16位寻址。 它通过具有一组单独的段寄存器来工作,该寄存器指向以16字节的间隔彼此重叠的64k区域。 地址是通过取段地址和16位偏移量 (相当于8080的地址) 形成的,将两个值加上4位位移得到20位地址。 大多数指令可以使用段寄存器之一作为代码或数据的默认值,并且仅使用指令流中的偏移量。 将特定的重叠设置为4位,因为当时确定使用20多个地址引脚的成本过高,并且会使双列内联封装设计过大。 假设1 MiB地址空间足以用于CPU,该CPU是设计寿命有限的微控制器,而不是40年后使用的通用系统。 即使在当前的x86型号中,该细分系统仍保持为 “实模式”。 (即使在32位模式下也存在分段,尽管分段寄存器保持16位。 偶尔会发现巧妙的用途。)

PowerPC

PowerPC是一种经过修改的POWER架构,用于Macintoshes 1994年2006年以及1992年1996年的某些IBM OS/2系统。 POWER体系结构本身主要用于较大的多处理器系统,例如 Deep BlueWatson