指令集架构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