x86指令集和ARM指令集的区别
现代处理器的主要指令集架构(ISA)包括: x86 指令集架构、RISC指令集架构。其中,x86可以划分为x86-32(英特尔)、x86-64(英特尔)、AMD64(AMD)等三种。RISC可以划分为 ARM 、MIPS、Alpha、RISC-V。
现代处理器的指令集架构
现代处理器的主要指令集架构(ISA)包括:x86指令集架构、RISC指令集架构。其中,x86可以划分为x86-32(英特尔)、x86-64(英特尔)、AMD64(AMD)等三种。RISC可以划分为ARM、MIPS、Alpha、RISC-V。
“观其源可以知其流,而因其流亦可溯其源”。如果仅仅像教材一样泛泛而谈,则无法掌握处理器芯片的底层原理。下面,我们首先谈一下x86指令集的问题。
x86指令集
第一个方面,x86指令集为了保持二进制的兼容性,即:上一代芯片的应用程序仍然能运行在下一代芯片中,使之前后系列的芯片成为一个“系列机”,扩展了许多新的指令,导致x86指令集的规模不断膨胀。
第二个方面,x86指令集在设计时,采取了一种强指令的方式,即:一条指令可以完成非常强大的功能。例如,一条指令可以完成内存不同位置的整个运算过程,或将一块数据直接从内存的一个位置移动到另一个位置,而且这种强大的操作是在1个时钟周期内完成的。
在这里,我个人强调CISC指令集的定义,不应该仅仅是指令规模庞大,更重要的是,单条指令的效率较高,也应该是CISC的含义之一。许多教材只强调前者是不严谨的说法。
上图列出了英特尔官方统计的指令数量变化。在将近40年的发展历史中,x86由不足200条指令到今天超过1600条指令。
上图列出了x86指令集的MOV指令种类,其可以跳过一系列底层的微操作,实现一个较为复杂的指令功能。
基于以上的设计理念,x86指令集有以下的优点或缺点。注意,缺点也许是优点,优点也许是缺点,这是马克思辩证唯物主义的思想。
- 由于需要兼容以往的历史版本,x86的硬件设计复杂,这也成为了其历史包袱。但是,塞翁失马、焉知非福,二进制的兼容性获得了IBM的强力支持,让英特尔快速占领了PC和台式机市场。
- 一条指令的功能很强,这降低了对编译器的要求。另外,不需要考虑那么多的底层指令,早期的汇编程序员面对x86编程时也较为轻松。
- 多条高效率的指令并行,让单个核的性能强大。早期的处理器,单核架构足以满足应用需求。
- 必须要大量的冗余晶体管,以实现这种CISC复杂指令集设计。冗余的晶体管带来了大量的面积和功耗开销。
如今,x86指令集在笔记本、台式机、服务器等场景取得了近乎垄断的优势,和IBM有着紧密的联系。可以说,IBM的选择成就了x86指令集的今天,并成就了英特尔这家曾经名不见经传的小公司。
引文1:在20世纪80年代,IBM在计划研制第一台个人计算机(PC)时,考虑过德州仪器的TMS9900、Motorola 68000、英特尔8088。尽管,Motorola 68000被后世认为是最佳选项,但是,IBM出于已经熟悉了英特尔8085、处理器制造授权的考虑,选择了8088这一注定名垂青史的x86处理器。从此,计算机工业界笼罩在了x86指令集的乌云之下。
引文2:IBM PC上市后大受欢迎,销售额超出IBM预期「八倍」,一度每月出货高达4万台。1983年IBM卖出超过75万台个人电脑,刺激IBM进入这市场的DEC仅售出6万9千台。到1984年,IBM个人电脑营收为40亿美元,是同期苹果两倍多。拜开放规格之赐,距离IBM PC首次亮相还不到一年,1982年6月市场就出现其他品牌的相容(Clone)机种,从此开启个人电脑的大航海时代。
以上两段文字引自technews、半导体行业观察,其简要描述了IBM早期的选择及其巨大的市场成功。
ARM指令集
在上世纪80年代,计算机科学家们分析了大量的程序,发现80%的指令是很少用到的,处理器频繁地使用20%的那部分指令,比如Load指令、条件分支指令、Store指令、比较指令。如下图所示,该表格引自《计算机体系结构:量化研究方法(第六版)》。作者是David Patterson、John Hennessy。
因此,早期的RISC指令集、MIPS指令集应运而生,它们砍掉了大量不常用的冗余指令,只保留了最基本、最常用、功能最简单的指令集合。基于这种RISC指令集设计的处理器架构代表是ARM架构,为了便于不同客户进行定制化修改,其每代均会推出以下三个授权版本:
- Cortex-A内核,面向高性能应用。
- Cortex-R内核,面向实时系统。
- Cortex-M内核,面向嵌入式设备场景。
相比于x86指令集(CISC复杂指令集),ARM这种RISC精简指令集的变化主要是:
第一个方面,原来大量的冗余指令,以及由于历史原因兼容的指令,都在统计结果的基础上予以删除。
第二个方面,原来的一条x86强指令,在ARM中被多条基本的简单指令替代。
举一个例子:CISC提供的乘法指令,调用时可完成内存a和内存b中的两个数相乘,结果存入内存a,需要多个CPU周期才可以完成;而RISC不提供“一站式”的乘法指令,需调用四条单CPU周期指令完成两数相乘:内存a加载到寄存器,内存b加载到寄存器,两个寄存器中数相乘,寄存器结果存入内存a。
基于以上的设计理念,或者说,在这样的底层逻辑下,ARM指令集的处理器架构有如下优点或缺点:
- 砍掉了大量的x86冗余硬件设计,使得DEC译码器的设计更加简单,节省了大量的面积和功耗开销。
- 一条ARM指令的功能更加单一和基本,这种指令相比于x86的强指令可以称之为”弱指令“,执行这样的弱指令所需的功耗进一步降低。
- 由于原来一条x86强指令就可以搞定的事情,在ARM这里需要多条弱指令组合来做,大幅提高了编译器的设计难度,同时提高了汇编语言编程的难度。
- 由于ARM指令集的处理器,相比于x86指令集的处理器,其在硬件结构上更加简单,因此,单个ARM核的面积和功耗更小,但是其性能也更弱小。这就导致了我们堆叠多个弱小的ARM核来打一个强大的x86核。
显然,ARM是ISA指令集架构的后起之秀,其由于出色的低功耗处理器设计技术,在手机、嵌入式设备、平板电脑、移动设备等领域,取得了十分巨大的成功。
我们熟悉的苹果M系列芯片、高通骁龙系列芯片、华为麒麟系列芯片、三星Exynos系列芯片,均是在ARM架构的基础上针对移动端设计的。
后记
下一节,我们深入谈一谈x86指令集、ARM指令集更加细节的区别。
本文的作者是岳诗鹏。
岳诗鹏,湖北孝感人,清华大学硕士,处理器芯片设计专业,吉林大学本科,电子信息工程专业。现专注于算力芯片的架构和设计。