從Intel和ARM爭霸戰,看看做芯片有多難

原文鏈接:https://www.jianshu.com/p/1ac347d0420b

從Intel和ARM爭霸戰,看看做芯片有多難

這幾天中興事件持續發酵以來,各種議論紛紛擾擾。但我觸動最大的,還是碧樹西風寫的這句話:“
一碗牛肉麪,真的要用牛肉,真的要用面,真的要燉很久,這麼簡單的道理,偌大一個國家,這麼多精英,過去這麼多年了,咋就不能懂呢?”

做芯片很難,做核心芯片更難,做需要生態系統的CPU芯片,比大家想象得都要難。本文嘗試談一談x86生態系統和ARM生態系統的艱難發展歷程和殘酷的市場競爭,向大家介紹一下做CPU的各種困難,以及眼下能看到的一線希望。

我儘量寫得輕鬆一些,因爲其實這個話題很有趣,仔細探究起來,很多看似爆炸性的新聞,其實草蛇灰線伏脈千里,在很早之前就發端了,這其中的故事,真的像演義小說一樣好玩。

本文會羅列很多的往事和參考資料,保證有誠意。一些地方沒忍住加上了一些三腳貓的分析,歡迎拍磚打臉。

x86生態系統

如今Intel在服務器市場佔有率近乎100%,在桌面市場也大於80%,再加上Intel一貫重視宣傳,在普通大衆的心目中,Intel就是芯片的代稱,甚至是高科技的代稱。但Intel並非生而如此,它的牛X千真萬確是熬出來的,是在列強環伺的競爭環境中殺出來的。

稱王

七十年代,在搭上IBM PC這趟快車之前,Intel的8位處理器已經很成功,但也有很多競爭者,Zilog是其中翹楚,它研發的Z80系列產品和Intel的8080兼容,性價比高。一直到90年代,中國很多大學的微機實驗課,還在用Zilog的板子。當時還有一款處理器風頭不遜於8080系列,即MOS公司的6502。後來MOS把6502的ISA(指令集架構)授權給了衆多廠商,流傳甚廣。70年代蘋果創立之初的Apple-I和Apple-II,80年代任天堂的紅白機,90年代初的小霸王學習機,90年代末的文曲星,都使用了6502系列的CPU[1]

IBM PC給了Intel和微軟大發展的機會。但它倆必須面對競爭。IBM PC是IBM主導下的一個開放標準,各個零部件都是可以替換的。所以纔有了“兼容機”的概念,和延續至今的裝機市場。當時IBM要求Intel必須把x86指令集授權給其它廠商,避免CPU供應商一家獨大。一份詳細的x86兼容處理器生產廠家列表見https://en.wikipedia.org/wiki/List_of_x86_manufacturers。IBM自己也有生成x86兼容CPU的權力。同時,爲了限制微軟的MS-DOS,IBM自己也做DOS操作系統,名爲PC-DOS。

在IBM PC陣營內部,Intel面對其它CPU供應商的競爭,在陣營外部,還要和蘋果的Macintosh電腦競爭。當時蘋果已經換用Motorola 68000系列CPU,性能強勁,圖形界面誘人。當時用Mac的人,逼格要高於用IBM PC的人。

Intel頂着陣營內外的競爭壓力,苦心孤詣地發展壯大。這時候潛在的威脅在慢慢醞釀。從1981年的RISC-I開始,精簡指令集(RISC)逐步流行起來,誕生了一系列RISC風格的CPU:1985年MIPS公司推出第一款商用的RISC芯片,HP公司在1986年推出PA-RISC,SUN公司在1987年推出SPARC,Motorola在1988年推出MC88000。當時大家普遍認爲RISC優於以x86爲代表的CISC風格CPU,就連Intel和AMD也害怕在RISC潮流中落伍,AMD在1987年推出了AM29000,Intel在1988年推出了i860/i960。

開始時RISC似乎並沒有威脅到桌面市場,MIPS、PA-RISC、SPARC全是用來做服務器和工作站的。被蘋果流放的喬布斯用MC88000系列CPU做NeXT桌面電腦,鎩羽而歸。1986年,英國的Acorn公司推出了一款名爲ARM的RISC處理器,次年,它還配了個操作系統叫RISC OS,強攻桌面市場,可惜最終只在英國掀起來了一些波瀾[2][3]

1991年,RISC陣營實實在在地殺入桌面市場。這一年,IBM看到在PC陣營裏,Intel和微軟這兩個小弟坐大,慢慢不受自己的控制,索性拉攏Apple和在RISC市場不得志的Motorola,推出了PowerPC架構,由IBM和Motorola生產芯片,Apple做操作系統和整機,推出全新的Power Macintosh電腦。這三家組成了AIM(Apple-IBM-Motorola)聯盟,氣勢洶洶地向Wintel聯盟發起攻擊。

結果是Wintel贏了,箇中原因衆說紛紜。有人說Wintel保持對已有軟件的向下兼容,而Apple頻繁更換底層的CPU,導致的不兼容氣走了用戶,然後由此強調軟件生態的重要。我則以爲,歷史的發展有一定的偶然性,如果當時Wintel不是比爾蓋茨和格魯夫在掌舵,而Apple是喬布斯在掌舵,可能結局完全不同。2005年,喬布斯掌舵下的蘋果,把Mac裏面的CPU由PowerPC換成Intel的芯片,就完成得乾脆利落,沒怎麼受到軟件生態的牽絆[4]

總之,在80年代,大家就已經深深懂得CPU的ISA是軟件生態系統的根基,不願讓這個“生態之根”被別人控制。整機和系統的製造商,通過強制CPU廠商給其它廠商授權自己的ISA,來保證有第二家甚至更多的供應商。如果不慎“生態之根”被別人控制了,例如IBM被Wintel篡了權,甚至不惜另起爐竈來競爭。

同樣是把自己的指令集授權給其它廠商,Intel把幾乎所有的其它供應商都擠死了,只省下AMD苟延殘喘;MOS則銷聲匿跡了,完全靠其它生產商把6502系列延續到了二十一世紀。造成這一差異的原因縱有千萬條,我想“打鐵還需自身硬”是最根本的。

霸業

在桌面市場上,Windows 95和Windows 98這兩款操作系統,讓Wintel聯盟登上了霸業的頂端。從1995年到2003年,Intel看起來簡直是不可戰勝的。

與此同時,Intel還把幾乎所有的RISC架構的CPU都幹趴下了,佔領了服務器市場。原因大概有這麼幾點。

第一,從技術角度講,RISC是一種設計CPU的理念,而不是具體的某一種ISA。像x86這樣的複雜指令集,其實在實現過程中,也能借重RISC的理念。1989年的80486,已經隱隱地可以看到RISC風格的流水線,1995年的Pentium Pro,其核心已經是一個亂序執行的RISC了,只不過多了一個複雜的譯碼邏輯,把x86指令拆分成RISC風格的微操作。因此從技術角度講,RISC指令集未必比x86有優勢。

第二,RISC成也UNIX,敗也UNIX。UNIX和C語言樹立了很好的軟件開發傳統,確保同一套代碼可以很方便地在不同CPU之間移植。80年代,一大堆RISC架構的CPU,都可以很快配上自己的UNIX,很快把已有的C語言編寫的應用跑在CPU上,然後就可以賣了。SUN公司的SPARC配有Solaris,HP公司的PA-RISC配有HP-UX,IBM公司的PowerPC配有AIX。這些林林總總的UNIX變體,反過來又進一步促使UNIX生態系統中軟件開發人員重視代碼的可移植性,大家都很小心地圍繞POSIX標準來編程,避免過分依賴於某個操作系統獨有的功能。這樣,一旦Intel芯片攜Linux(一種開源的UNIX變體)來和RISC架構的工作站競爭,軟件應用就紛紛以很小的移植難度,離開了昂貴的專有UNIX工作站。

第三,當時PC市場比服務器市場大得多,Intel在PC市場的盈利幫助它研發更好的服務器芯片,巨大的出貨量降低了芯片的製造成本。研發優勢和成本優勢,奠定了Intel最終勝利的基礎。

這段時間,Intel還幾次面臨挑戰,每次都成功保衛了自己對於生態系統的掌控權。

第一個挑戰,來自Internet瀏覽器。Netscape Navigator誕生後,對微軟和Intel都是挑戰。雖然當時的動態網頁還非常初級,但是已經有人喊出“Web is the computer”的概念。等到Java Applet出現之後,大家更是覺得可以在網頁上實現桌面應用的效果,未來只需一個瀏覽器,就能取代桌面。Netscape的Marc Andreessen在1995年,就着手把Netscape瀏覽器打造成一個Internet OS[5]。以那個時代的軟硬件水平,毫無疑問地,這些嘗試失敗了。

用一個高層次的軟件API,兜住所有的上層應用,然後讓底層的硬件,都來支持這個API——這個主意不單單在技術上看起來很炫,從商業上,這是上層應用廠商消解底層平臺廠商生態霸權的終極武器。因此,在那之後的二十年裏,商業上的嘗試一直在持續,包括:

  1. 騰訊開發的WebQQ和Q+,在網頁裏面提供一個類似Windows桌面的應用場景,後來失敗了,回退到功能單一的SmartQQ。箇中原因,我個人認爲還是那個時代的PC性能不夠。
  2. 騰訊開發的微信小程序,在微信裏面通過HTML5和Javascript實現手機App的功能,可以橫跨iOS和Android。
  3. 谷歌推出ChromeOS和ChromeBook筆記本,裏面跑的應用,全都是基於HTML5和Javascript的。

我個人認爲,微信小程序幾乎一定會成功,它一旦成功,騰訊必然會重燃在PC平臺上做Q+的野心。Intel在桌面的霸權,最大的威脅不是AMD,也不是ARM,而很可能是HTML5+Javascript,熟悉“降維打擊”的人,對此不會感到意外吧。

第二個挑戰,來自虛擬機(Virtual Machine)和JIT(Just-in-time)編譯器。先鋒是Java的虛擬機JVM,後來微軟也推出了DotNet虛擬機,支持C#等語言。虛擬機有一套虛擬的指令集,源代碼先被編譯到這個虛擬的指令集上,在程序運行時,JIT編譯器再把這套虛擬指令集編譯爲CPU的原生指令集。面向虛擬機開發的程序,例如Java Applet,可以在不同的CPU和操作系統平臺上運行。

如果有某個虛擬機,它的指令集可以無縫支持所有的編程語言,還能保證高效率,那麼所有CPU的都將被OTT(over-the-top)了,就像短信被微信OTT一樣。可惜還沒有一個虛擬機可以實現此目標。現在大家熟知的虛擬機,都是和語言綁定的,例如JVM只支持Java、scala、kotlin等;DotNet虛擬機只支持C#、VB.net等;V8只支持Javascript、typescript等;HHVM只支持PHP。同一個VM上跑的語言相互調用很容易,跨VM很難互操作。由於虛擬機實在太多了,它們反而成了新的CPU架構的攔路虎:80年代只需要搞定C語言編譯器就能賣Unix工作站,如今ARM服務器要想挑戰Intel,必須把所有這些基於VM的編程語言都支持得很好,JIT編譯器的效率都要做得比較高才行。

第三個挑戰,來自Transmeta公司對x86指令集的Emulation(Emulation這個詞很難翻譯,索性不翻了)。簡單地說,Emulation就是把x86指令集看成一個虛擬機的指令集,然後用類似JIT編譯器的技術,在非x86的CPU上跑x86的程序。未經許可用別人的ISA做CPU是違法的,但用Emulation的方式實現ISA則不違法(Intel和Transmeta只打過專利的官司沒打過ISA的官司,Intel還輸了[6])。如今最廣爲人知的Emulator是Qemu,上文提到的x86、MIPS、PowerPC、Sparc、MC68000它都可以支持。一般而言,Emulation會導致性能下降一個甚至若干個數量級,根本不足爲慮。

1995年,Transmeta公司成立,經過艱苦的祕密研發,於2000年推出了Crusoe處理器,用Emulation的方式,在一款VLIW(超長指令字)風格的CPU上執行x86的程序,這樣就規避了沒有x86指令集授權的問題。Transmeta的牛逼在於,雖然是Emulation,但實現了接近Intel處理器的性能,同時功耗低很多。2000年年底Transmeta的IPO大獲成功,其風光程度,直到後來谷歌IPO的時候才被超過[7]

Transmeta最後還是失敗了,Intel在渠道上打壓它是次要原因,性能不足是主要原因。雖然VLIW在90年代中後期被廣爲推崇,但事實證明,它的性能比起亂序執行的超標量架構,還是差一截。另外Transmeta的芯片是在臺積電製造的,那個時候不比現在,臺積電的工藝水平比起Intel還差很多。2000年的時候,PC還遠沒有性能過剩,性能還是比功耗重要。等到2010年,Intel的Atom處理器慢得一塌糊塗,依然靠着低功耗,點燃了上網本的大火。

Transmeta雖然失敗了,Emulation技術仍然在發展。NVidia在2008年購買了Transmeta的低功耗技術的授權。2014年,NVidia推出了Tegra K1芯片[8],其中的Denver處理器,利用Emulation技術,在底層的7路超標量架構上,實現了ARM64指令集[9][10]。值得注意的是,NVidia擁有ARM64的指令集的授權,它不是用Emulation技術來規避什麼,而是用Emulation來提升性能,實現比硬件直接執行還要高的性能。根據評測結果,Denver超過了當時蘋果最好的手機CPU[11]。近期推出的Denver2處理器的,性能更是秒殺蘋果的A9X和華爲的麒麟950[12]

Emulation技術如果真的發展到了比直接執行還要快,Intel的麻煩纔剛剛開始。微軟聯合高通,推出基於SnapDragon835處理器的筆記本,運行Windows 10操作系統[13],上面可以安裝x86的軟件。Intel雖然很不爽,但Emulation並不需要指令集授權,所以他只能警告說,在實現Emulator時,不許侵犯Intel的專利,而這一點,微軟和高通肯定早已考慮到了[14][15][16]

挫折

x86生態系統曾經面對過一次最嚴重的、近乎滅頂之災的挑戰。這次挑戰來自於誰?就來自於它的締造者Intel。

Intel心不甘情不願地把自己的x86指令級授權給了AMD等一衆供應商,眼睜睜看着他們分享自己的利潤,很不爽,於是想在x86之外另起爐竈,建設自己獨享的生態系統。正巧在90年代初期,升級64位計算成爲一個風潮,1991年有MIPS R4000,1992年有DEC Alpha,1995年有SUN SPARC64。1994年開始,Intel聯合HP,準備趁32位升級64位的時機,拋棄原有的x86架構,新推出一個EPIC(Explicitly Parallel Instruction Computing)架構,名爲IA64(Intel Architecture 64-bit)[17]

x86架構兼容老舊應用程序的能力是出了名的。8086把8位的8080升級爲16位的時候,80386升級到32位的時候,都完全兼容舊有的程序。直到今天,Intel的處理器依然支持虛擬8086模式,在此模式下,可以運行30多年前的8086程序。升級到64bit的時候,Intel居然要放棄所有之前的8位、16位、32位應用了!可想而知當時在業界會引起怎樣的軒然大波。Linux的締造者Linus Torvalds公開對此表示反對[18]

IA64進展得並不順利,EPIC本質上就是一種VLIW,如前所述,VLIW的性能比亂序超標量要差。而且EPIC的編譯器非常難以開發。原定1997年就會推出產品,但直到1999年才發佈IA64指令集,2001年才推出產品[19]。另外Intel也不敢完全放棄之前的32位x86應用,它給出的解決方案是Emulation,但EPIC不像Transmeta爲Emulation做了很多專門優化,跑32位x86應用的性能很差。

這個時候,千年老二AMD站了出來,爲x86續命。2000年,它推出了AMD64指令集,延續了x86架構兼容老舊應用程序的優良傳統,可以原生執行8位、16位、32位的老程序。2003年,AMD推出Opteron服務器CPU和Athlon64桌面CPU[20][21][22]

AMD64從技術上和生態上都壓了IA64一頭,Opteron在服務器市場上爲AMD贏得了前所未有的成功。2004年,Intel推出了代號爲Nocona的至強服務器CPU,它支持一種稱爲EM64T的技術,EM64T就是AMD64的馬甲。江湖有傳言說,Intel曾想提出另外一套不同於AMD64的x86升級64位的方案,但微軟爲了避免x86生態的分裂,極力阻止了。2012年,Intel推出了最後一代IA64的CPU,關閉了這個不賺錢的產品線。

回顧這段歷史,有幾點特別令人感慨。首先,即使是看似無比強大不可戰勝的Intel,不顧生態系統中其它夥伴的利益,一意孤行也是會撞南牆的。其次,幸好由於歷史的原因,x86生態中,AMD和Intel是交叉授權的關係,AMD有權加入3DNow這種多媒體擴展指令,也有權加入64位指令,如果是像如今ARM的架構級授權方式,被授權的企業不能自行加以擴展,那可能還真沒有辦法阻止Intel了。最後,Intel的執行力還真是超強,掉頭極快,EM64T的CPU只比AMD64的CPU晚出了一年(當然不能排除Intel早就有備份方案)。

雖然在IA64上栽了跟頭,但Intel靠着自己的技術實力,持續不斷地推出性能和功耗表現更好的產品,AMD在64位戰役中所取得的優勢,慢慢也被消磨掉了。

歲月如梭。進入移動互聯網和雲計算時代之後,服務器的需求量上升。這時RISC架構的服務器CPU幾乎快被消滅乾淨了,只剩下IBM Power奄奄一息。於是Intel幾乎獨享了服務器市場擴大所帶來的紅利。但它卻高興不起來,因爲移動市場形成了ARM一家獨大的局面,移動終端CPU這個市場,Intel怎麼也擠不進去。

正巧Intel在剛剛火過一把的上網本市場裏設計了一種低功耗的x86核心,即Atom。Intel以Atom爲武器,殺入了手機芯片市場。2012年,Intel的老夥計聯想,推出了第一款Intel芯片的手機K800[23]。緊接着還有Motorola的XT890。2013年,中興、華碩也有產品問世。但三星、小米、華爲、OPPO、VIVO等出貨量大的廠商,都沒有采用Intel的芯片。這些手機大廠,看看x86生態中做整機的聯想如何艱難度日,估計心裏也是一萬個不樂意讓Intel到移動領域來繼續稱王。

到2014年,Intel芯的手機還是沒有打開局面,市場唱衰之聲一片[24][25]。但Intel並不想放棄[26][27]。手機攻不下,那就攻平板!大廠攻不下,那就攻白牌!嫌我的芯片貴,我就給補貼!又過了兩年,平板也沒有攻下來。在移動市場賠了上百億美金的Intel,黯然離場[28][29]

Intel失利的原因衆說紛紜,我覺得根本原因還是競爭力不足。首先,這個時候的臺積電已經不是Transmeta家Crusoe芯片誕生時的吳下阿蒙,它生產的手機芯片的功耗和性能並不輸給Intel;其次,這次Intel並無生態系統的優勢,要靠名爲houdini的Emulator來執行ARM指令集的程序[30],性能打了折扣。試想,Intel芯的手機如果性能和待機時間都是iPhone的兩倍,誰能抵擋得住這種誘惑?

幾乎在進攻移動市場的同時,Intel也在推出產品試水物聯網市場,只不過沒有大舉宣傳。2013年10月,Intel推出一款叫做伽利略的Arduino開發板[31],上面的CPU叫做Quark(夸克)。Quark是比Atom(原子)還小的基本粒子,這個名字暗含着輕巧、低功耗的意思。接着,Intel在2014年的CES大會和2016年的IDF大會上,先後推出了升級的愛迪生和焦耳開發板。

Intel的大名和Arduino聯繫在一起多少有些奇怪。Arduino是一套可以跑在低端MCU上的C語言函數庫,是電子創客們的最愛。淘寶上Arduino開發板才幾十塊錢。焦耳開發板上的處理器是4核心、1.5GHz,跑Arduino太浪費了。和它參數近似的Raspberry PI 3 Model B+開發板,四核64位ARM Cortex A53跑1.2GHz,淘寶價不到200塊。焦耳開發板要369美元。誰會當這個冤大頭[32]

物聯網市場極度分散,有無數應用但規模都不大,Intel賺大錢習慣了,在這個微利又需要貼近客戶做服務的市場裏,百般不適。2017年,Intel悄悄停產了針對物聯網市場的開發板[33][34]

Intel接下來所可能面對的挫折,是ARM侵入服務器和桌面領域。這個話題下文還會有簡單分析。

ARM生態系統

近幾年ARM風光無限,搶新聞頭條的能力不遜於Intel。在很多圈外人看來,這家高科技公司好像是在移動互聯網時代新冒出來的,但其實它的歷史和幾乎和80286一樣古老。而且它自誕生以來,就以移動(portable)設備爲自己首要的目標市場。它等待一飛沖天的風口,等待了二十年。

發端

前文提到,ARM是Acorn電腦公司創造的。Acorn電腦公司創立於1978年,在80年代初,它用6502系列CPU製造的BBC Micro電腦在英國大獲成功。6502的性能慢慢跟不上時代了,Acorn想基於80286開發新的電腦,但是Intel連樣片都不給——要是Intel大方些,ARM或許根本就不會誕生。Acorn一氣之下開發了ARM(Acorn RISC Machine),這是世界上第一款定位中低端(而非服務器)RISC處理器[35]。1985年,ARM1誕生(但從未被商用),後來Acorn在1986年和1990年分別推出了ARM2和ARM3,1987年推出了RISC OS和桌面電腦Archimedes。它在英國的教育市場獲得了一定的成功,但1990年之後,很快被Wintel的生態擊敗了[36]

1990年前後,研發掌上電腦成爲一股風潮。當時有家叫做Active Book的公司,拿ARM2處理器開發一個叫做Personal Communicator的產品[37]。可惜產品上市前,Active Book被AT&T收購了,AT&T把ARM2換成了自家的Hobbit處理器。幸好東方不亮西方亮,當時的蘋果公司看好ARM,把自己研發的Newton平臺中的處理器,由AT&T的Hobbit,換成了ARM。這個“彼此互換”的故事聽起來讓人頭大,大家只需要記住,ARM的第一顆商用處理器ARM2,就曾被嘗試拿來做手持的電腦。

ARM的東家是Acorn,和蘋果在電腦市場上有競爭。蘋果公司花了6周時間說服Acorn把ARM獨立出來運營。1990年11月27日,合資公司ARM正式成立,蘋果、Acorn和VLSI分別出資150萬、150萬、25萬英鎊,Acorn把ARM處理器相關的知識產權和12名員工放在了新成立的公司裏。此後,ARM的縮寫被轉而解釋爲Advanced RISC Machine。爲了節省成本,新公司在劍橋附近租了一間穀倉作爲辦公室,全力爲蘋果的Newton研發ARM6處理器(4和5這兩個編號被跳過去了)。

Newton(牛頓)是蘋果花大力氣研發的觸屏移動技術平臺,Newton OS是不同於Mac OS的操作系統(如同後來的iOS)。如果你聽過蘋果、牛頓和萬有引力的故事,應該能體會蘋果公司對Newton平臺有多麼高的期望。Newton平臺的第一款產品MessagePad於1993年8月上市了,採用32位ARM610處理器,頻率爲20MHz,屏幕大小爲336×240,重量410克,採用4節7號電池供電,售價699美元(相當於今天的1129美元)。可惜的是,它銷量很差,上市頭四個月的銷量不過5萬臺[38]

1998年,中國的恆基偉業公司推出了一款叫做 “商務通”的產品,像極了Newton Messagepad。它採用Dragonball處理器[39],主頻僅16MHz[40],屏幕大小10漢字x10漢字,重量105克,採用2節5號電池供電,售價人民幣1988元。靠着“呼機手機商務通,一個也不能少”的廣告,商務通在1999年大賣100萬臺[41]。雖然2001年後商務通及類似產品很快就被越來越強大的手機擠出了市場,但讓人好奇的是,背靠營銷能力更加強大的蘋果,Newton爲何沒能一炮而紅?

其中一個重要的原因是,Newton重點宣傳的手寫識別功能表現很糟糕。而商務通對手寫漢字的識別率——根據我個人的體驗——還真是不錯,考慮到它僅僅16MHz的CPU主頻,能做到這麼好簡直是奇蹟。當時商務通部分型號的賣點就是“連筆王”[42],對潦草的漢字識別得相當好。

軟件對於一款產品的重要性,真的是生死攸關啊!

深耕

扯遠了,讓我們回到ARM的故事上來。

1990年ARM創立之初,給自己定下的使命是“設計有競爭力的、低功耗、高性能、低成本的處理器,並且使它們成爲目標市場中廣爲接受的標準”,目標市場包括:手持設備(Portable),嵌入式(Embedded Control)和汽車電子(Automotive)。跨越近三十年,這個使命和市場定位始終未變,直到今天。

而且,根據我瞭解到的知識,ARM是處理器的源代碼授權這一商業模式的開創者。如今,芯片設計從Verilog等源代碼出發,經過一系列自動化或半自動化的優化步驟,最終形成工廠製造芯片所需要的版圖文件;整個過程類似軟件從源代碼被編譯爲CPU的機器碼。但在80年代,芯片的設計自動化非常原始。七八十年代的處理器授權,都是指令集的授權。Synopsys公司於1986年成立,1987年推出把Verilog編譯爲門級網表的DesignCompiler[43],之後基於源代碼的芯片自動化設計流程才慢慢地被建立起來。於是源代碼授權才成爲技術上可行的模式。

ARM從未自己生產過商用的芯片。它只是將自己研發的處理器的源代碼的知識產權(IP)授權給芯片廠商,由它們推出最終芯片。受益於這一商業模式,儘管在1993年,Apple的Newton失敗了,但ARM並未因爲設備賣不出去而虧錢,還幸運地拿到了TI的訂單[44],於是成功盈利了。員工數量也由12人增長到了42人。次年ARM又拿到了三星的訂單,員工增長到70多人,搬出了穀倉。除了源代碼授權的模式之外,ARM也做指令集授權,1995年,ARM把指令集授權給DEC,DEC很快設計出了性能更好的StrongARM處理器[45]。1997年,StrongARM產品線被賣給Intel,更名爲XScale。

1995年,Motorola在香港的研發團隊基於MC68000指令集開發出了針對手持設備的DragonBall處理器,在這之後的十年,DragonBall處理器一直都是ARM強大的競爭對手[46]。不但Moto自己的手機用它,Palm、三星、Sony的手機也用它。當然還有前文提到的商務通。ARM相對於Dragonball處理器有什麼優勢?我認爲最大的優勢是從客戶需求出發的、持續的創新;其次是ARM的開放的商業模式。

RISC指令集一般都採用32位定長指令,代碼密度比起x86之類的CISC來要差一些,但手機的存儲空間有限,對代碼密度的要求高。1994年,ARM爲此專門研發了16位的指令集Thumb,以及支持這一指令集的ARM7TDMI[47][48]

開放授權的商業模式,使得整機廠在選擇芯片時,可以找到支持同一指令集的多種芯片產品,不容易被綁架。Nokia作爲和Motolora旗鼓相當的手機制造商,肯定不會選擇競爭對手的Dragonball,而ARM的技術實力和商業模式,正好符合Nokia的需求[49]

1997年,Nokia推出了一代經典6110,它採用TI的芯片,處理器核心是ARM7TDMI[50][51][52]。6110是Nokia第一款帶紅外接口的手機,第一次內置了經典的貪喫蛇遊戲,它的界面成爲了之後Nokia手機的標準。從此,Nokia和ARM成爲了好基友,Nokia的Symbian操作系統,一直都建立在ARM架構的基礎上[53]

1998年,趁着6110大紅大紫的東風,ARM在Nasdaq上市了。同一年,SGI公司看到處理器IP授權生意有利可圖,把MIPS部門拆分出來,次年MIPS推出了它第一款可授權的處理器設計M4K[54]。此後的十年裏,MIPS一直都是ARM有力的競爭對手[55]

商務通在中國流行的那幾年,國際市場上流行性能更高的掌上電腦和智能手機,操作系統包括Palm OS、微軟的WinCE、Nokia的Symbian、RIM的Blackberry OS,Motorola的Wisdom OS。在這個領域裏,ARM陣營中負責高性能的XScale大放異彩,暴擊Dragonball。當Dragonball的頻率還停留在33MHz/66MHz時,Xscale已經飆到了200~400MHz。MC68000指令集在手持設備領域敗走。Palm OS的1.0~4.0都是基於MC68000指令集的,5.0就換成了ARM。後來Motorola的半導體部門Freescale乾脆推出了基於ARM核的iMX系列產品,替代Dragonball產品線。

蘋果作爲掌上電腦的先行者,卻在這次浪潮裏無所作爲,在Wintel的擠壓下,它的桌面業務都已經瀕臨絕境,無暇顧及其它市場了。1997年,不溫不火的Newton從蘋果公司獨立了出來。當喬布斯迴歸蘋果之後,又火速把Newton收編了回來,並且乾淨利落地停掉了Newton產品線——喬幫主只想要Newton手裏的ARM股份。1998年到2003年,蘋果通過出售ARM的股票獲利11億美元。這筆錢,是喬布斯復興戰略的重要燃料,可以說是蘋果的救命錢[56][57]

綻放

經過多年的深耕,ARM在新世紀開始時,已經是手機領域裏的王者,依然在爲客戶的需求做着持續的創新,Java加速技術就是一個典型的例子。

從2000年開始,功能手機的性能提升到了足夠高的水平,人們希望在手機上玩比較複雜的遊戲,而不僅僅是貪喫蛇。但是手機的處理器和操作系統實在是太分散了,爲了方便遊戲跑在不同手機上,J2ME平臺應運而生[58]。從原理上講,J2ME和Applet並無不同,都是基於JVM的。Java在並不分散的桌面領域沒有獲得成功,但在分散的手機領域獲得了成功。

J2ME的遊戲越做越複雜,但手機的處理能力畢竟有限,桌面和服務器上的JIT編譯器在手機上跑得太喫力了。於是ARM在2001年推出了ARM926EJ-S處理器,它支持Jazelle DBX技術,可以直接解碼和執行Java的字節碼,省掉了JIT編譯器的負擔[59][60]。這一功能大受歡迎,幫助ARM9系列成爲了迄今最受歡迎的ARM處理器,總共有250多個授權廠家,其中100多個授權的是ARM926EJ-S[61]

在MTK助推山寨功能機火遍神州的那幾年,主控芯片所使用的核全部都是ARM9[62]。在iOS和安卓的應用商店誕生之前,功能手機全靠J2ME開發的應用來實現各種炫酷的功能。從某種意義上講,在低端市場上,Jazelle是助力山寨機火爆的最大幕後功臣。

然而高性能ARM芯片的扛把子XScale,卻被Intel於2006年6月賣給了Marvell。這是Intel實施x86-everywhere戰略的一個步驟。Intel希望x86的生態也能進入到低功耗的移動領域,而不是用自己先進的工藝製程和設計能力幫ARM建設高端應用的生態。22個月之後,2008年4月,低功耗的Atom芯片誕生了[63]

高性能ARM芯片的扛把子換成了蘋果。2004年,在賣光ARM股票的一年之後,喬布斯決定研發iPhone。2007年1月,在Intel放棄ARM之後僅半年,iPhone誕生了。蘋果可不會採用低端市場上死守ARM9那種玩法,iPhone一代就採用了400MHz的ARM11;2009年的iPhone 3GS,升級爲600MHz的Cortex A8;2010年的iPhone4,蘋果自研的A4芯片升級爲1GHz的Cortex A8。接下來蘋果自研芯片性能一路狂飆的歷程,大家都很熟悉了。

從ARM6到ARM11,這些IP核都是按照兼顧移動設備、汽車電子和嵌入式這三個市場的思路來設計的。從2003年起,ARM把產品線有針對性地劃分爲A、R、M三個系列,分別對應上述三個市場,而且IP核的名字都統一加上了Cortex的前綴。Cortex A8就是A系列的第一個作品。iPhone 3GS和iPhone4令Cortex A8大火,但讓ARM一飛沖天的推手,卻是iPhone的競爭對手——安卓(Android)。

有很多文章介紹安卓如何誕生,如何在移動設備領域幹掉了除iOS之外的全部對手,毋須贅述。這裏只想強調一個被普遍忽略的事實:安卓從誕生之初,就要求應用程序採用Java編寫,並且跑在Dalvik虛擬機上;但iPhone上的應用,都是原生的ARM程序。要知道Android手機的處理器性能相對iPhone並無優勢。山寨之王MTK於2009年2月推出的首款智能手機芯片MT6516,採用406MHz的ARM9;2008年~2010年間由HTC推出的那幾款賣得很好的Android手機,也無非是ARM11和Cortex A8的核,幾百兆的頻率,這種級別的處理器跑虛擬機還是蠻喫力的。另外虛擬機佔用內存大的缺點,也不利於用戶體驗和降低成本。

谷歌寧可冒着讓安卓出師不利的風險,也要推廣Dalvik虛擬機。這是爲什麼?谷歌內部的決策過程我們無從得知。一個合理的猜測是,谷歌不願看到手機領域裏ARM一家獨大,它希望給MIPS、x86等其它CPU一個機會。J2ME的成功,讓谷歌看到完全建立在虛擬機上的手機應用生態,是完全可能的。Dalvik虛擬機可以跑Java,但並不採用JVM那種基於堆棧的字節碼,而是改用一種基於寄存器的方案。這麼做當然是爲了規避SUN公司(後被Oracle收購)的專利,同時也讓無法直接運行JVM字節碼的MIPS、x86能夠實現輕量級的JIT編譯器,無須Jazelle這樣的技術。從另外一個角度講,MIPS在電視、機頂盒、遊戲機市場上佔優,x86在桌面市場近乎壟斷,支持它們,也意味着安卓有可能進軍電視和桌面。

安卓對所有CPU而言,都是巨大的機會,誰抓住了這個機會,就可以一舉改變競爭格局,實現霸業[64]

只可惜MIPS公司太不給力,一直也沒有搞定靠譜的MIPS版Android。等到2011年1月,Synopsys公司給自家的ARC處理器移植好Dalvik虛擬機和瀏覽器用的V8虛擬機[65][66]、Android環境已完備的時候,MIPS都還沒動靜。順便說一句,Intel曾經的南橋芯片裏都有ARC處理器,它是Active Management Technology(AMT)的重要基石[67]

這個時候,北京的君正公司坐不住了。君正靠做低成本的MP4播放器起家,2011年5月在創業板上市[68]。君正擁有MIPS的架構級授權,對自己研發的XBurst處理器非常自信,準備靠它進攻手機和平板市場。2011年7月,基於君正JZ4760的MIPS智能手機通過Android兼容性測試[69][70]。2011年12月,基於君正JZ4770平臺的平板電腦,被谷歌選爲Android4.0的首發產品,一時風光無限[71][72][73]

ARM的強大軟件生態此時起到了護城河的作用。基於君正的平板,軟件兼容性出了問題。原因在於谷歌沒有強求所有的應用都跑在Dalvik虛擬機上,對於部分對性能有苛刻要求的app,例如遊戲,谷歌允許用CPU的原生指令集來開發,爲此還提供了NDK(Native Development Kit)。對於那些包含了ARM原生指令的遊戲,君正的平板要麼不支持,要麼用emulator支持,總之用戶體驗都不好。

ARM生態圈裏,在2011年,正好有兩家芯片廠商異軍突起:全志和瑞芯微,它們分別推出了採用Cortex A8處理器的A10芯片和RK2918芯片,成本極低,主打平板和安卓電視盒子。君正的平板夢被它們粉碎了,之後只好轉戰安卓手錶,消沉了很多年。對於MIPS而言,還有一個壞消息是,在它們的強力助推下,電視盒子市場也成了ARM的天下。經營不善的MIPS於2012年賣給了Imagination[74],Imagination不但沒能依靠MIPS在CPU市場中有所作爲,反而在GPU市場裏也敗給了ARM,在2017年被迫整體賣身,MIPS業務賣回給了硅谷公司。

2012~2016年,Intel在安卓市場上挑戰ARM,也失敗了。於是安卓給CPU帶來的紅利,全部被ARM喫掉了。隨着手機越來越重要,ARM也越來越重要,它所推出的最新的Cortex A系列處理器,被手機芯片爭相採用。ARM生態也越來越強大,它的觸角,慢慢伸出了手機領域。

滲透

2011年1月,微軟在CES宣佈要爲ARM架構開發Windows 8 RT操作系統[75]。在2012年年底,幾乎和Intel芯手機上市的同時,包括微軟自家的Surface RT在內的一大批二合一平板設備上市了。Windows 8 RT不支持所有之前爲x86平臺開發的應用程序,這成爲它最大的軟肋,相關的產品慢慢銷聲匿跡了。ARM滲透桌面市場的第一次嘗試失敗了。

最近微軟和高通所推出的ARM芯的Windows 10,吸取了教訓,用Eumlation的機制來支持舊有的x86桌面程序。這次嘗試能否成功,我們拭目以待。

2009年,ARM推出了Cortex A9處理器,並且用40nm的工藝製造了雙核的樣片,跑到了2GHz[76]。這是ARM第一次推出亂序超標量的處理器核,而亂序超標量是Intel實現高性能的關鍵技術,這是非常振奮人心的消息。2010年,Marvell推出了1.6GHz的4核A9的服務器芯片Armada XP[77]。2013年,這款芯片被部署在百度的存儲服務器上,這是ARM服務器第一次大規模商用。但Marvell並未繼續推出新的服務器芯片[78]。2011年,一家創業公司Calxeda採用Cortex A9,推出了共有480個CPU核的ARM服務器[79]。但它的成就還不如Armada XP,2013年公司就倒閉了[80]

2012年,AMD收購了一家做高密度服務器的廠商SeaMicro[81],準備把它所採用的CPU核由Intel的Atom換成ARM架構的CPU。但直到2014年AMD才推出8核Cortex A57的服務器芯片Opteron A1100[82][83],之後從來也沒有認真賣過它。2015年AMD就放棄了SeaMicro這個子品牌,不再做高密度服務器了[84]

ARM進攻服務器市場的第一次嘗試失敗了。Marvell和Calxeda都採用的是32位的ARM核,先天不足;AMD則三心二意,畢竟自己還有x86 Server的生意。另外服務器市場對於單核單線程的運算能力也有很高的要求,僅僅有低功耗和高通量(high throughput)是不夠的。

在ARMv8這一64位指令集發佈之後,Cavium和AppliedMicro這兩家老牌網絡芯片廠商不約而同地將自己原先芯片中的架構換成了ARMv8[85][86]。因爲產品的需要,Cavium和AppliedMicro都有自行設計處理器微架構的能力,前者做MIPS處理器,後者做PowerPC處理器。它們兩家做ARMv8處理器時,也都採用了只授權指令集,微架構自研的模式。Cavium共推出過兩代基於ARM的產品(2014、2016年),AppliedMicro推出過三代(2013、2015、2017年)。隨着產品性能逐漸接近Intel的Xeon E5[87][88],它們漸漸不再滿足於原先的網絡領域,開始覬覦服務器市場。

最讓人期待的還是高通的Centriq芯片,2015年年底量產24核版本,2016年年底量產升級48核版本[89],還得到了微軟的強力支持[90]。考慮到高通還和貴州成立了合資公司華芯通[91],Centriq很可能成爲在國內大規模商用的第一款ARM服務器芯片。

另外具有國防背景的天津飛騰公司,也有ARM服務器芯片的產品[92],只是不知道這些產品何時能在通用市場上鋪貨。

其他確定在研發ARM Server芯片的大廠還包括Broadcom[93]和華爲[94],進度上要略慢一些。

ARM陣營對服務器發起的第二波衝擊,陣容要強大得多豪華得多。因此ARM纔敢於宣稱,在2021年拿下25%的服務器市場份額[95]

要做好Server CPU,ARM架構還有些功課要一點一點補。多Socket服務器所需要的一致性協議,業界剛剛取得共識準備採用CCIX[96],但還沒有具體的產品出來。做雲端虛擬機所必備的虛擬化支持,ARM還有些性能問題[97]。x86處理器提升Throughput的利器超線程技術,ARM陣營尚不能支持。Intel芯片近年來陸續增加的安全特性[98][99][100][101],也夠ARM追趕一陣子的。但目前看來,ARM已經沒有致命的短板,蠶食掉Intel的服務器市場份額是板上釘釘的事情,唯一的懸念是究竟多少份額?

未來ISA將不那麼重要

從長遠看,半導體廠商對建立於ISA之上的生態系統的掌控力會變弱,而ISA本身,會變得越來越不重要。這是軟件技術發展的趨勢決定的,如前所述,這些技術在90年代末就已經初有小成了。

第一是Web技術。網頁開發領域,有一個大家視若無睹的奇蹟:最後居然只有Javascript一種開發語言屹立至今。要知道在服務器端和移動App領域,開發語言多如過江之卿。其中原因我也分析不出。反正js的挑戰者(微軟的VBScript和谷歌的Dart)都失敗了。網頁開發領域面臨的主要問題是瀏覽器差異大,API不太兼容。這個問題慢慢在緩解中,一來瀏覽器戰爭大局已定,Android和PC上的Chrome,以及iPhone和Mac上的safari是勝者;二來很多網頁應用是跑在App裏面的,例如微信和支付寶裏,這種場景下Javascript的API已經被特定廠商規範過了。

由於開發語言和API的高度統一,H5(HTML5+Javascript)已經成了兼容所有硬件的最通用的軟件開發平臺。曾經有人鼓吹H5會趕走移動端和PC端的原生程序,後來被打臉了。但是移動端和PC端的原生App中,越來越多的界面是用H5生成的了,微信、支付寶、京東、淘寶、愛奇藝、有道詞典……,統統都是這樣。

Javascript吞噬一切的進程還在持續。2007年,Stack Overflow的聯合創始人Jeff Atwood曾經提出過一條Atwood定律[102][103]:任何能夠用JavaScript實現的應用系統,最終都必將用JavaScript實現。十年過去了,此定律基本奏效。把Javascript的一個子集當作彙編語言的asm.js及其後續的WebAssembly,更加使得網頁應用有媲美原生應用的潛力,在瀏覽器裏跑Unity3D的遊戲都不是問題。

獨立的應用程序仍然會是移動和桌面端的主流,因爲沒有獨立程序,不方便做彈窗廣告,不方便啓動後臺進程收集用戶信息,不方便引誘用戶安裝其它獨立程序。但Web的能力的確在快速提升,Web Component技術實現了類似GUI庫的Widget複用,如今在瀏覽器裏實現Office和IDE的功能都毫無問題(office365.com、docs.google.com、editor.construct.net、騰訊文檔[104]);而WebGL已經能支持Unity3D這種大型遊戲框架。照此趨勢發展下去,獨立應用程序僅僅會作爲一個包裝而存在,開發者寫一套H5,加上不同的包裝,就成了PC、Mac、Android、iOS上的獨立應用程序,不加包裝,就是網站。微軟去年開源的ReactXP[105],就是爲了實現這一目標。

這意味着什麼?不但底層的CPU被OTT了,操作系統也被OTT了。因爲移植一個應用程序到各個平臺上,幾乎沒有什麼難度。誰將是生態系統的掌控者?若干個超級App,像微信、QQ、支付寶這樣的。它們不但包裝自家的應用,其它開發者也可以把自己的應用放在這個包裝裏面,借重超級App的廣泛覆蓋度,抵達最終用戶。前文提到了,如果微信小程序獲得成功,騰訊必然會重拾Q+的野心,把QQ變成桌面上各種H5應用的App Store。

如果真的會這樣,微軟豈不是會比Intel還着急?拜託,微軟已經不是二十年前主要靠賣Windows和Office的光盤賺錢的那家公司了,未來它會專注於雲計算[106]。但Intel還和二十年前一樣在賣芯片。

第二是編譯技術尤其是虛擬機的發展。如今的編程語言太多了,80年代那種搞定C語言編譯器就OK的好日子早已過去。任何一個新CPU架構要想在移動、桌面、服務器市場站穩腳跟,都得搞定無數的編譯器(包括虛擬機用的JIT編譯器),這是個壞消息。但好消息是,搞定這些編譯器基本就差不多了,不用勸說開發者重寫彙編代碼。

老一代程序員對x86處理器架構和彙編都非常熟悉。求伯君當年開發WPS時,手寫幾十萬行彙編[107];雷軍讀本科時,是系裏20多年來拿過《彙編語言程序設計》滿分成績的兩個學生之一[108];梁肇新開發超級解霸時,把MMX彙編玩得出神入化。感興趣的讀者可以看看梁的《編程高手箴言》[109],那裏面,描繪了一個對現在的程序員而言,完全陌生的世界。在那個世界裏,你開發的PC應用程序想要移植到Mac平臺上,幾乎要完全重寫。

如今高層次的編程語言接管了一切,彙編語言從很多學校的本科課程裏消失了,入門教材也從C改成了Java,甚至是Javascript或Python。程序員完全不熟悉底層的CPU。即使是真的需要拼性能的場合,編譯器也在很大程度上代替了手寫彙編。ARM的工程師告訴我說,ARM在開發開源的Compute Library過程中,主要依靠在C源碼中加入標註來指導編譯器生成SIMD指令,而不是像梁肇新那樣手寫。

在這種情況下,軟件平臺廠商就變得非常強勢,因爲他們知道,應用開發商只需付出重新編譯一遍的代價。比如蘋果,就要求所有的App都改爲64位的[110]。這樣,未來蘋果在手機CPU裏放棄對32位應用的支持時,甚至都不會有人感覺得到。這對於x86生態系統而言,簡直是天方夜譚,顯然微軟對此非常眼饞,並且嘗試在Windows 10 S中複製這種掌控力[111]

至於谷歌,Android把所有應用都跑在虛擬機上的嘗試雖然失敗了,但如果未來它再針對AR/VR、AI或機器人發佈一個什麼軟件平臺的話,就很有可能完全禁止原生程序。

而Oracle,正在努力開發可以支持所有編程語言、能把所有CPU給OTT掉的全新VM:GraalVM[112]。我們拭目以待。

第三是Emulation技術的發展。雖然眼下ARM陣營中靠Emulation進攻Intel的先鋒是高通,但最可怕的選手其實是NVidia。NVidia擁有最厲害的Emulation技術,而且江湖傳言Denver處理器的初衷就是針對x86的[113]。當初NVidia的Tegra處理器曾被拿來做Windows 8 RT的二合一平板[114]。如今Denver處理器跑Windows 10絕不會讓人意外,那麼它會怎麼跑呢?肯定是直接在底層硬件上做x86的Emulation,而不是在Emulate出來的ARM指令集上再做一層Eumulation。

Denver處理器前些年沒有跳出來搶Intel的飯碗,很大程度上是因爲NVidia還在做Intel平臺的主板芯片組,另外NVidia還沒有那麼強大。如今NVidia也不做芯片組生意了,還借AI的東風,股價扶搖直上。說不定哪天,NVidia就會放出Denver處理器的x86 Emulator,做到單線程性能不輸Xeon,強攻服務器市場。想想看,在單芯片上集成GPU和x86版的Denver,雲計算廠商能不動心?

如果未來Emulation技術進一步發展並且被越來越多的廠商掌握,很可能會出現這種情況:CPU本身是某種外界不瞭解的指令集,官方發佈時,只能Emulate某種開放的指令集,例如RISCV;但是用戶可以給它安裝不同的Emulator,讓它變成x86-64處理器,或者ARM64處理器。在軟件定義一切的時代,這並不是多麼瘋狂的想象。

總之,CPU依然不可或缺,但CPU用誰家的,是什麼指令集,會越來越不重要。軟件的發展,會在用戶和底層的CPU之間加入足夠大的緩衝帶,CPU的差異,越來越難以被用戶察覺到。

展望:讓CPU不再難

此文在最後修改之時,看到了梁寧的文章《一段關於國產芯片和操作系統的往事》,裏面寫到:“就像10多年前一樣,只要搞定知識產權問題,選擇技術路線,找會幹的人,投入幹,CPU/芯片就能夠做出來。搞不定的依然是操作系統。差距大的依然是生態。當年,繞得過Intel,跨不過微軟。如今,繞得過Arm,做不出安卓。” 我也曾參與過國產CPU的研發(但不是梁寧提到的方舟),生態之難體會頗深,真的,只是燒錢做芯片,無論燒多少都無法挑戰Intel和ARM,何況過去二十年真的沒燒多少。

但我並沒有梁寧那麼悲觀,畢竟技術的潮流無法抗拒,借用馬化騰的一句名言“可能你什麼錯都沒有,最後就是錯在自己太老了”。

Intel和ARM如此強大而且極少犯錯,我們如此弱小就算它們犯錯也無法利用——但我們可以欺負它們的“老”。

在此借新智元的寶地,向小馬哥呼籲一聲:

請藉助騰訊的強大生態,把CPU和OS這兩個老大難問題給OTT掉吧!

做法非常簡單,把Q+桌面再重新搞起來,做一款完全使用Javascript&Webassembly編程的操作系統,裏面用騰訊文檔來替代Office,各種微信小程序都支持起來,適當支持遊戲(但要加入家長監控系統)。補貼芯片廠,讓它們使用ARM或RISC-V外加國產Imagination gpu做SoC,生產類似Surface這樣的二合一平板。底層CPU使用的ISA完全不可見,上層編程完全用H5。這樣,就幫祖國把CPU和OS這兩個陳年大洞都補上了。

芯片要下苦功,別凡事都指望模式創新。這不假。但偏偏CPU真的面臨一個十倍速變革的機會,真的有靠模式創新而勝出的機會,爲什麼不試試呢?如果騰訊不去嘗試一下,誰還有資格呢?促進祖國的微電子發展功德無量,相信這次不會有人說騰訊壟斷之類的閒話。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章