转自:http://www.programmer.com.cn/14703/
文/王越
2005年,苹果宣布其芯片向Intel迁移,在这背后夹杂着错综复杂的缘由,从Intel的诞生、精简指令集与复杂指令集之争到AIM与Wintel两大联盟之争,几十年来计算机芯片行业背后的故事由此展开……
2005年6月6日对于普通人而言不过是平凡的一天,但对于苹果及其粉丝而言却有着非凡的意义。在前一年接受了手术的Steve Jobs再一次登上了WWDC的舞台。他在会上宣布了一个非常具有争议性的决定-整个Mac产品线将从原本的PowerPC芯片迁移至Intel芯片。
这是Mac OS X诞生后苹果对Mac产品所做的最重要的决策,没有之一。从1994年起,苹果就在PowerPC阵营中扮演最重要的角色。这个由苹果-摩托罗拉——IBM 所团结起来的PowerPC联盟,一直是Intel——Microsoft联盟的主要对手。从1994年后,苹果几乎每个Mac产品的广告都要把Intel 芯片或Microsoft Windows/Office嘲笑一番,诸多果粉也以自己用的Mac是PowerPC芯片的而自我感觉异常良好,在这时突然倒戈,不但对果粉的高傲心理造 成了致命一击,也完全改变了整个计算机产业的框架布局。
要理解苹果这一步棋的原由,我们必须从头开始追寻近三十年来计算机芯片行业的风起云涌。
Intel的诞生
1965 年,在Fairchild Semiconductor的Gordon Moore发现,使用相同造价,每年半导体电路所能容纳的元器件数量可以多生产一倍。他把这个发现写了篇水帖往《Eletronics Magazine》上灌。Moore同学是个化学博士,没学过电器工程(如果这算那个时代的计算机系的话),他这篇灌水文的依据只有四个年份的统计数据, 他就闭着眼往图上一画说这线以后还会往上爬,全文没有任何实验、验证,甚至连个公式或代码都没有,结果不但被《Eletronics Magazine》接收了,还成为往后计算机架构课每个小朋友们必读的经典,史称摩尔定律。关键是Moore同学的论文被接收后,他还真心以为自己的文章讲的是真理,于是心一热,说从他预测的趋势来看,造计算机芯片有利可图,那么不妨开个公司生产芯片吧,于是,一家在往后五十年中后叱咤风云的Intel公司就此旦生。
但以当时Intel的实力只能造造内存,造处理器的全是大玩家,所以Intel在处理器业登场前,我们先介绍20世纪 60~70年代处理器业界的情况。当时处理器技术的发展越来越成熟也越来越复杂,这种快速发展缘于人民群众日益增长的计算需求与当时落后的编译器技术之间 的矛盾。这个时期,用编译器生成机器代码的执行效率还远不如用手写,而大家知道手写机器码是一件比较蛋疼的事,所以如果可以加入更高级的架构指令,写起来肯定比写多个低级指令来得顺手。加入可以打出组合拳的高级指令的另一个原因是,当时内存是个珍惜资源,一台计算机往往只有几千个位元,所以每一个位元都宝贵无价,而且读写速度极慢,组合若干低级指令成为一个高级编码、长度可变的指令,不但可以让程序更加紧凑,而且可以减少读写数据的频率,降低程序执行时所 需要的暂存器个数。所以大家都像“大跃进”似地把芯片逻辑设计得越来越复杂,以减轻手写机器码的强度。
RISC指令集风暴
但到了20世纪70年代末,计算机业界的发展水平有了翻天覆地的变化。内存越来越大,暂存器的代价越来越低,更重要的是编译器有了长足的发展,在大多数时 候,编译器产生机器代码的效率提高得飞快,并且随着C和Unix的流行,大家都知道手写机器码肯定不是未来科技发展的方向。所以在20世纪80年代初期, 加州大学伯克利分校的David Andrew Patterson及斯坦福大学的John LeRoy Hennessy认为,是时候让计算机架构回归简单的设计了。前者设计的RISC芯片依赖于暂存器窗口技术,使用少于其他架构一半的元器件数量,仅提供32个指令,就在跑分测试中甩开别的架构好几条街,成为后来Sun设计SPARC的基础。后者在教研究生课时一时兴起设计个芯片玩玩,玩出了MIPS芯片及后续的MIPS公司。
以这两块芯片作为基础,计算机架构界产生了一股重要的以RISC芯片命名的思潮-精简指令集(Reduced instruction set)。这批学者把别的架构都称为复杂指令集(CISC),并到处发论文、开讲座,证明精简指令集是个好思潮。
精简指令集在设计时,常会有以下特征。首先,它们都采用统一的指令编码,例如指令中的操作码都位于同样的位元位置,每条指令也必须是等长的,这大大简化了解译逻辑,使得指令在芯片内解译方便快速;其次,他们都使用统一的暂存器,所有暂存器可用于所有内容,并提供足够多的暂存器;再次,它们都有简单的寻址模 式,在CISC设计中的那些组合拳被拆散成若干条语句;最后,每条指令都很精简,大多都采用一个时钟周期执行,因此更能预测程序的执行,使得其更易被流水 并行执行。
由于RISC是个好思想,且实际也证实了RISC能够造出速度更快、性能更好的芯片,所以业界出现了一大批按照RISC思潮设计的新架构。其中著名的包括DEC Alpha、Sun SPARC、MIPS及后面会提到的IBM的Power系列架构。
艰难的转型
这时的Intel,大多数时间都在卖内存,偶尔造造微处理器,并一直标榜自己是首个微处理器生产厂商。1981年,IBM开发出第一台个人电脑,标志着个人 电脑时代正式到来,虽然大家都不知道个人电脑将在将来的三十多年里扮演多重要的角色,但上帝把这份幸运降到了Intel公司头上。IBM让Intel为其个人电脑设计了8086处理器,从此之后,Intel关掉了几乎整个内存部门,转行卖个人电脑微处理器,不断进取拓展业务,先后开发了一系列处理器,这套 架构就是我们今天所说的x86。
不幸的是,在Intel设计8086及80286的时候,搞RISC的那批学者还没发论文呢,等到IBM的个人电脑卖疯时,再推翻先前设计重新搞简化指令集己经晚了。因此,Intel当时及后继的x86芯片都是CISC的,并且80年代产生了一系列为x86架 构所写的计算机程式(很多程序在开发中还使用了大量的手写机器指令)。个人电脑不同于服务器,受众广得多,程序种类和数量也多,所以一但采用另一套指令集,就很难让用户迁移到新平台上。另外,哪怕不计应用程序重新改写、编译、发布(当时互联网离普及还早,大多程序都是靠软盘邮寄的)的代价,像DOS的操作系统完全重写迁移到另一个平台上可不是闹着玩儿的,需要漫长的改动和漫长的调试周期。所以考虑到指令集的兼容问题,后继的IBM PC及兼容机不可能再更换到另一套指令集了。
20世纪80年代晚期,RISC思潮在业界成为主流,以MIPS和Sun为代表的公司都靠它获得了可观的利润。IBM在考虑为他们的工作站和伺服器采用类似的架构,于是便有了POWER架构(POWER指Performance Optimization With Enhanced RISC)。90年代初,由于POWER架构很好很强大,所以IBM依据IBM POWER架构开发了PowerPC架构,并准备把它量产。PowerPC一发布就引起了许多厂商的兴趣。在跑分测试中,PowerPC架构的处理器都与同时代高档的Intel处理器相当甚至更快,所以很多公司都来凑热闹。例如Microsoft为之发布了Windows NT 3.51,Sun编译出一套Solaris,IBM也把AIX发布到PowerPC架构上。但刚才讲的问题没变,平台上有丰富健壮的生态系统才是王道,即使有了适合的操作系统,用户的程序都不能用还是白搭,所以这些厂商很快哪儿凉快待哪儿去了。
AIM联盟战略
但苹果携同给Mac提供处理器的摩托罗拉留了下来,他们需要下一代的技术来跟Intel及Microsoft对抗。90年代为了打击对手,Intel和 Microsoft形成了强大的Wintel联盟,吃光了个人电脑这块蛋糕,所以这次苹果准备奋起一搏,结果AIM(苹果、IBM、摩托罗拉)联盟在 1991年宣布成立。
IBM除了设计芯片外,本来也为丰富PowerPC的桌面应用编译了一系列Windows NT软件,本准备在1991年发布,可惜的是Windows NT的PowerPC版不断跳票,直到1995年才发布,所以一恨之下IBM决定自己把OS/2给移植到PowerPC上和微软对着干。结果这个重写花了 整整两年时间-刚才提到,把一个操作系统全部移植到新架构上可不是闹着玩儿的,取决于操作系统本身有多少对架构的依赖性。至少内核的中断、异常、bus驱动、虚拟内存等支持全得从零写起。所以等到差不多可以发布时才发现本来看PowerPC热闹的人都走光了,所以这个操作系统从未正式发布过。
苹果吸取了教训,采取了一个折中的方式,把内核紧要的代码移植到PowerPC架构上,上层空间中新写了一个模拟器来运行原先的摩托罗拉68k老架构的程序。这就是Mac OS System 7.1.2。所以在Mac OS X之前,Mac OS的用户空间一直保留着大量的68k代码,哪怕很多系统自带的程序都不是原生执行的。苹果一直试图把更多的老代码逐渐重写,重写的过程中引入的问题加重 了Mac OS操作系统的不稳定性,因为PowerPC完全使用了和68k不同的异常机制,使得Mac OS漏洞百出。一直到OS 8.5左右,大部分68k代码被替换为PowerPC代码,才使得稳定性有一定的提高。
但在商业上苹果自然会采取“老王卖瓜自卖自夸”的策略,发布了一系列的广告吹捧自己的计算机有多强大。这些广告自然不会提及Mac OS的稳定性,能拿得出手的只有PowerPC这套架构的先进性。20世纪90年代的苹果广告大多充满着对Intel架构的尖酸味,例如反映自己比 Intel核心的电脑快上许多,甚至夸张地把Intel的奔腾二说成慢如蜗牛。当然了,广告夸得再好,谁用谁知道,客户又不是傻子,真正的铁杆果粉又有几个。所以苹果在Mac OS一系列重写和修正失败后决定收购NeXT,把NeXTSTEP当作构建Mac OS X的基石(见《Mac OS X 背后的故事一》)。
NeXTSTEP迁移至PowerPC
NeXTSTEP 使用的Mach+BSD+DriverKit内核支持,属于类Unix系统,其天生具有良好的移植性(这也是当年的Solaris及AIX能那么快完成 PowerPC移植的原因)。Unix早年被设计时,为了能移植在各种大型机上,Denis Ritchie特地发明了C语言并极力减少机器码使用比重。后来的BSD系列为了能在各大学使用,也秉持了当初Unix设计的态度,并且尽可能地写平台无 关代码。例如现代的FreeBSD分支中,机器码占内核总代码的比重差不多为0.6%,而所有跟架构相关代码在内核中才占13.6%左右。这无疑为 NeXTSTEP这样的BSD分支移植到各架构上创造了得天独厚的优势。
NeXTSTEP支持 68K、x86、PA-RISC和SPARC架构,但颇有意味的是它之前不支持PowerPC架构。之前,苹果曾扶持Linux内核作为单一的服务运行在 Mach内核上,并把整套操作系统往PowerPC上移植,这就是MkLinux。MkLinux不但为Linux对PowerPC的支持作出了巨大贡 献,也为苹果使用NeXTSTEP扫清了最大的障碍。这些开发多源于开源社区,但使得苹果在很早就具备跨平台的能力(哪怕跨Intel和PowerPC这 种字节序完全不同的平台)。
NeXTSTEP另一个有趣的内核功能是支持称为胖二进制文件的技术。NeXT公司自己定制的GCC编译器可以 通过交叉编译,产生一个包含所有架构可执行码的二进制文件。这个文件可以在一个特定硬件平台上解出该平台原生版本的机器码执行。这个技术在Mac OS到Mac OS X的迁移中并没有被公布,却成为2005年往英特尔迁移时的核心技术之一。
NeXTSTEP有了这两个很好的条件后, 往PowerPC的移植并没经历太多的挫折,并且在前期一度准备x86平台和PowerPC平台“两手抓,两手都要硬。”1998年的MacWorld 上,乔布斯声称Rhapsody最后将成为Mac OS X Server 1.0版。而完整的Unix层代码后被释出,成为以Darwin为名的开放源代码软件。读者如果移步 http://opensource.apple.com/,会发现即使是在早期的Mac OS X 10.0代码中也是包含x86支持的。
Intel的捷径
显然,Mac OS X支持PowerPC是为了对老苹果用户负责,但对于x86平台的支持,不能不说Jobs早早地为后来的迁移做好了两手准备。的确,在早期,PowerPC这套RISC的架构确实比Intel好,无论在速度还是准确性上。跑分测试中PowrePC遥遥领先,而且,由于Intel芯片中的数表错误,造成其芯片计算浮点数运算时在某些场合会算错。Intel在20世纪90年代中后期一直力推奔腾4,但由于流水设计问题,其性能甚至不如奔腾3。 但Jobs在这时,目光却看得更实际、更远。
Intel毕竟不是傻子,他们有比别的公司多得多的钱投入研究,所以他们有足够多的资源去定下五年甚至十年后的目标(PBS电视纪录片《America Revealed》)。对于自家芯片各种设计上的缺陷,他们自己是损失者,此学得也比别家更快。例如前面提到,x86不是一个RISC的芯片,Intel在1995年发布的Pentium Pro中找到了通往RISC的捷径,把ISA换为RISC会破坏x86架构的兼容性,所以我的架构必须依然使用老指令,但这不代表我的处理器读入x86指令后,不能翻译成别的指令。Pentium Pro在取到一条x86指令时,硬件解码器会把一条CISC的x86指令解码成符合RISC风格的若干条微指令,因此,除了在起跑线上起跑慢了些以外,在解码后,Intel芯片执行的代码相对于PowerPC,技术上不存在任何劣势。指令在暂存器重命名后,通过投机执行绕过风险,便能并发、快速地进行乱序执行。
Intel是大规模量产,所以对于每块芯片的平均造价要比PowerPC低很多。PowerPC的芯片价格无疑抬高了Mac电脑的成 本,不但造成Mac用户的小众规模,同时在Intel大步迈进的同时,摩托罗拉却止步不前。尤其是Intel较早地意识到了移动芯片的重要性,开始对芯片进行节能优化设计,而PowerPC跑起来就像是个电暖炉。这使得苹果发布的笔记本电脑芯片主频一直远落后于台式机,并且在后期其台式机也需要大量泠却。
这引发了Jobs和摩托罗拉的CEO Chris Galvin的争吵(《Jobs传》)。1997年,Jobs回到苹果后,曾立即决定停止授权同类电脑制造商使用麦金塔操作系统。他打电话向Galvin提议, 如果摩托罗拉加速研发可用于笔记本电脑的芯片,那么苹果公司可能会考虑为摩托罗拉破例,授权其StarMax Mac兼容机使用麦金塔操作系统。两人的对话越来越激烈,Jobs对高尔文说,摩托罗拉的芯片烂透了。高尔文也是个有脾气的人,立即反驳,Jobs挂了他的电话,摩托罗拉从此停止生产StarMax电脑,而Jobs则开始暗中计划抛弃PowerPC芯片,转而投向Intel的怀抱。