码农的自我修养 - 指令集架构种类

本文详细介绍了指令集架构(ISA)的基本概念,包括位数、操作数、字节顺序和寄存器数目等方面,并列举了多种ISA如x86/x86_64、AVR、MIPS等的特性。ISA作为硬件和软件间的接口,对性能、成本和兼容性有直接影响。64位架构如x86_64在大内存和密集运算中表现出性能优势,但也可能在小内存系统中导致效率降低。x32 ABI则试图兼顾两者。
摘要由CSDN通过智能技术生成

指令集架构instruction set architecture (ISA),这是一个电脑模型的概括,有时也叫做计算机架构。

ISA的具体实现有很多种,下面会介绍。不同的ISA实现在性能、物理空间和硬件成本上都不同。

ISA服务于硬件和软件之间的接口,基于某个ISA实现的软件可以在同一ISA的不同硬件上。

这就是在不同计算机上的二进制兼容功能,计算机可以一代代升级,而软件都能兼容运行。

所以,ISA是当今计算机里最重要的一个抽象概念。

ISA提供了机器语言编程所需的一切。但不同ISA实现的内容可能并不相同。

比如,数据类型、寄存器列表、寻址方式等。

下面列举一些ISA的主要方面:

1,Base / 进制

计算机最早时有用二进制,十进制,甚至还有三进制的。

当代的计算机几乎都是二进制。Contemporary computers are almost exclusively binary.

2,Bits / 位数

CPU处理的一个单位是一个word(字)。

一个字的长度主要有8,16,32或64位。也有其他位数的计算机出现过。

3,Operands / 操作数

操作数个数是一个指令集和性能有关的方面。

比如支持三个操作数的架构:

A = B + C

可以直接在一条指令集计算。

如果两个操作数的架构:

A = A + B

所以要计算两个数相加赋值给第三个数,就需要两条指令:

A = B

A = A + C

4,Endianness / 字节顺序或大小端 

一个指令集可以选择大端或小端,或者都有,或者可配置的。

小端处理器在内存中的字节顺序,是多字节的数值,低有效位字节在低地址位。

大端则相反。

x86架构是小端的。

大部分的RISC精简指令集电脑(PowerPC,MIPS等)本来是大端的,而ARM是小端的。

目前更多的架构是两种模式都可配置的,比如ARM就可以。

当然,对于大小端的区别,只适用于那些允许单字节寻址的处理器,还要基本寻址的机器字大小要超过一个字节。

5,寄存器数目

一般寄存器的数目是2的指数,比如8,16,32。

有些情况下,还有一个硬件实现的值为0的伪寄存器,方便使用,提高效率。

有一些特殊寄存器,比如Program pointer / PC,指令寄存器。

处理器访问内存的模式,比如8051是load -store,先读取内存的值到寄存器,操作完后,将寄存器的结果写入内存地址,不是直接操作内存。

而x86是可以直接按地址对内存进行操作。

Architecture

Bits

Design

Max Operands

Registers Number

Instruction Encoding

Endianness

8080

8

CISC

2

8

Variable (1 to3 bytes)

Little

8051

32 (8→32)

CISC

1

32 in 4-bit

16 in 8-bit

8 in 16-bit

4 in 32-bit

Variable (1 to3 bytes)

Little

x86/x86-64

16,32,64

CISC

2-4

Variable

Little

AVR

8

RISC

2

32

Variable

Little

AVR32

32

RISC

2-3

15

Variable

Big

MIPS

32->64

RISC

1-3

4-32

Fixed(32-bit)

Big or Little

PowerPC

32->64

RISC

3

32

Fixed(32-bit)

Big or Little

Thumb/T32

32

RISC

3

7 with 16-bit Thumb instructions;

15 with 32-bit Thumb-2 instructions

Thumb: Fixed (16-bit), Thumb-2:

Variable (16- and 32-bit)

Big or Little

ARM/A32

32

RISC

3

15

Fixed(32-bit)

Big or Little

ARM64/A64

64

RISC

3

32

Fixed(32-bit)

Big or Little

。。。。。。

一般商用服务器,跑的是RISC的系统,CPU只执行最常用的那部分指令,稳定性更好。比如IBM的PowerPC,Intel的安腾(Itanium)处理器(64bit, EPIC: Explicitly Parallel Instruction Computer架构),不过安腾昙花一现而已。

x86_64介绍

x86是指intel的开发的一种32位指令集,从386时代开始的,一直沿用至今,是一种cisc指令集,所有intel早期的cpu,amd早期的cpu都支持这种指令集,intel官方文档里面称为“IA-32”

  x84_64是x86 CPU开始迈向64位的时候,有2选择:

(1)向下兼容x86。但反过来,32bit的CPU上运行64bit的软件是不可以的。

(2)完全重新设计指令集,不兼容x86。

  AMD抢跑了,比Intel率先制造出了商用的兼容x86的CPU,AMD称之为AMD64,抢了64位PC的第一桶金,得到了用户的认同。

  Intel选择了设计一种不兼容x86的全新64为指令集,称之为IA-64(这玩意似乎就是安腾),但是比amd晚了一步,而且IA-64也挺惨淡的,因为是全新设计的CPU,没有编译器,也不支持windows(微软把intel给忽悠了,承诺了会出安腾版windows server版,但是迟迟拿不出东西)。后来不得不在时机落后的情况下也开始支持AMD64的指令集,但是换了个名字,叫x86_64,表示是x86指令集的64扩展,大概是不愿意承认这玩意是AMD设计出来的。

  实际上,x86_64、x64、AMD64基本上是同一个东西,我们现在用的intel/amd的桌面级CPU基本上都是x86_64,与之相对的arm、ppc等都不是x86_64。

  x86、x86_64主要的区别就是32位和64位的问题,x86中只有8个32位通用寄存器,eax,ebx,ecx,edx, ebp, esp, esi, edi。

  x86_64把这8个通用寄存器扩展成了64位的,并且比x86增加了若干个寄存器(好像增加了8个,变成了总共16个通用寄存器)。同样的MMX的寄存器的位数和数量也进行了扩展。此外cpu扩展到64位后也能支持更多的内存了,等等许多好处。

  对于普通程序来说,CPU位数的扩展、寄存器数量的增加不会带来明显的性能提升,比如IE浏览器、Office办公这类的软件。特定的程序很能够充分利用64位CPU、更多的寄存器带来的优势,比如MMX除了能提升多媒体程序的性能,对矩阵、多项式、向量计算都能带来提升,更多的MMX寄存器、更大的寄存器字长都有利于SIMD指令的执行,能够提升CPU对数据的吞吐量(RISC指令集的CPU动不动就有数百个寄存器,可以有效的缓存中间计算结果,不需要把中间结果写入内存,从而减少内存访问次数,显著提升性能)

最后说重点,64bit相比32bit的性能优势:

这里不考虑64bit硬件上运行32bit软件的这种过度方式。

从架构上来说,64bit拥有64bit 的register和64bit的bus,在数据传输效率上比32bit要高不少;

另外,64bit地址总线的寻址空间突破了4G的限制。

所以,对于大内存,密集数据运算的应用场景,64bit的优势是非常明显的。网上有一些benchmark,这里不贴了。

但是,对于小内存系统,64bit的CPU在某些状况下可能比32bit CPU的效率更低。

因为64 bit的CPU的地址是64位的,指针是64位的,编译生成的二进制文件更大,运行时占用的内存更多;另一方面,因为64位地址的问题,cache中能存放的指令就更少,所以更容易导致cache的miss。

所以在某些应用场景,64 bit CPU的更大的寻址空间,更快的数据传递,更快的浮点运算的特性,与其64 bit的地址/指针所导致的cache miss的特性,始终并存。

为了充分利用64的优势,又避免64bit地址导致的cache miss的问题,Intel提出了x32 ABI的概念。

x32不是一个ARCH,是一个ABI。

x32可以充分的使用64 bit硬件的64 bit寄存器,64bit总线,以及64bit新增的指令,从而获得更快的数据处理速度。

同时x32又使用32bit的地址/pointer,32bit的C数据类型,因此cache miss并不会增加。

x32是一个ABI,其设计到的部分包括:kernel的support,toolchain的support,system lib的support。现在kernel(from 3.4)和toolchain的support都已经OK。

注:

1,x86-64 (also known as x64, x86_64, AMD64, and Intel 64) is a 64-bit version of the x86 instruction set, first released in 1999. It introduced two new modes of operation, 64-bit mode and compatibility mode, along with a new 4-level paging mode.

2,AArch64 or ARM64 is the 64-bit extension of the ARM architecture. ARMv8-A Platform with Cortex A57/A53 MPCore BIG.LITTLE CPU chip.

3,MPcore means main processor core.

4,x86系列都有向后兼容设计,所以x86 32-bit的程序可以在x86-64上运行,但反过来不可以。类似的,ARM32程序也可以在ARM64上运行,但具体过程会复杂些,反过来也不行。

5,ARMv8-A系列的芯片是ARM64的。

参考网址:

https://en.wikipedia.org/wiki/Comparison_of_instruction_set_architectures

https://en.wikipedia.org/wiki/ARM_architecture

CPU知识了解:关于x86、x86_64/x64、amd64和arm64/aarch64 - 古兰精 - 博客园

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夜流冰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值