ISA, x86,x86_64, AMD64, 指令集等名词解析

什么是ISA

指令集架构(Instruction Set Architecture, ISA) 首次出现在IBM的System/360中。作为软硬件之间的接口,ISA在编译器编写者和处理器设计者之间提供了一个抽象层,将编程所需要了解的硬件信息从硬件系统中抽象出来。这样软件开发者就可以面向ISA编程了,开发出来的软件不经过修改就可以在符合该ISA的计算机上运行了。
ISA定义了机器语言程序编写者需要知道的一切,这其中就包括指令集,指令集编码,基本数据类型,寄存器,寻址模式,存储体系,异常处理,中断,I/O模型等。

不同指令集架构存在的问题:

由于不同的处理器开发团队采用的技术,具体的实现也不尽相同,不同的处理器使用了不同的指令集合
这样在处理器A上编写的程序就不能直接在处理器B上运行,需要重新编写,编译、汇编后才可以运行。显然这给程序设计,软件开发带来了极大的不便。

ISA的规定了什么?

1.数据类型;
2.寄存器;
3.字节次序;
4.指令格式;
5.指令集;
6.寻址方式;
7.协处理器:表示处理器的一个可选部件,负责处理指令集的某个扩展, 拥有与处理器想相独立的寄存器;
8.异常处理方式。

指令集架构分类:

指令集架构可以以很多方式进行划分,这两种就计算机分别采用的就是CISC和RISC指令集架构。一种常见的划分方式是CISC(Complex instruction set computer)复杂指令集计算机和RISC(Reduced instruction set computer)精简指令集计算机。

  1. RISC精简指令集,RISC简化了指令集,人们重新设计了指令集,剔除了那些不常使用的指令,只保留常用的指令。指令较短,但是如果要做复杂的事情就要多个指令来完成。最著名的ARM CPU就是使用的精简指令集,所有品牌的手机以及网络设备等都是用的是arm架构的CPU。
  2. CISC复杂指令集拥有很多特殊的指令,指令数目多而且复杂,每条指令可以是变长的。每条指令执行时间较长,但是可以处理的工作更为丰富。代表性的CPU就是AMD和Intel的x86架构的CPU,用于我们的个人电脑。

当然还有其他类型的指令集架构,比如VLIM(Very long instruction word)超长指令字架构,EPIC(Explicity parallel instruction computing)显示并行指令集计算。这些指令集架构都在尝试通过使编译器负责指令流的调度来实现指令级别的并行并且使用比CISC和RISC更少的硬件。

微架构

我们经常听说某某CPU体系架构,比如什么x86啊,这里的架构指的是微架构(Microartecture), 微架构就是ISA的具体实现,也就是CPU中的实现处理器各个功能的数字电路。微架构和ISA之间的关系可以说是这样的:ISA是处理器设计的规范,微架构就是对应ISA的处理器的具体实现。同样的ISA,不同的微架构,在性能上存在一定的差异。

32位和64位

32位和64位可以指CPU位数也可以指总线位宽,所以要说明指定的是哪个。
如果说的是总线位宽,也就是每个时钟周期能够传输的数据量,64位那就是8byte。
如果说的是CPU那么表示32位处理器每次处理4Byte(32bit),同理,64位处理器每次处理8Byte(64bit)。
64位的CPU,相比较32位的CPU来说,64位CPU最为明显的变化就是增加了8个64位的通用寄存器,内存寻址能力提高到64位,以及寄存器和指令指针升级到64位等。

如果说我们的CPU位数是64位,但是总线位宽是32位,那么实际发挥的效果也仅仅是32位,总线传输速度跟不上。

区别具体说明:

1、运行速度:
相对于32位处理器,64位处理器的运行速度更快。
2、支持内存:
相对于32位支持的内存最多只有4G,64位支持内存的大小和种类更加多样化。支持4G 8G 16G 32G 64G 128G 256G内存,理论上可以无限支持,只要你主板上有足够的内存条。
3、支持系统:
32位处理器不能完全支持64位处理器。
4、支持软件:
32位处理器只能支持32位的软件,支持不了64位的,而如今64位可以两种类型都支持。
5、大小对比:
64位处理器大小比32位处理器大。比如win7 64位比win7 32位系统大700M左右。

64位处理器是采用64位处理技术的CPU,相对32位而言,64位指的是CPUGPRs(General-PurposeRegisters,通用寄存器)的数据宽度为64位,64位指令集就是运行64位数据的指令,处理器一次运行64bit数据。

32位处理器,计算机中的位数指的是CPU一次能处理的最大位数。

32位计算机的CPU一次最多能处理32位数据,例如它的EAX寄存器就是32位的,当然32位计算机通常也可以处理16位和8位数据。
在Intel由16位的286升级到386的时候,为了和16位系统兼容,它先推出的是386SX,这种CPU内部预算为32位,外部数据传输为16位。
直到386DX以后,所有的CPU在内部和外部都是32位的了。

x86与非x86

按照CPU体系架构,服务器主要分为两类:

  1. 非x86服务器:使用RISC(精简指令集)或EPIC(并行指令代码)处理器,并且主要采用UNIX和其他专用操作系统的服务器,指令系统相对简单,它只要求硬件执行有限且常用的部分指令,CPU主要有Compaq的Alpha、HP的PA-RISC、IBM的Power PC、MIPS的MIPS和SUN的Sparc,Intel研发的EPIC安腾处理器等。这种服务器价格昂贵,体系封闭,但是稳定性好,性能强,主要用在金融、电信等大型企业的核心系统。
  2. x86服务器:又称CISC(复杂指令集)架构服务器,即通常所讲的PC服务器,它是基于PC机的体系结构,使用Intel或其他兼容x86指令集的处理芯片的服务器。目前主要为Interl的E3、E5系列,价格相对便宜,兼容性好,稳定性较差,安全性不算太高。

x86与x86_64

x86是指Intek的开发的一种32位指令集,从386时代开始,一直沿用至今,是一种cisc指令集,所有Intel早期的cpu,以及amd早期的cpu都支持这种指令集,在Intel官方文档中称之为(IA-32)。
x86:泛指一系列由Intel公司开发的处理器架构。基于x86的32位架构(i386,x86)即IA-32
x86-64通常称为amd64或者Intel64。指64位架构

x86_64是x86 CPU开始迈向64位时面临的两种选择:

  1. 向下兼容x86
  2. 完全重新设计指令集,不兼容x86
    AMD先Intel制造出兼容x86的商用CPU,AMD称之为AMD64,且得到用户的认同。

Intel选择设计了一种不兼容x86的全新64位指令集,称之为IA-64(这个就是前面所说的安腾)。由于较AMD晚,同时由于是全新设计的CPU,没有编译器、不支持Windows后来不得不在时机落后的情况下也开始支持AMD64指令集。
换了个名字叫x86_64。表示x86指令集的64扩展。他提供了向下兼容x86

实际上,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个,具体数量有待考证),同样的MMX的寄存器的位数和数量也进行了扩展。此外cpu扩展到64位后,也能支持更多的内存以及其他的种种好处。

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

x86-64 与 AMD64

x86-64有时会简称为x64,是64位微处理器机构及其相应指令集的一种,也是Intel x86架构的延伸产品。

x86-64是1999年由AMD设计,该64位集主要用于扩充IA-32,成为x86-64,后来改为AMD64。AMD64架构在IA-32基上新增64位寄存器,兼容早期的16位和32位软件,可使现有的以x86为对象的编译器转换为AMD64版本。

由于AMD64和Intel64基本上一致,很多软硬件产品都使用一种不倾向任何一方的词汇表达对两种架构的兼容。出于这个目的AMD对这种CPU架构的原始成为由x86_64变体为x86-64。其他公司也使用x64代表x86-64的缩写。

许多操作系统及产品,尤其是那些在Intel进入这块市场之前就引入x86-64支持的,使用amd64同时指代amd64和intel64。

现在的x86CPU在位数上由32/64bit之分,在ARCH上又有x86/x86_64/x64/i386/IA32/IA64/amd64
简单可按照下述理解:
32位 x86=i386=IA32
64位 amd64=x86_64=x64
64bit的CPU都做了向下兼容32bit的特殊设计,所以在64bit CPU上运行32bit的软件(kernel、app、driver)是没有问题的。反之则不行。

32位和64位指令集的区别

64bit拥有64bit的register和bus,在数据传输效率上比32位高很多,64bit的地址总线的寻址空间突破了4G限制,所以大于大内存、密集数据运算的应用场景,64bit的优势是非常明显的。
对于小内存系统,64bit的CPU在某些情况下可能比32bit的CPU效率更低。因为64bit的CPU地址是64位的,指针是64位的,编译生成的二进制文件更大,运行时占用的内存更多;另一方面,因为64bit地址的问题,cache中能存放的指令更少,所以更容易导致cache的miss。
所以在某些应用场景下,64bitCPU的更大寻址空间,更快的数据传递,更快的浮点运算的特性,与其64bit地址的指针所导致的cache miss的特性始终并存。

猜你喜欢

转载自blog.csdn.net/chongbin007/article/details/128236616