:::info 图灵原型机的基本思想是:任何复杂的运算都可以分解为有限个基本指令的组合来完成。我们的CPU在设计的时候就是这么干的,只支持有限个基本的运算指令,如加、减、乘 、与、或、非、移位、跳转等。这些指令通过不同的组合,可以构成不同的指令序列(程序),实现不同的逻辑功能。 ::: 不同架构的处理器支持的指令类型是不同的。ARM架构的处理器只支持ARM指令,X86架构的处理器只支持X86指令。如果你在ARM架构的处理器上运行X86指令,就无法运行,报未定义指令的错误,因为ARM架构的处理器只支持ARM指令集中定义的指令。CPU支持的有限个指令的集合,我们称之为指令集。

什么是指令集

指令集架构(Instruction Set Architecture,ISA)是计算机体系架构的一部分。指令集是一个很虚的东西,是一个标准规范。红灯停、绿灯行、黄灯亮了等一等,只有行人和司机都去遵守这套交通规则,我们的交通系统才能有条不紊地运行下去。指令集也一样,芯片工程师在设计CPU时,也要以指令集中规定的指令格式为标准,实现不同的译码电路来支持指令集各种指令的运行。指令集可以说是 CPU 设计的灵魂,是打开 CPU 这个潘多拉魔盒的咒语,要想使用 CPU,我们只能通过这些指令来操作 CPU。
对于 32 位的 CPU,这些指令就是一个个 32 位的 0 1 的序列,不同的值就代表了不同的机器指令,CPU 的硬件能完美的解析并执行这些指令,比如寻址、运算、异常处理等等。当我们用手机玩着王者荣耀的时候,要知道我们的每发的一招,其实最终都是被翻译成了一系列机器指令。

计算机的指令集一般可分为4种:复杂指令集(CISC)精简指令集(RISC)显式并行指令集(EPIC)超长指令字指令集(VLIW)。我们在嵌入式学习和工作中需要经常打交道的是RISC指令集。RISC指令集相对于CISC指令集,主要有以下特点:

  • Load/Store架构,CPU不能直接处理内存中的数据,要先将内存中的数据Load(加载)到寄存器中才能操作,然后将处理结果Store(存储)到内存中。
  • 固定的指令长度、单周期指令。
  • 倾向于使用更多的寄存器来存储数据,而不是使用内存中的堆栈,效率更高。

复杂指令集和精简指令集

Intel和ARM处理器的第一个区别是,前者使用复杂指令集(CISC),而后者使用精简指令集(RISC)。属于这两种类中的各种架构之间最大的区别,在于它们的设计者考虑问题方式的不同。 比如说我们要命令一个人吃饭,那么我们应该怎么命令呢?我们可以直接对他下达“吃饭”的命令,也可以命令他“先拿勺子,然后舀起一勺饭,然后张嘴,然后送到嘴里,最后咽下去”。从这里可以看到,对于命令别人做事这样一件事情,不同的人有不同的理解,有人认为,如果我首先给接受命令的人以足够的训练,让他掌握各种复杂技能(即在硬件中实现对应的复杂功能),那么以后就可以用非常简单的命令让他去做很复杂的事情——比如只要说一句“吃饭”,他就会吃饭。但是也有人认为这样会让事情变的太复杂,毕竟接受命令的人要做的事情很复杂,如果你这时候想让他吃菜怎么办?难道继续训练他吃菜的方法?我们为什么不可以把事情分为许多非常基本的步骤,这样只需要接受命令的人懂得很少的基本技能,就可以完成同样的工作,无非是下达命令的人稍微累一点——比如现在我要他吃菜,只需要把刚刚吃饭命令里的“舀起一勺饭”改成“舀起一勺菜”,问题就解决了,多么简单。这就是“复杂指令集”和“精简指令集”的逻辑区别。

编译器厂商在研发编译器工具或IDE时,也要以指令集为标准,将我们编写的C语言高级程序转换为指令集中规定的各种机器指令。为什么我们编写的高级程序经过编译后,可以直接在CPU上运行呢?就是因为CPU设计者和编译器开发者遵循的是同一个指令集标准,编译器最终编译生成的指令,都是CPU硬件电路支持运行的指令。每一种不同架构的CPU一般都需要配套一个对应的编译器。
指令集作为CPU和编译器的设计规范和参考标准,主要用来定义指令的格式、操作数的类型、寄存器的分配、地址的格式等,指令集主要由以下内容组成

指令集的价值在于大家都遵守同一个标准去开发计算机系统的不同硬件和软件,这非常有利于整个计算机系统生态的构建:IC工程师在设计CPU处理器时,遵守指令集标准,设计出硬件电路,支持标准规定的各种指令的运行;编译器开发者在开发编译器时,也会遵守指令集标准,将程序员编写的高级语言翻译成CPU支持运行的指令。从CPU到编译器,从编译器到应用程序,一个完整的计算机系统生态就建立起来了。

什么是微架构

微架构,对应的英文是Microarchitecture,也就是处理器架构。集成电路工程师在设计处理器时,会按照指令集规定的指令,设计具体的译码和运算电路来支持这些指令的运行;指令集在CPU处理器内部的具体硬件电路的实现,我们就称为微架构。一套相同的指令集,可以由不同形式的电路实现,可以有不同的微架构。
根据不同的配置选项,我们可以基于一套指令集设计出不同的微架构。以ARM V7指令集为例,基于该套指令集,面向高性能、低功耗等不同的市场定位,ARM公司设计出了Cortex-A7、Cortex-A8、Cortex-A9、Cortex-A15、Cortex-A17等不同的微架构。基于一款相同的微架构,通过不同的配置,也可以设计出不同的处理器类型。不同的SoC厂商,获得ARM公司的Cortex-A9微架构授权后,基于该内核集成不同的IP,就可以搭建出不同的SoC芯片,并最终流向市场。如三星公司的Exynos 4412处理器、瑞芯微公司的RK3188处理器都采用了Cortex-A9内核。
在X86处理器领域,目前能获得X86指令集授权,并基于该指令集设计微架构和处理器的厂商有三家:Intel、AMD和上海的兆芯。
image.png

X86指令集因为专利垄断和授权限制,除了Intel、AMD、兆芯(VIA合并后的公司)这三家公司,其他公司一般无法获得授权去设计和生产自己的X86处理器。而ARM则不同,通过开放ARM指令集授权,其他公司可以基于授权的指令集去设计自己的微架构和SoC芯片,或者基于ARM官方的微架构直接去设计自己的SoC处理器。

片上系统

在嵌入式处理器中,微架构不等于SoC。微架构一般也称为CPU内核。在一个ARM SoC芯片上,我们把CPU内核和各种外设IP通过AMBA总线连接起来,构成一个片上系统,即System On Chip,简称SoC,中文的的意思就是 “把系统都做在一个芯片上”。
SoC 上集成了很多手机上最关键的部件,比如 CPU、GPU、内存、也就说虽然它在主板上的存在是一个芯片,但是它里边可是由很多部件封装组成的。比如通常我们所说的高通 865,麒麟 9000,三星的 exynos 4412,A14 等等都只是系统部件打包封装(SoC)后的总称。然而各家的打包封装的内容则不尽相同。
经典的 ARM 系统级芯片或所谓的 Soc 包含许多组件,其中只有一些直接源自 ARM。首先,核心本身通常深度嵌入在设备内部,在设备范畴内通常不直接可见,而调试端口通常是唯一和核心本身相连的外露部分,有一些粘合逻辑,如时钟和复位集成电路。
由于 ARM 核心只有两个中断输入,最常见的外设就是某种中断控制器,在外设内部,各组件通过芯片上互联总线架构相互连接,对于极大多数基于 ARM 的设备而言,这就是标准的 AMBA 互联。
AMBA 指定了两个总线,称为 AXI 的高性能系统总线,和称为 APB 的低功耗外设总线,APB 通常用于连接所有外设,AXI 则用于存储器和其他发高速设备,大多数设备都有一定数量的芯片上存储以及连接外设存储器设备的接口,但是注意,与设备的外部连接并不是 AMBA 总线,这仅在设备内部使用,并不外露。

指令集与微架构 - 图2

ARM

ARM (Advanced RISC Machines) 有3种含义:它是一个公司的名称,是一类微处理器的通称;还是一种技术的名称。
目前,采用ARM技术知识产权(IP) 核的微处理器,即我们通常所说的ARM 微处理器,已遍及工业控制、消费类电子产品、通信系统、网络系统、无线系统等各类产品市场。基于ARM技术的微处理器的应用约占据了32 位RISC 微处理器80%以上的市场份额,其中,在手机市场,ARM占有绝对的垄断地位。可以说,ARM技术正在逐步渗入到人们生活中的各个方面,而且随着32位CPU价格的不断下降和开发环境的不断成熟,ARM技术会应用得越来越广泛。
ARM公司是专门从事基于RISC 技术芯片设计开发的公司。作为嵌入式RISC 处理器的知识产权(IP)供应商,公司本身并不直接从事芯片生产,而是靠转让设计许可由合作公司生产各具特色的芯片,世界各大半导体生产商从ARM公司购买其设计的ARM微处理器核,根据各自不同的应用领域,加入适当的外围电路,形成自己的ARM微处理器芯片进入市场。利用这种合伙关系,ARM很快成为许多全球性RISC 标准的缔造者。目前,全世界有几十家大的半导体公司都使用ARM公司的授权,其中包括Intel、IBM、 SAMSUNG、 LG半导体、NEC、SONY、 PHILIPS 等公司,这也使得ARM技术获得更多的第三方工具、制造、软件的支持,使整个系统成本再次降低,产品更容易进入市场并被消费者所接受,更具有竞争力。

ARM公司

ARM指令集架构

从 1985 年 ARMv1 架构诞生起,到 2011 年,ARM 架构已经发展到了第八代 ARMv8。Cortex-A32/35/53/57/72/73/77/78 采用的都是 ARMv8 架构,这是 ARM 公司的首款支持 64 位指令集的处理器架构。指令集与微架构 - 图3

ARM11 之前的处理器和指令集架构

ARM11 芯片之前,每一个芯片对应的架构关系如下:指令集与微架构 - 图4

ARM11 之后处理器和指令集架构

ARM11 芯片之后,也就是从 ARMv7 架构开始,ARM 的命名方式有所改变。新的处理器家族,改以 Cortex 命名,并分为三个系列,分别是 Cortex-A,Cortex-R,Cortex-M。很巧合,又是这三个字母A、R、M
指令集与微架构 - 图5

Cortex-A 系列(A:Application)

针对日益增长的消费娱乐和无线产品设计,用于具有高计算要求、运行丰富操作系统及提供交互媒体和图形体验的应用领域,如智能手机、平板电脑、汽车娱乐系统、数字电视,智能本、电子阅读器、家用网络、家用网关和其他各种产品。

Cortex-R 系列 (R:Real-time)

针对需要运行实时操作的系统应用,面向如汽车制动系统、动力传动解决方案、大容量存储控制器等深层嵌入式实时应用。

Cortex-M 系列(M:Microcontroller)

该系列面向微控制器领域,主要针对成本和功耗敏感的应用,如智能测量、人机接口设备、汽车和工业控制系统、家用电器、消费性产品和医疗器械等。

Cortex-SC 系列(SC:SecurCore)

其实,除了上述三大系列之外,还有一个主打安全的 Cortex-SC 系列(SC:SecurCore),主要用于政府安全芯片。

举例:Exynos 4412 SCP

以三星的 Exynos(猎户座) 4412 SCP 为例:

  1. 三星的 Exynos 4412 SCP 是一款基于 Cortex-A9 的 SOC;
  2. 如下图所示,Exynos 4412 包含了 4 个 Cortex-A9 的处理器(核);
  3. Cortex-A9 是基于 ARMv7-A 架构(指令集)的。

指令集与微架构 - 图6
由上图可知,exynos 4412 出了包含 4 个 Cortex-A9 核,还包括大量的外设控制器:DRAM Controller、SROM Controller、Camera IF、JPEG、GPS/GLONASS、Power Management、USB Host、I2C、UART、SPI 等。

和三星相同的其他和 arm 合作的各大厂商通常会把它的 CPU 和各类外围 IP 都放到一起,然后自己拿着图纸去流片,生产出来的也是一个正方形,下面有很多引脚,这个东西不仅包含了 CPU,还包含了其他的控制器,这个东西就叫做 SOC(system on chip)。

如下图所示,就是三星最终生产的 Exynos 4412 ,当然了,光有这个 soc 还无法运行安卓,还需要借助外围大量的外设才能最终形成一个完整的系统,但是大部分最复杂的硬件部分模块都已经集成到了这个 soc 中。
指令集与微架构 - 图7

ARM授权

在嵌入式芯片厂商中,并不是所有的芯片厂商都有能力和精力去设计微架构。除了ARM公司和几个技术积累比较深厚的芯片巨头,其他小芯片厂商、创业公司更倾向于直接使用ARM公司设计的微架构来快速搭建自己的SoC芯片,这种设计模式可以大大减少芯片的开发难度和成本。这种商业模式得益于ARM公司灵活的IP授权方式:ARM公司自己不生产芯片,也不卖芯片,主要靠IP授权盈利。
面对不同的芯片厂商和市场需求,ARM公司有多种灵活的授权方式,目前主要有以下三种。

  • 指令集/架构授权
  • 内核授权。
  • 使用授权。

一个芯片厂商购买了指令集授权,可以基于该指令集实现自己的微架构,甚至可以对该指令集进行扩展或缩减。从目前来看,能获得ARM公司的指令集授权,并有能力设计微架构的公司不多,基本上也就是几个芯片巨头,如苹果公司的Swift微架构、高通公司的Krait微架构、三星公司的猫鼬微架构(三星公司目前已放弃自研)。除此之外,获得指令集授权的还有华为和龙芯,龙芯购买了MIPS指令集永久授权,自己又添加了很多条指令,根据该指令集设计出了GS464E微架构,然后基于该微架构设计出了龙芯3B2000、龙芯3A1000等处理器。
内核授权,又称为微架构授权。ARM公司根据自家的指令集标准设计出不同的微架构,其他芯片公司购买这个微架构,然后使用AMBA总线和各种IP模块连接,就可以快速搭建出一个片上系统,即SoC芯片,封装测试通过后就可以快速推向市场销售了。ARM的微架构授权客户有很多,国外的公司有三星、飞思卡尔、ST、德州仪器,国内的公司有海思、瑞芯微、全志、联发科等。微架构授权的特点是客户不能对ARM的CPU内核(微架构)进行修改。为了满足不同客户的不同需求,基于一套相同的指令集,ARM公司会设计出不同的微架构,甚至会开放微架构中的一些可配置选项(如Cache大小),以方便客户搭建出差异化的处理器产品。
image.png
使用层级授权,要想使用一款处理器,得到使用层级的授权是最基本的,这就意味着你只能拿别人提供的定义好的 IP 来嵌入在你的设计中,不能更改人家的 IP,也不能借助人家的 IP 创造自己的基于该 IP 的封装产品。如果一个公司刚刚建立,处理器的设计和研发能力不是很强,但是又发掘到了不错的市场需求,想快速设计出一款SoC芯片产品来打开市场,此时就可以考虑使用授权。客户可以直接使用已经封装好的ARM处理器,不仅CPU内核的硬件电路已经设计好,连工艺制程、芯片生产厂家也帮你选好了。这种授权模式大大减轻了客户的设计负担,客户只需要关心自己的业务设计,快速做出产品推向市场,赢得市场先机。

其实就像我写了一篇文章,我告诉甲,你可以拿去修改后使用,便是架构层级授权,我告诉乙,你可以在你的文章中引用我的文章,便是内核级授权,我告诉丙,你只能对我的文章进行转发,不能更改,不能添油加醋,便是使用层级授权。

当前的主流处理器市场基本上被X86和ARM瓜分。X86指令集不授权,不开放内核,靠X86专利垄断制造行业壁垒,抬高其他处理器厂商的准入门槛,所以你能看到市面上的X86 CPU厂家只有那几个巨头。ARM公司自己不生产CPU,靠IP授权盈利,众多SoC芯片厂商购买了ARM公司的IP授权后就可以自己设计和制造CPU,所以ARM处理器市场就比较热闹,各种芯片厂商、创业公司、处理器层出不穷,ARM因此也构建了一个庞大的ARM系统生态,垄断移动市场。以ARM V8指令集为例,如图2-66所示,我们可以看到基于该指令集,市场上出现的不同微架构,以及各种处理器和芯片厂商。他们和ARM公司一起构建了整个ARM开发生态。
image.png
目前市面上还有一些免费开源的指令集架构,如RISC-V指令集。RISC-V指令集和ARM一样,同属于RISC指令集,两者都可以看作RISC指令集的一个分支。RISC-V属于RISC的第五个版本,因此叫作RISC-V。RISC-V指令集除了免费开源的诱人利好,还有架构精简、模块化设计灵活、指令可扩展定制等后发优势,目前已经有公司基于该指令集开发出自己的处理器,如平头哥半导体有限公司发布的玄铁910。RISC-V会不会对ARM系统生态构成冲击,还需时间验证。