ARM 处理器:RISC与CISC 是什么?
1. 都是从不务正业开始
如同Intel并不是以CPU起家,而是从存储器跨足到IC设计,至今成为x86处理器的龙头。ARM也是一样,这一切都要从Hermann Hauser和Chris Curry所创立的Cambridge Processor Unit开始说起。
1978年,由物理学家Hermann Hauser和工程师Chris Curry一同在英国剑桥成立了一间公司,公司名称直接取作Cambridge Processor Unit(CPU),主要从事提供当地电子仪器设备的业务。第一份合约即是为ACE Coin Equipment公司开发一款水果盘,也就是拉霸的游戏机。
2. 世界上首颗RISC处理器
随着时间过去,渐渐地发现原本的硬件设计已不符需求,Acorn想要升级机器内的CPU。当时处理器的发展潮流是由8位元转向16位元,一开始有考虑使用美国国家半导体以及Motorola新的16位元芯片,但是经过评估后,发现2个缺点。
执行上有点慢,中断的回应时间太长,而且太贵。
一台500英镑的计算机,CPU售价高达100英镑。
于是只好转向Intel,要求提供一些80286设计资料以及样品,但是却遭到Intel拒绝。这件事情后来直接导致Acorn决定设计自己需要的CPU,由于采用RISC架构的关系,名称就称为Acorn RISC Machine(ARM)。
2.1. RISC与CISC的差异
处理器的指令集可简单分为2种,CISC(complex instruction set computer)以及RISC(reduced instruction set computer)。一开始的处理器都是CISC架构,随着时间演进,有越来越多的指令集加入。由于当时编译器的技术并不纯熟,程序都会直接以机器码或是汇编语言写成,为了减少程序设计师的设计时间,逐渐开发出单一指令,复杂操作的程序码,设计师只需写下简单的指令,再交由CPU去执行。但是后来有人发现,整个指令集中,只有约20%的指令常常会被使用到,约占整个程序的80%;剩余80%的指令,只占整个程序的20%。于是1979年美国加州大学柏克莱分校的David Patterson教授提出了RISC的想法,主张硬件应该专心加速常用的指令,较为复杂的指令则利用常用的指令去组合。
RISC的优点列举如下:
指令长度固定,方便CPU译码,简化译码器设计。
尽量在CPU的暂存器(最快的存储器元件)里操作,避免额外的读取与载入时间。
由于指令长度固定,更能受益于执行线路管线化(pipeline)后所带来的效能提升。
处理器简化,晶体管数量少,易于提升运作时脉。比起同时脉的CISC处理器,耗电量较低。
RISC的缺点列举如下:
复杂指令需要由许多的小指令去完成,程序变得比较大,存储器也占用比较多,这在硬盘昂贵,常常使用磁带储存的时代来说,是个大缺点。
程序变长,代表着读取工作变得繁重,需要更多的时间将指令从存储器载入至处理器内。
这里也提供一个小小的概念,CISC是在RISC出现之后才出现的相对名词,并不是从一开始就有CISC、RISC这2种处理器架构。
3. 首颗RISC架构CPU
于1985年,Acorn设计出了第一代处理器芯片,称为ARM1,由Sophie Wilson设计出类似于6502的指令集,因为当时Acorn为英国国家广播公司BBC所制造的BBC Micro计算机采用MOS 6502处理器,使用类似的指令集有助于缩短开发时间以及技术转移。Steve Furber则是负责设计硬件实作。ARM1以第二颗处理器的身分,安装在BBC Micro内部。
ARM1在晶圆设计部分,规格为3微米制程、2层金属层、总计2万5千个晶体管、6MHz运作时脉、消耗功率120mW、芯片面积50mm2。当时Intel的80286使用1.5微米制程、13万4千个晶体管、6~12Mhz运作时脉,同时这2款处理器都不包含快取。
同年10月,Intel发表80386处理器,与之相比,ARM1显得功能简单、能源消耗较少,在效能上不是80386的对手。这一差异导致ARM系列处理器往后的设计路线明显与Intel不同,Intel持续迈向x86高效能设计,ARM专注于低成本、低功耗的研发
4. 渐入佳境、架构变更
真正商业化的处理器为ARM2,ARM1处理器架构为ARMv1,到了ARM2更新到ARMv2,这一代新增乘法器在核心之中。ARMv2的进阶版ARMv2a则是多包了存储器管理核心、绘图及I/O处理器。接下来的ARM3,处理器架构ARMv2a,是第一次于CPU里内建了4KB快取。1990年,Acorn开始与苹果计算机合作发展新一代的ARM芯片,特地还为此设立了一间公司,称为Advanced RISC Machines公司。最初财务吃紧,办公室仅为一个谷仓,成员也仅有12人。原本ARM所代表的Acorn RISC Machine,也在此时更换为Advanced RISC Machine。
1991年发展出的ARM6,处理器架构更新为ARMv3,主要扩展存储器定址线。之前的ARM产品都只有26bit的存储器定址线,最大可支援64MB的存储器。从ARM6开始,完整支援32位元存储器定址,最大支援到4GB。在此离题一下,ARM6处理器家族下的ARM610处理器,曾经用在苹果计算机的Newton Message Pad上头,Newton也被视为现今PDA与Smart Phone的始祖。
5. 开始大卖的ARM7
1993年推出的ARM7延续着ARMv3核心,但是由于制程的进步,快取加大至8KB,时脉也一举拉高至40MHz。
ARM7TDMI(处理器架构ARMv4T),除了原本的32位元指令集外,还新增了Thumb,也就是精简过的16位元指令集,让编译出来的程序可以缩小程序码体积,官方表示与标准的ARM指令集相比,可以缩小35%的程序码体积,又能享受32位元架构所带来的效能提升。Thumb指令在执行时会通过处理器内一个叫做Thumb译码器的东西,及时解压成32位元ARM指令,同时也可受惠于32bit的存储器总线,加速指令与资料的载入。
但之后的ARM8家族和Digital Equipment Corporation向ARM买授权自行制作的处理器StrongARM,都不支援Thumb。
ARM7EJ的处理器架构为ARMv5TEJ,直接加入称为Jazelle DBX的运算电路,能够以硬件加速大部分的Java bytecode,提升Java程序的执行效率;同时也新增适合处理DSP的指令,如饱和运算(saturated arithmetic)可以加速多媒体应用
5.1. Java的执行方式
程序设计师以Java语言写出程序后,经过编译器编译成Java bytecode档,执行时便把这个Java bytecode丢入一个称作JVM(Java Virtual Machine)的模拟器里执行,在各种平台上都有不同的JVM,所以编译过后的Java bytecode能够跨平台执行。
5.2. 饱和运算(saturated arithmetic)
正常以二进制表示为11111111(255)+00000001(1)=100000000(256),但是一个8bit的加法器,当输入255+1的指令后,计算出来的结果将会是0。因为处理器只有8bit,最高位会产生数值溢位,实际交由8bit加法器运算将变成11111111(255)+00000001(1)=00000000(0)。但是当处理器支援饱和运算后,255+1的结果将变成255,经计算后的数值资料只会顶天立地(该资料类型的最大值或最小值),不会产生overflow或是underflow。
6. 更换为哈佛架构
ARM9处理器家族内部处理器架构为ARMv5TE,导入了相当重要的架构更新,以往ARM和x86处理器都是采用冯?纽曼架构,意即中央处理器和储存装置是分开的,中央处理器到储存装置中读取一段程序码执行,而不同程序码可以造成不同的执行结果。相较于古早时代的计算机,一旦要执行不同的程序码时,必须更动硬件设计,重新接线。约翰?冯?纽曼在1945年的论文中提出这个处理单元和储存单元分离的概念,对于后来计算机发展有相当重大的影响。
哈佛架构则是冯?纽曼架构的延伸,哈佛架构更进一步定义了程序和资料是由两个独立的空间储存,同时也有两个存储器控制单元分别操作。读取程序后译码便得到资料位址,再到资料存储器中读取资料。此种架构好处在于指令和资料的存储器操作能够同时进行,当处理器在运算资料时,便可以先行撷取下一道指令。
7. 智能型手机应用大爆发
被苹果相中的ARMv6
在2007年的Macworld发生了一件大事,划时代的iPhone诞生了,直觉的使用者操作立刻席卷全球,App Store的商业模式解决以往PDA程序太少的窘况。而第一代的iPhone和其后的iPhone 3G便是采用ARMv6处理器架构,也是第一次让人感受到,原来ARM可以做到这么好的使用者体验。
ARMv6架构在2001提出,对应ARM11处理器家族。新增SIMD处理功能,相当适合影片处理加速使用。同时也提出ARM11MPCore,首次将多核心的概念导入ARM处理器中。Thumb指令集也升级到第2代Thumb-2,将原先16bit的指令集部分扩展到32bit,变成同时拥有16bit和32bit指令长度的指令集。
不过这个ARMv6架构有点短命,还没看到几颗多核的ARM11处理器(NVIDIA的Tegra即为ARM11MPCore),就被ARM紧接而来的Cortex处理器给盖过去。
7.1. 划分高中低阶的Cortex
在ARM11之后的处理器家族,改采Cortex命名,并针对高、中、低阶分别划分为A、R、M三大处理器。象是高阶手机用的Coretex-A系列,或者是微控制器所使用的Coretex-M系列,需要较高性能、或是实时处理的系统则改用Coretex-R系列。
除了Cortex-M0、Cortex-M1为ARMv6-M,冯?纽曼架构之外,其他Cortex的处理器架构更新到ARMv7,一样由高至低分成ARMv7-A、ARMv7-R、ARMv7-M三种,其中ARMv7-M不支援最原始的ARM指令集,仅支援16bit的Thumb指令集,却加入NVIC(Nested Vectored Interrupt Controller),提供更快的中断处理、还有负责CPU在深层睡眠时的中断处理WIC(Wake-up Interrupt Controller)。
Cortex-A(ARMv7-A)和 Coretex-R(ARMv7-R)2种架构基本上是相同的,都支援更新的进阶型SIMD处理,称为NEON,ARM宣称效能至少是上一代处理器架构ARMv6的2倍。NVIDIA的Tegra 2处理器较为特殊,虽是采用Cortex-A的CPU,但没有包含NEON,反而使用自家的技术,内建专门的音讯处理器和视讯处理器。
Cortex-A和 Coretex-R最大的差异在于存储器管理单元部分,Cortex-A使用MMU(memory management unit)、Cortex-R使用MPU(memory protection unit)。前者的存储器管理单元提供虚拟存储器的支援,后者只能运作在存储器保护模式。
7.2. 存储器管理:real、protected、virtual
最初的CPU存储器管理只有real mode,在这个模式下,所有程序都可以直接存取存储器、I/O、计算机附加的硬件。但是在这种模式下的存储器空间少(1MB),程序无法多工(如果2个程序同时喂给打印机资料,印出来会是什么鬼啊!)。到了80286处理器后,导入了protected mode,将作业系统和程序的存储器区块分开,如果程序想要存取存储器,必须经由作业系统中介。从而提升系统安全性和稳定性。virtual memory则是在protected mode下的产物,允许硬盘之类非实体存储器的装置能够模拟成存储器。逻辑上来说,可以在不增加硬件花费的情况下,直接加大实体存储器容量。但硬盘的存取速度却远不如实体存储器,目前SATA 6Gb/s界面频宽为6Gb/s,DDR3-1600双通道的界面频宽却有25.6GB/s,两者相差约43倍。
8. 遍地开花的ARM
ARM一开始与苹果、VLSI所投资的资金下成立,初期营运状况不佳,而英国当地也没有什么晶圆厂,同时ARM也决心将自行发展的技术成为业界的标准。在这些条件的加总之下,ARM选择了以IP授权的方式经营。
IP(intellectual property智慧财产权)授权,即是把自己所创造的东西,以某种方式授权给其他人利用。例如我们在行人穿越线两旁所看到的小绿人走路灯号,当初的设计者便可以把此种想法授权给其它地区采用,借以收取授权费。而ARM也是透过此种方式营利,除了一开始的授权费之外,每卖出一颗芯片还需要付版权费。另一家较为知名采用IP授权营利的公司为MIPS,其产品常常可以在网络设备中见到。
这种授权方式使得每家公司都可以依据自身需求,设计出客制化芯片。比如说产品并不需要绘图的部分,便可以把绘图IP核心拿掉,亦或者也可以在芯片里塞入其他家厂商做出的IP核心,让功能更多元。相较于Intel近年强迫中奖的显示核心,ARM的作法弹性许多。
9. 未来朝向64bit迈进
如同 x86迈向x64一般,ARM也需要更大的总线来增加效能。在下一代的ARMv8架构中,也将加入64bit的支援,但是一切都还在讨论中。但是现在也不急,暂时还有个Coretex-A15可以拿来填一下发展时程,至于会增加哪些指令集则尚未确定。
ARMv8处理器将有2个执行状态,AArch32和AArch64。前者将完全兼容ARMv7的指令集及架构,将原封不动地移植到ARMv8身上。后者AArch64则是全新的指令集与处理器架构。
ARM目前也在积极建立并等待64bit的生态链完备,就如同x86转换到x64一般,AMD的64位元处理器早在2003年问世,但是等到64位元作业系统、程序真正普及,却也只是近几年的事情而已。更别说一般人计算机C槽里那个Program Files x86资料夹,放在里面的程序应该比Program Files还要多。
最近开始身价上涨的硬件加解密功能,ARM也预计加入AES加解密的指令,利用进阶SIMD的128bit暂存器来实作,SHA-1和SHA-256也在支援中。