文/王越
2005年,蘋果宣布其芯片向Intel遷移,在這背后夾雜著錯(cuò)綜復(fù)雜的緣由,從Intel的誕生、精簡(jiǎn)指令集與復(fù)雜指令集之爭(zhēng)到AIM與Wintel兩大聯(lián)盟之爭(zhēng),幾十年來計(jì)算機(jī)芯片行業(yè)背后的故事由此展開……
2005年6月6日對(duì)于普通人而言不過是平凡的一天,但對(duì)于蘋果及其粉絲而言卻有著非凡的意義。在前一年接受了手術(shù)的Steve Jobs再一次登上了WWDC的舞臺(tái)。他在會(huì)上宣布了一個(gè)非常具有爭(zhēng)議性的決定-整個(gè)Mac產(chǎn)品線將從原本的PowerPC芯片遷移至Intel芯片。
這是Mac OS X誕生后蘋果對(duì)Mac產(chǎn)品所做的最重要的決策,沒有之一。從1994年起,蘋果就在PowerPC陣營(yíng)中扮演最重要的角色。這個(gè)由蘋果-摩托羅拉——IBM 所團(tuán)結(jié)起來的PowerPC聯(lián)盟,一直是Intel——Microsoft聯(lián)盟的主要對(duì)手。從1994年后,蘋果幾乎每個(gè)Mac產(chǎn)品的廣告都要把Intel 芯片或Microsoft Windows/Office嘲笑一番,諸多果粉也以自己用的Mac是PowerPC芯片的而自我感覺異常良好,在這時(shí)突然倒戈,不但對(duì)果粉的高傲心理造 成了致命一擊,也完全改變了整個(gè)計(jì)算機(jī)產(chǎn)業(yè)的框架布局。
要理解蘋果這一步棋的原由,我們必須從頭開始追尋近三十年來計(jì)算機(jī)芯片行業(yè)的風(fēng)起云涌。
Intel的誕生
1965 年,在Fairchild Semiconductor的Gordon Moore發(fā)現(xiàn),使用相同造價(jià),每年半導(dǎo)體電路所能容納的元器件數(shù)量可以多生產(chǎn)一倍。他把這個(gè)發(fā)現(xiàn)寫了篇水帖往《Eletronics Magazine》上灌。Moore同學(xué)是個(gè)化學(xué)博士,沒學(xué)過電器工程(如果這算那個(gè)時(shí)代的計(jì)算機(jī)系的話),他這篇灌水文的依據(jù)只有四個(gè)年份的統(tǒng)計(jì)數(shù)據(jù), 他就閉著眼往圖上一畫說這線以后還會(huì)往上爬,全文沒有任何實(shí)驗(yàn)、驗(yàn)證,甚至連個(gè)公式或代碼都沒有,結(jié)果不但被《Eletronics Magazine》接收了,還成為往后計(jì)算機(jī)架構(gòu)課每個(gè)小朋友們必讀的經(jīng)典,史稱摩爾定律。關(guān)鍵是Moore同學(xué)的論文被接收后,他還真心以為自己的文章講的是真理,于是心一熱,說從他預(yù)測(cè)的趨勢(shì)來看,造計(jì)算機(jī)芯片有利可圖,那么不妨開個(gè)公司生產(chǎn)芯片吧,于是,一家在往后五十年中后叱咤風(fēng)云的Intel公司就此旦生。
但以當(dāng)時(shí)Intel的實(shí)力只能造造內(nèi)存,造處理器的全是大玩家,所以Intel在處理器業(yè)登場(chǎng)前,我們先介紹20世紀(jì) 60~70年代處理器業(yè)界的情況。當(dāng)時(shí)處理器技術(shù)的發(fā)展越來越成熟也越來越復(fù)雜,這種快速發(fā)展緣于人民群眾日益增長(zhǎng)的計(jì)算需求與當(dāng)時(shí)落后的編譯器技術(shù)之間 的矛盾。這個(gè)時(shí)期,用編譯器生成機(jī)器代碼的執(zhí)行效率還遠(yuǎn)不如用手寫,而大家知道手寫機(jī)器碼是一件比較蛋疼的事,所以如果可以加入更高級(jí)的架構(gòu)指令,寫起來肯定比寫多個(gè)低級(jí)指令來得順手。加入可以打出組合拳的高級(jí)指令的另一個(gè)原因是,當(dāng)時(shí)內(nèi)存是個(gè)珍惜資源,一臺(tái)計(jì)算機(jī)往往只有幾千個(gè)位元,所以每一個(gè)位元都寶貴無價(jià),而且讀寫速度極慢,組合若干低級(jí)指令成為一個(gè)高級(jí)編碼、長(zhǎng)度可變的指令,不但可以讓程序更加緊湊,而且可以減少讀寫數(shù)據(jù)的頻率,降低程序執(zhí)行時(shí)所 需要的暫存器個(gè)數(shù)。所以大家都像“大躍進(jìn)”似地把芯片邏輯設(shè)計(jì)得越來越復(fù)雜,以減輕手寫機(jī)器碼的強(qiáng)度。
RISC指令集風(fēng)暴
但到了20世紀(jì)70年代末,計(jì)算機(jī)業(yè)界的發(fā)展水平有了翻天覆地的變化。內(nèi)存越來越大,暫存器的代價(jià)越來越低,更重要的是編譯器有了長(zhǎng)足的發(fā)展,在大多數(shù)時(shí) 候,編譯器產(chǎn)生機(jī)器代碼的效率提高得飛快,并且隨著C和Unix的流行,大家都知道手寫機(jī)器碼肯定不是未來科技發(fā)展的方向。所以在20世紀(jì)80年代初期, 加州大學(xué)伯克利分校的David Andrew Patterson及斯坦福大學(xué)的John LeRoy Hennessy認(rèn)為,是時(shí)候讓計(jì)算機(jī)架構(gòu)回歸簡(jiǎn)單的設(shè)計(jì)了。前者設(shè)計(jì)的RISC芯片依賴于暫存器窗口技術(shù),使用少于其他架構(gòu)一半的元器件數(shù)量,僅提供32個(gè)指令,就在跑分測(cè)試中甩開別的架構(gòu)好幾條街,成為后來Sun設(shè)計(jì)SPARC的基礎(chǔ)。后者在教研究生課時(shí)一時(shí)興起設(shè)計(jì)個(gè)芯片玩玩,玩出了MIPS芯片及后續(xù)的MIPS公司。
以這兩塊芯片作為基礎(chǔ),計(jì)算機(jī)架構(gòu)界產(chǎn)生了一股重要的以RISC芯片命名的思潮-精簡(jiǎn)指令集(Reduced instruction set)。這批學(xué)者把別的架構(gòu)都稱為復(fù)雜指令集(CISC),并到處發(fā)論文、開講座,證明精簡(jiǎn)指令集是個(gè)好思潮。
精簡(jiǎn)指令集在設(shè)計(jì)時(shí),常會(huì)有以下特征。首先,它們都采用統(tǒng)一的指令編碼,例如指令中的操作碼都位于同樣的位元位置,每條指令也必須是等長(zhǎng)的,這大大簡(jiǎn)化了解譯邏輯,使得指令在芯片內(nèi)解譯方便快速;其次,他們都使用統(tǒng)一的暫存器,所有暫存器可用于所有內(nèi)容,并提供足夠多的暫存器;再次,它們都有簡(jiǎn)單的尋址模 式,在CISC設(shè)計(jì)中的那些組合拳被拆散成若干條語句;最后,每條指令都很精簡(jiǎn),大多都采用一個(gè)時(shí)鐘周期執(zhí)行,因此更能預(yù)測(cè)程序的執(zhí)行,使得其更易被流水 并行執(zhí)行。
由于RISC是個(gè)好思想,且實(shí)際也證實(shí)了RISC能夠造出速度更快、性能更好的芯片,所以業(yè)界出現(xiàn)了一大批按照RISC思潮設(shè)計(jì)的新架構(gòu)。其中著名的包括DEC Alpha、Sun SPARC、MIPS及后面會(huì)提到的IBM的Power系列架構(gòu)。
艱難的轉(zhuǎn)型
這時(shí)的Intel,大多數(shù)時(shí)間都在賣內(nèi)存,偶爾造造微處理器,并一直標(biāo)榜自己是首個(gè)微處理器生產(chǎn)廠商。1981年,IBM開發(fā)出第一臺(tái)個(gè)人電腦,標(biāo)志著個(gè)人 電腦時(shí)代正式到來,雖然大家都不知道個(gè)人電腦將在將來的三十多年里扮演多重要的角色,但上帝把這份幸運(yùn)降到了Intel公司頭上。IBM讓Intel為其個(gè)人電腦設(shè)計(jì)了8086處理器,從此之后,Intel關(guān)掉了幾乎整個(gè)內(nèi)存部門,轉(zhuǎn)行賣個(gè)人電腦微處理器,不斷進(jìn)取拓展業(yè)務(wù),先后開發(fā)了一系列處理器,這套 架構(gòu)就是我們今天所說的x86。
不幸的是,在Intel設(shè)計(jì)8086及80286的時(shí)候,搞RISC的那批學(xué)者還沒發(fā)論文呢,等到IBM的個(gè)人電腦賣瘋時(shí),再推翻先前設(shè)計(jì)重新搞簡(jiǎn)化指令集己經(jīng)晚了。因此,Intel當(dāng)時(shí)及后繼的x86芯片都是CISC的,并且80年代產(chǎn)生了一系列為x86架 構(gòu)所寫的計(jì)算機(jī)程式(很多程序在開發(fā)中還使用了大量的手寫機(jī)器指令)。個(gè)人電腦不同于服務(wù)器,受眾廣得多,程序種類和數(shù)量也多,所以一但采用另一套指令集,就很難讓用戶遷移到新平臺(tái)上。另外,哪怕不計(jì)應(yīng)用程序重新改寫、編譯、發(fā)布(當(dāng)時(shí)互聯(lián)網(wǎng)離普及還早,大多程序都是靠軟盤郵寄的)的代價(jià),像DOS的操作系統(tǒng)完全重寫遷移到另一個(gè)平臺(tái)上可不是鬧著玩兒的,需要漫長(zhǎng)的改動(dòng)和漫長(zhǎng)的調(diào)試周期。所以考慮到指令集的兼容問題,后繼的IBM PC及兼容機(jī)不可能再更換到另一套指令集了。
20世紀(jì)80年代晚期,RISC思潮在業(yè)界成為主流,以MIPS和Sun為代表的公司都靠它獲得了可觀的利潤(rùn)。IBM在考慮為他們的工作站和伺服器采用類似的架構(gòu),于是便有了POWER架構(gòu)(POWER指Performance Optimization With Enhanced RISC)。90年代初,由于POWER架構(gòu)很好很強(qiáng)大,所以IBM依據(jù)IBM POWER架構(gòu)開發(fā)了PowerPC架構(gòu),并準(zhǔn)備把它量產(chǎn)。PowerPC一發(fā)布就引起了許多廠商的興趣。在跑分測(cè)試中,PowerPC架構(gòu)的處理器都與同時(shí)代高檔的Intel處理器相當(dāng)甚至更快,所以很多公司都來湊熱鬧。例如Microsoft為之發(fā)布了Windows NT 3.51,Sun編譯出一套Solaris,IBM也把AIX發(fā)布到PowerPC架構(gòu)上。但剛才講的問題沒變,平臺(tái)上有豐富健壯的生態(tài)系統(tǒng)才是王道,即使有了適合的操作系統(tǒng),用戶的程序都不能用還是白搭,所以這些廠商很快哪兒涼快待哪兒去了。
AIM聯(lián)盟戰(zhàn)略
但蘋果攜同給Mac提供處理器的摩托羅拉留了下來,他們需要下一代的技術(shù)來跟Intel及Microsoft對(duì)抗。90年代為了打擊對(duì)手,Intel和 Microsoft形成了強(qiáng)大的Wintel聯(lián)盟,吃光了個(gè)人電腦這塊蛋糕,所以這次蘋果準(zhǔn)備奮起一搏,結(jié)果AIM(蘋果、IBM、摩托羅拉)聯(lián)盟在 1991年宣布成立。
IBM除了設(shè)計(jì)芯片外,本來也為豐富PowerPC的桌面應(yīng)用編譯了一系列Windows NT軟件,本準(zhǔn)備在1991年發(fā)布,可惜的是Windows NT的PowerPC版不斷跳票,直到1995年才發(fā)布,所以一恨之下IBM決定自己把OS/2給移植到PowerPC上和微軟對(duì)著干。結(jié)果這個(gè)重寫花了 整整兩年時(shí)間-剛才提到,把一個(gè)操作系統(tǒng)全部移植到新架構(gòu)上可不是鬧著玩兒的,取決于操作系統(tǒng)本身有多少對(duì)架構(gòu)的依賴性。至少內(nèi)核的中斷、異常、bus驅(qū)動(dòng)、虛擬內(nèi)存等支持全得從零寫起。所以等到差不多可以發(fā)布時(shí)才發(fā)現(xiàn)本來看PowerPC熱鬧的人都走光了,所以這個(gè)操作系統(tǒng)從未正式發(fā)布過。
蘋果吸取了教訓(xùn),采取了一個(gè)折中的方式,把內(nèi)核緊要的代碼移植到PowerPC架構(gòu)上,上層空間中新寫了一個(gè)模擬器來運(yùn)行原先的摩托羅拉68k老架構(gòu)的程序。這就是Mac OS System 7.1.2。所以在Mac OS X之前,Mac OS的用戶空間一直保留著大量的68k代碼,哪怕很多系統(tǒng)自帶的程序都不是原生執(zhí)行的。蘋果一直試圖把更多的老代碼逐漸重寫,重寫的過程中引入的問題加重 了Mac OS操作系統(tǒng)的不穩(wěn)定性,因?yàn)镻owerPC完全使用了和68k不同的異常機(jī)制,使得Mac OS漏洞百出。一直到OS 8.5左右,大部分68k代碼被替換為PowerPC代碼,才使得穩(wěn)定性有一定的提高。
但在商業(yè)上蘋果自然會(huì)采取“老王賣瓜自賣自夸”的策略,發(fā)布了一系列的廣告吹捧自己的計(jì)算機(jī)有多強(qiáng)大。這些廣告自然不會(huì)提及Mac OS的穩(wěn)定性,能拿得出手的只有PowerPC這套架構(gòu)的先進(jìn)性。20世紀(jì)90年代的蘋果廣告大多充滿著對(duì)Intel架構(gòu)的尖酸味,例如反映自己比 Intel核心的電腦快上許多,甚至夸張地把Intel的奔騰二說成慢如蝸牛。當(dāng)然了,廣告夸得再好,誰用誰知道,客戶又不是傻子,真正的鐵桿果粉又有幾個(gè)。所以蘋果在Mac OS一系列重寫和修正失敗后決定收購NeXT,把NeXTSTEP當(dāng)作構(gòu)建Mac OS X的基石(見《Mac OS X 背后的故事一》)。
NeXTSTEP遷移至PowerPC
NeXTSTEP 使用的Mach+BSD+DriverKit內(nèi)核支持,屬于類Unix系統(tǒng),其天生具有良好的移植性(這也是當(dāng)年的Solaris及AIX能那么快完成 PowerPC移植的原因)。Unix早年被設(shè)計(jì)時(shí),為了能移植在各種大型機(jī)上,Denis Ritchie特地發(fā)明了C語言并極力減少機(jī)器碼使用比重。后來的BSD系列為了能在各大學(xué)使用,也秉持了當(dāng)初Unix設(shè)計(jì)的態(tài)度,并且盡可能地寫平臺(tái)無 關(guān)代碼。例如現(xiàn)代的FreeBSD分支中,機(jī)器碼占內(nèi)核總代碼的比重差不多為0.6%,而所有跟架構(gòu)相關(guān)代碼在內(nèi)核中才占13.6%左右。這無疑為 NeXTSTEP這樣的BSD分支移植到各架構(gòu)上創(chuàng)造了得天獨(dú)厚的優(yōu)勢(shì)。
NeXTSTEP支持 68K、x86、PA-RISC和SPARC架構(gòu),但頗有意味的是它之前不支持PowerPC架構(gòu)。之前,蘋果曾扶持Linux內(nèi)核作為單一的服務(wù)運(yùn)行在 Mach內(nèi)核上,并把整套操作系統(tǒng)往PowerPC上移植,這就是MkLinux。MkLinux不但為L(zhǎng)inux對(duì)PowerPC的支持作出了巨大貢 獻(xiàn),也為蘋果使用NeXTSTEP掃清了最大的障礙。這些開發(fā)多源于開源社區(qū),但使得蘋果在很早就具備跨平臺(tái)的能力(哪怕跨Intel和PowerPC這 種字節(jié)序完全不同的平臺(tái))。
NeXTSTEP另一個(gè)有趣的內(nèi)核功能是支持稱為胖二進(jìn)制文件的技術(shù)。NeXT公司自己定制的GCC編譯器可以 通過交叉編譯,產(chǎn)生一個(gè)包含所有架構(gòu)可執(zhí)行碼的二進(jìn)制文件。這個(gè)文件可以在一個(gè)特定硬件平臺(tái)上解出該平臺(tái)原生版本的機(jī)器碼執(zhí)行。這個(gè)技術(shù)在Mac OS到Mac OS X的遷移中并沒有被公布,卻成為2005年往英特爾遷移時(shí)的核心技術(shù)之一。
NeXTSTEP有了這兩個(gè)很好的條件后, 往PowerPC的移植并沒經(jīng)歷太多的挫折,并且在前期一度準(zhǔn)備x86平臺(tái)和PowerPC平臺(tái)“兩手抓,兩手都要硬?!?998年的MacWorld 上,喬布斯聲稱Rhapsody最后將成為Mac OS X Server 1.0版。而完整的Unix層代碼后被釋出,成為以Darwin為名的開放源代碼軟件。讀者如果移步 http://opensource.apple.com/,會(huì)發(fā)現(xiàn)即使是在早期的Mac OS X 10.0代碼中也是包含x86支持的。
Intel的捷徑
顯然,Mac OS X支持PowerPC是為了對(duì)老蘋果用戶負(fù)責(zé),但對(duì)于x86平臺(tái)的支持,不能不說Jobs早早地為后來的遷移做好了兩手準(zhǔn)備。的確,在早期,PowerPC這套R(shí)ISC的架構(gòu)確實(shí)比Intel好,無論在速度還是準(zhǔn)確性上。跑分測(cè)試中PowrePC遙遙領(lǐng)先,而且,由于Intel芯片中的數(shù)表錯(cuò)誤,造成其芯片計(jì)算浮點(diǎn)數(shù)運(yùn)算時(shí)在某些場(chǎng)合會(huì)算錯(cuò)。Intel在20世紀(jì)90年代中后期一直力推奔騰4,但由于流水設(shè)計(jì)問題,其性能甚至不如奔騰3。 但Jobs在這時(shí),目光卻看得更實(shí)際、更遠(yuǎn)。
Intel畢竟不是傻子,他們有比別的公司多得多的錢投入研究,所以他們有足夠多的資源去定下五年甚至十年后的目標(biāo)(PBS電視紀(jì)錄片《America Revealed》)。對(duì)于自家芯片各種設(shè)計(jì)上的缺陷,他們自己是損失者,此學(xué)得也比別家更快。例如前面提到,x86不是一個(gè)RISC的芯片,Intel在1995年發(fā)布的Pentium Pro中找到了通往RISC的捷徑,把ISA換為RISC會(huì)破壞x86架構(gòu)的兼容性,所以我的架構(gòu)必須依然使用老指令,但這不代表我的處理器讀入x86指令后,不能翻譯成別的指令。Pentium Pro在取到一條x86指令時(shí),硬件解碼器會(huì)把一條CISC的x86指令解碼成符合RISC風(fēng)格的若干條微指令,因此,除了在起跑線上起跑慢了些以外,在解碼后,Intel芯片執(zhí)行的代碼相對(duì)于PowerPC,技術(shù)上不存在任何劣勢(shì)。指令在暫存器重命名后,通過投機(jī)執(zhí)行繞過風(fēng)險(xiǎn),便能并發(fā)、快速地進(jìn)行亂序執(zhí)行。
Intel是大規(guī)模量產(chǎn),所以對(duì)于每塊芯片的平均造價(jià)要比PowerPC低很多。PowerPC的芯片價(jià)格無疑抬高了Mac電腦的成 本,不但造成Mac用戶的小眾規(guī)模,同時(shí)在Intel大步邁進(jìn)的同時(shí),摩托羅拉卻止步不前。尤其是Intel較早地意識(shí)到了移動(dòng)芯片的重要性,開始對(duì)芯片進(jìn)行節(jié)能優(yōu)化設(shè)計(jì),而PowerPC跑起來就像是個(gè)電暖爐。這使得蘋果發(fā)布的筆記本電腦芯片主頻一直遠(yuǎn)落后于臺(tái)式機(jī),并且在后期其臺(tái)式機(jī)也需要大量泠卻。
這引發(fā)了Jobs和摩托羅拉的CEO Chris Galvin的爭(zhēng)吵(《Jobs傳》)。1997年,Jobs回到蘋果后,曾立即決定停止授權(quán)同類電腦制造商使用麥金塔操作系統(tǒng)。他打電話向Galvin提議, 如果摩托羅拉加速研發(fā)可用于筆記本電腦的芯片,那么蘋果公司可能會(huì)考慮為摩托羅拉破例,授權(quán)其StarMax Mac兼容機(jī)使用麥金塔操作系統(tǒng)。兩人的對(duì)話越來越激烈,Jobs對(duì)高爾文說,摩托羅拉的芯片爛透了。高爾文也是個(gè)有脾氣的人,立即反駁,Jobs掛了他的電話,摩托羅拉從此停止生產(chǎn)StarMax電腦,而Jobs則開始暗中計(jì)劃拋棄PowerPC芯片,轉(zhuǎn)而投向Intel的懷抱。
作者王越,美國(guó)賓夕法尼亞大學(xué)計(jì)算機(jī)系研究生,中國(guó)著名TeX開發(fā)者,非著名OpenFOAM開發(fā)者。
本文選自《程序員》雜志2013年1期,未經(jīng)允許不得轉(zhuǎn)載。如需轉(zhuǎn)載請(qǐng)聯(lián)系 market@csdn.net
聯(lián)系客服