代码编织梦想

1 定义

指令集架构(Instruction Set Architecture,ISA)也称指令集或者指令集体系,是计算机体系结构中与程序设计有关的部分,包含基本数据类型,指令集,寄存器,寻址模式,存储体系,中断,异常处理以及外部IO。

1.1 指令集架构与微架构

指令集架构与微架构(microarchitecture)不同,微架构指的是一套用于执行指令集的微处理器设计方法,使得指令集架构可以在微处理器上被执行。

不同微架构的处理器可以共享一种指令集。举例:例如Intel的Pentium处理器与AMD的AMD Athlon处理器,都是属于x86的指令集架构,但是两者在处理器的内部设计上存在本质区别。

1.2 指令集架构的分类

复杂指令集计算机(Complex Instruction Set Computer,CISC):每个指令可执行若干低端操作,例如存储器读取、存储、计算操作等,指令数目多且复杂,每条指令字长不相等。这些特性使得代码编写较为简单,但是复杂的指令需要若干指令周期才可以实现。

精简指令集计算机(Reduced Instruction Set Computer,RISC):对指令数目与寻址方式都做了精简,只保留经常使用的指令,因此实现更加容易,指令并行程度较好,编译器效率较高。但是对于一些特殊操作,需要通过处理器额外的执行时间来弥补。其特征包括统一指令编码、泛用的寄存器,单纯的寻址模式等,每条指令的执行时间较短。

实际上在后来的发展中,RISC与CISC在竞争的过程中相互学习,现在的RISC指令集也达到数百条,运行周期也不再固定。

2 x86相关的架构及其发展历史

x86泛指一系列基于Intel 8086且向后兼容的指令集架构。1978年Intel推出了8086处理器(16位微处理器),1985年Intel推出了80386(32位处理器)。由于Intel早期处理器名称是以数字来表示80x86,因此这些架构称之为x86

x86

通常来说是Intel开发的32位指令集,这种指令集兼容16位指令,一直沿用至今,属于CISC指令集。早期Intel生产的CPU与AMD生产的CPU均支持这种指令集,相应地,这些CPU被称为x86架构(The x86 architecture)Intel官方称这种指令集架构为IA-32(Intel Architecture, 32-bit)。有时候也会被称为i386

当CPU迈向64位时,对于指令集,有2种发展途径:

向下兼容x86

重新设计新的指令集,不兼容x86

这分别引出了2种指令集架构:AMD64IA-64

AMD64

AMD在Intel之前,选择了前者——设计了一向下兼容x86的64位指令集,称之为AMD64,并生产了相应指令集的CPU,市场反映良好。

IA-64

Intel选择了而后者——设计了一种全新的64位指令集,不兼容x86,称之为IA-64。但是反响不好,因为是全新设计的指令集,不支持Windows,也没有相应的编译器。

安腾(Itanium)处理器是属于Intel安腾架构的64位处理器,传闻所谓的安腾架构就是IA-64,不过没有经过Intel官方证实。

x86-64(或者写成x86_64)

Intel在IA-64反响不好的情况下,决定开始支持AMD64的指令集,称之为x86-64(或者x86_64),表示这是x86指令集的64位扩展。实际上AMD64与x86-64基本是同一个ISA,现在我们使用购买的Intel或者AMD生产的CPU,都属于x86-64的ISA。

有时候,x86-64也会被简称为x64,也有的公司会使用amd64,实际上所指都是同一ISA,同时指代AMD的AMD64与Intel的x86-64。

x86与x86_64的区别

x86与x86_64指令集架构最主要的区别其位数:

x86是32位的,从寄存器角度来看,设计了8个32位通用寄存器(EAX,EBX,ECX,EDX,EBP,ESP,ESI,EDI)

x86-64是64位的将原先的8个通用寄存器扩展为64位的(RAX,RBX,RCX,RDX,RBP,RSP,RSI,RDI),并且还增加了若干通用寄存器,对于MMX的寄存器位数与数量也进行了扩展

小结

x86 = IA-32 = i386;AMD64 = x86-64(x86_64) = x64 ≠ IA-64

对于x86-64体系结构的CPU,都做了兼容32位的特殊处理,在64位的CPU上运行32位的软件(包括操作系统)都是没有问题的。

这里有一个例子,例如,我希望安装Anaconda,从Index of /anaconda/archive/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror网站上寻找安装包进行安装,可以发现最新版本Windows操作系统下有2个exe格式的安装包,分别为

db4d160d04bd4b0da9af34f3e4b9ad77.png

一个结尾是x86,另一个结尾是x86_64。

相同点:对于x86_64架构的Intel处理器或者AMD处理器,两个安装包都可以成功安装并运行,因为x86_64是兼容32位的,可以执行x86指令集的32位指令,也就可以运行32位的软件。

不同点:

x86_64安装包较大,因为是使用64位的x86_64指令集的二进制代码,容量较大;运行在x86_64架构的处理器上速度较快;

x86安装包较小,因为是使用32位的x86指令集的二进制代码,容量较小;运行在x86_64架构的处理器上速度较慢;

再例如,有时候安装包名称的后缀是amd64,但是我使用的是x86_64架构的Intel处理器,这种情况下也是可以运行的,因为amd64与x86_64本质是同一个指令集。

3 ARM相关指令集体系结构

ARM既可以认为是一个公司的名字,也可以认为是对一类微处理器的通称。

ARM公司的特点

ARM公司通过转让高性能、低成本的、低功耗的RISC微处理器、外围和系统芯片设计技术给合作伙伴,使他们能用这些技术来生产各具特色的芯片。ARM从不制造和销售具体的处理器芯片,而是把处理器的设计授权给相关的商务合作伙伴,让他们去根据自己的强项设计具体的芯片,称之为“知识产权授权”。

ARM架构的特点

ARM指令集架构属于RISC架构,在其官网文档中,描述了其特点:

大量、统一的寄存器;

Load/store体系结构,通过寄存器进行操作指令,不能直接作用内存;

简单的寻址模式,所有load/store方式都通过寄存器内容和指令字段;

ARM架构的历史演变

ARM架构,曾称进阶精简指令集机器(Advanced RISC Machine)。其架构的版本以数字命名,一直到现在的ARMv8(目前已经有ARMv9),其历史演变如下图所示。

format,png

每次版本更新都会添加新的特性,从ARMv7开始,其架构开始出现分支,ARM称之为不同的系列(Architecture profiles),分别命名为

架构

特点

应用

ARMv7-A

(Application)

运行复杂应用程序的应用处理,支持大型嵌入式操作系统

Symbian,Linux,Windows

Mobile或CE

ARMv7-R

(Real-time)

硬实时且高性能的处理器,可靠性高,对事件反应敏捷

高端实时市场:高档轿车的组件,大型大电机控制器

ARMv7-M

(Microcontroller)

低成本,低功耗,急速反应中断,高处理效率

单片机应用,实时控制系统

用于服务器的ARM架构芯片,是A系列的。目前较为流行的是ARMv8-A,ARM架构服务器的处理器,都是属于A-profile的ARM架构。

例如华为泰山服务器使用的是海思的Kunpeng 920处理器,是基于ARMv8-A设计的服务器处理器芯片。研究其架构我们可以参考ARM提供的架构手册:Arm® Architecture Reference Manual - Armv8, for A-profile architecture。

ARM的指令集架构与执行模式

在ARMv8之前,ARM处理器一直支持两种形式上相对独立的指令集:

ARM:32位的ARM指令集,对应处理器ARM状态

Thumb:16位的指令集,对应处理器Thumb状态

在Thumb指令集的基础上,Thumb-2指令集,是Thumb的超集,支持16位和32位指令。成为了后面的T32指令集。在ARMv8之后,为了区分之前的指令集,将指令集作出以下区分。

A64:A64指令集是在ARMv8-A中引入的,以支持64位架构。A64指令集有固定的32位指令长度。主要

A32:A32指令集有固定的32位指令长度,并在4字节边界上对齐。A32指令集实际上是在ARMv6和ARMv7架构中我们常说的ARM指令集,ARMv8及之后改名A32(为了与A64进行区分)。随着Thumb-2技术的引入,它的大部分功能都被纳入了T32中。A32指令主要被用于A-profile和R-profile,相当于对T32指令集的扩展。

T32:T32指令集最初是作为16位指令的补充集引入的,用于改进的用户代码的代码密度。随着时间的推移,T32演变成16位和32位混合长度的指令集。因此,编译器可以在单个指令集中平衡性能和代码大小。T32指令集就是在在ARMv6和ARMv7架构中的Thumb指令集,ARMv8及之后改名为T32。T32支持所有架构的Profile,并且是M-Profile架构所支持的唯一指令集。

ARMv8架构具有两种不同的执行模式(execution modes)

AArch64:64位执行状态,地址保存在64位寄存器中,基本指令集中的指令使用64位寄存器进行处理。 AArch64状态支持A64指令集;

AArch32:32位执行状态,地址保存在32位寄存器中,基本指令集中的指令使用32位寄存器进行处理。 与ARMv7-A兼容,AArch32状态支持T32和A32指令集。

b0c3de16ddbc4f34afec833a6be7666f.jpeg