ARM架构的历史
在Roger Wilson和Steve Furber的领导下,这个团队开始开发一种新的架构,类似于先进的MOS技术6502处理器。Acorn有很多基于6502架构的计算机,因此设计一个类似的芯片意味着它对公司有很大的优势。
团队在1985年开发了ARM1样片的版本,第一个真正量产的ARM2在次年量产。ARM2具有32位数据总线和26位寻址空间,并提供64 Mbyte和16个32位寄存器的寻址范围。其中一个寄存器用作程序计数器(字长),其前6位和后2位用于存储处理器状态标志。ARM2可能是世界上最简单和最实用的32位微处理器,只有30,000个晶体管(相比之下,摩托罗拉六年后有68,000个)。之所以紧凑,是因为它不包含微码(见微码)(这意味着它只有68000的1/3到1/4左右),而且不像今天的大多数CPU,它不包含任何缓存。这种精简的特性使得它的功耗很小,但却能发挥比Intel 80286更好的作用。后续处理器ARM3拥有4KB缓存,性能更佳。
1980年代后期,苹果开始与Acorn合作开发新版ARM内核。由于这个项目的重要性,Acorn甚至在1990成立了一家新公司,名为Advanced RISC Machines Ltd。正因如此,ARM有时被称为高级RISC机,而不是Acorn RISC机。因为其母公司ARM Holdings plc于1998 [1]在伦敦证券交易所和纳斯达克上市,高级RISC机器成为ARM Ltd .旗下的产品
这个项目后来进入ARM6,第一个版本发布于1991。然后苹果电脑用ARM6架构的ARM610作为他们苹果牛顿PDA的基础。1994年,Acorn在他们的Risc PC中使用ARM 610作为CPU。
在这些变化之后,大多数内核部件保持相同的大小。ARM2有30000个晶体管,但ARM6只增长到35000个。主要概念是ARM核可以通过ODM与一些选定的部件匹配,制成一个完整的CPU,并且可以在现有的晶圆厂中制造,以低成本实现高效率。
ARM的商业模式是出售其知识产权核心(IP核),授权厂商根据设计制作基于该核心构建的微控制器和中央处理器。最成功的实施案例是ARM7TDMI,它已经销售了几乎数亿台内置微控制器的设备。
DEC购买这个架构的产权(这里会引起混乱的是,它也让DEC Alpha化,开发StrongARM。在233 MHz的频率下,这个CPU只消耗一瓦的功率(后来的芯片消耗更少)。这种设计后来被转移到解决英特尔的投诉,所以英特尔借此机会用StrongARM架构来加强他们的旧i960生产线。英特尔后来开发了自己的高性能实现,称为XScale,后来卖给了Marvell。
支持智能手机、PDA和其他手持设备的最常见架构是ARMv4。XScale和ARM926处理器都是ARMv5TE,在很多高端设备中比ARMv4内置的StrongARM、ARM925T和ARM7TDMI处理器更常见。架构版本显示在下一列中。
设计文件
强调简单快速的设计方法,但整个电路不是微码,就像早期Acorn微机用的8位6502处理器。
ARM架构包括以下RISC特性:
读取/存储架构
不支持地址未对齐的内存访问(现在ARMv6内核支持)。
正交指令集(任何访问指令都可以以任何寻址方式访问数据正交指令集)
大量的16 × 32位寄存器文件。
固定的32位操作码长度,减少了代码数量带来的消耗,减轻了解码和流水线的负担。
大部分都是在一个CPU周期内执行的。
为了加强这种简单的设计方法,与同时期的处理器如Intel 80286和摩托罗拉68020相比,增加了一些特殊的设计:
大多数指令可以有条件地执行,减少了分支时的负担,弥补了分支预测器的不足。
算术指令只在需要时改变条件码。
32位桶形移位器可用于执行大多数算术指令和寻址计算,而不会损失性能。
强大的索引寻址模式。
简化但快速的双优先级中断子系统,带可切换寄存器集。
ARM设计附带的一个有趣的事情是,在每条指令前用一个4位的条件码来表示每条指令的执行是否有条件。
这大大减少了内存访问指令中使用的编码位数,换句话说,它避免了为if之类的小语句创建分支指令。有一个参考欧几里德最大公因式算法的标准例子:
在C编程语言中,循环是:
int gcd (int i,int j)
{
而(我!= j)
如果(i & gtj)
I-= j;
其他
j-= I;
返回I;
}
在ARM汇编语言中,循环是:
环路CMP Ri,Rj;将条件设置为NE(不等于)if (i!= j)
;GT(大于)if (i > j),
;或者LT(小于)if (I
子门Ri,Ri,Rj;如果GT(大于),I = I-j;
SUBLT Rj,Rj,Ri;如果LT(小于),j = j-I;
BNE环线;如果NE(不等于),继续循环。
这避免了then和else子句之间的分支。
指令集的另一个特点是可以将移位、旋转等功能组合成数据处理指令(算术、逻辑、寄存器间移动),所以比如一个C语言描述。
a+=(j & lt;& lt2);
在ARM下,可以简化成一条只需要一个字一个周期就能完成的指令。
添加Ra,Ra,Rj,LSL #2
这一结果可以使通用ARM程序更加紧凑,并且在不频繁访问内存的情况下可以更有效地使用流水线。即使ARM的执行速度通常被认为很慢,但与更复杂的CPU设计相比,它仍然可以表现得很好。
ARM处理器还有一些其他RISC架构不常见到的特性,比如PC相对寻址(的确,PC是ARM上16寄存器之一)和前递增或后递增的寻址方式。
其他考虑因素是ARM处理器将随着时间的推移增加其指令集。例如,一些早期的ARM处理器(早于ARM7TDMI)可能没有读取两个字节的指令。因此,严格来说,在为这些处理器生成代码时,无法处理C语言对象中使用volatile short的数据类型。
ARM7和大多数早期设计都有一个三级流水线:获取指令、解码指令和执行指令。ARM9等高性能设计有五个流水线阶段。提高性能的其他方法包括更快的加法器和更宽的分支预测逻辑电路。
这种架构提供了一种通过使用“协处理器”来扩展指令集的非侵入性方式,它可以通过软件中的MCR、MRC、MRRC和MCRR指令来寻址。协处理器空间在逻辑上分为16个协处理器,编号分别从0到15,第15号协处理器(CP15)保留用于一些常见的控制功能,例如使用缓存和内存管理单元执行操作(如果包含在处理器中)。
在基于ARM的机器中,外围设备通常通过将设备的物理寄存器映射到ARM的存储空间,即协处理器空间,或者通过连接到另一个依次连接到处理器的设备(如总线)来连接到处理器。协处理器的访问延迟较低,因此一些外围设备(如XScale中断控制器)被设计成可以通过不同的方式访问(通过内存和协处理器)。较新的ARM处理器有一个16位的指令模式,称为Thumb,可能与每个条件执行指令消耗4位的情况有关。在Thumb模式下,较小的操作码功能较少。例如,只有分支可以是有条件的,许多操作码不能访问所有的CPU寄存器。然而,更短的操作码提供了总体上更好的编码密度(注意:这意味着代码占用内存空间),即使一些操作需要更多的指令。特别是当内存端口或总线宽度限制在32位以下时,较短的Thumb操作码可以更有效地使用有限的内存带宽,从而提供比32位代码更好的性能。典型的嵌入式硬件只有很小的32位数据路径寻址范围和其他更窄的16位寻址(比如Game Boy Advance)。在这种情况下,通常可行的做法是编译成Thumb代码,并使用(非Thumb)32位指令集优化一些CPU相关的程序区,使其可以放在32位总线宽度有限的内存中。
第一个采用Thumb技术的处理器是ARM7TDMI。包括XScale在内的所有ARM9和更高版本都采用了Thumb技术。ARM还开发了一项技术,Jazelle DBX(直接字节码执行),允许他们在一些架构上加速Java字节码的执行。就像其他执行模式一样,在调用一些不能支持字节码的特殊软件时,可以提供一些字节码的加速执行。它可以在现有的ARM和Thumb模式之间相互执行。
第一个采用Jazelle技术的处理器是ARM926EJ-S: Jazelle在CPU名称中用英文字母‘J’标记。用来使手机厂商加快Java ME游戏和应用的执行速度,促使了这项技术的不断发展。Thumb-2技术最早出现在ARM1156的内核中,发表于2003年。Thumb-2扩展了16位Thumb的有限指令集,并通过额外的32位指令使该指令集得到了更广泛的应用。所以Thumb-2的预期目标是达到接近Thumb的编码密度,但在32位内存中却能表现出接近ARM指令集的性能。
Thumb-2还从ARM和Thumb指令集派生出多种指令,包括位域操作、表分支和条件执行等功能。ThumbEE,又称Thumb-2EE,在业内被称为Jazelle RCT技术,发表于2005年,首次出现在Cortex-A8处理器中。ThumbEE提供了Thumb-2的一些扩展性,使得指令集特别适合在执行环境下的运行时代码生成(比如即时编译)。Thumb-2EE是专门为一些语言(如Limbo、Java、C#、Perl和Python)设计的,它使实时编译器能够在不影响性能的情况下输出较小的编译代码。
ThumbEE提供了新的功能,包括每次访问指令时自动检查是否有无效指针,以及可以执行数组范围检查的指令,并可以分支到处理程序,其中包含少量频繁调用的代码,通常用于高级语言功能的实现,例如为新对象分配内存。VFP是协处理器中ARM架构的衍生技术。提供低成本的单精度和双精度浮点运算能力,完全兼容ANSI/IEEE Std 754-1985二进制浮点运算标准。VFP提供了大多数适合浮点运算的应用,如PDA、智能手机、语音压缩和解压缩、3D图像和数字音效、打印机、机顶盒和汽车应用。VFP架构还支持SIMD(单指令多数据)并行短向量指令执行。在诸如图像和信号处理的应用中,这对于减小编码尺寸和提高输出效率非常有帮助。
在基于ARM的处理器中,其他可见的浮点或SIMD协处理器包括FPA、FPE和iwMMXt。它们提供了类似于VFP的功能,但是在操作码级别不兼容。