Linux已經(jīng)為眾人所熟知,而它的直接始源——MINIX到現在也有30年歷史了,如此高齡的軟件卻還依舊充滿(mǎn)生機。MINIX的故事,以及它和Linux的出現歷史流傳并不廣泛,也許從MINIX的開(kāi)發(fā)上我們能學(xué)到一些經(jīng)驗教訓。其中有些是關(guān)于操作系統的,有些是關(guān)于軟件工程的,還有一些是關(guān)于其他領(lǐng)域的(比如項目管理)。無(wú)論MINIX還是Linux都不是憑空而來(lái)。兩者的出現都有很多的相關(guān)歷史,因此為了正確理解本文,我們先要對它做個(gè)簡(jiǎn)單的介紹。
要點(diǎn)
每個(gè)設備驅動(dòng)都應當按照獨立的用戶(hù)模式進(jìn)程來(lái)運行。
軟件可以維護很長(cháng)時(shí)間,在設計時(shí)應當有前瞻性。
想讓人們接受全新、顛覆性的概念十分困難。
1960年,在麻省理工學(xué)院有一個(gè)跟房間差不多大小的真空管科學(xué)計算機,名叫IBM709。盡管遠遠比不上如今的電腦——蘋(píng)果iPad比它快7萬(wàn)倍,RAM也比它大7300倍——但IBM709已經(jīng)是那時(shí)世界上最強大的電腦了。使用者一般在80列穿孔卡片上用FORTRAN來(lái)編寫(xiě)程序,并將這些卡片拿給操作員執行人工讀取。幾個(gè)小時(shí)之后,打印在132列折疊式記錄紙上的結果出爐。在FORTRAN語(yǔ)句中就算漏掉一個(gè)逗號,都會(huì )導致編譯錯誤,而致使程序員幾個(gè)小時(shí)的時(shí)間付諸流水。
為了給用戶(hù)提供更好的服務(wù),麻省理工開(kāi)發(fā)了一套新系統,叫做兼容分時(shí)系統(CTSS)。用戶(hù)可以使用交互式終端來(lái)操作,等待時(shí)間也從數小時(shí)減到數秒,同時(shí)后臺還能運行舊式的批處理任務(wù)。在1964年,麻省理工、貝爾實(shí)驗室聯(lián)合那時(shí)還是電腦供應商的通用電氣公司,一起參與開(kāi)發(fā)了它的后續系統,這個(gè)新系統能夠同時(shí)為波士頓地區的數百名用戶(hù)提供服務(wù)。我們可以把它當作云計算0.0版本,這個(gè)系統被稱(chēng)為MULTICS(MULTiplexed Information and Computing Service)。長(cháng)話(huà)短說(shuō),MULTICS在初期問(wèn)題很多,第一個(gè)版本所需求的RAM就超出了GE 645的288KB內存。最后在改進(jìn)了PL/1編譯器之后,MULTICS終于得以啟動(dòng)運行。然而,貝爾實(shí)驗室很快就失去興趣并退出了這個(gè)項目,留了一個(gè)開(kāi)發(fā)人員Ken Thompson。Thompson有著(zhù)勃勃雄心,他希望能在廉價(jià)的硬件上復制一個(gè)縮減版的MULTICS。在1973年MULTICS投入商用后,它在全世界攬收了大量的安裝份額,最后停止使用的記錄是在2000年10月30日,之間整整運行了27年。
回到貝爾實(shí)驗室之后,Thompson找到了一臺迷你電腦PDP-7,他在這臺電腦上用匯編語(yǔ)言編寫(xiě)了MULTICS的刪減版。由于每次只能服務(wù)一名用戶(hù),Thompson的同事Brian Kernighan將其稱(chēng)為UNICS(UNIplexed Information and Computing Service)。盡管這個(gè)稱(chēng)呼帶有諷刺意味的雙關(guān)含義,象征著(zhù)MULTICS被閹割成了UNICS,卻還是沿用了下來(lái),不過(guò)之后逐漸被拼為UNIX。由于已經(jīng)不能算是縮略詞了,有時(shí)候也寫(xiě)作Unix。
1972年,Thompson與貝爾實(shí)驗室的另一名同事Dennis Ritchie組成了搭檔,并為Unix作了一個(gè)編譯器,而Ritchie正是C語(yǔ)言的設計者。他們一同在PDP-11迷你電腦上用C語(yǔ)言實(shí)現了UNIX。后來(lái),UNIX又出了幾個(gè)內部版本,直到1975年貝爾實(shí)驗室以300美元的價(jià)格將UNIX V6權授給大學(xué)使用。由于PDP-11大受歡迎,UNIX也很快在全世界流行起來(lái)。
在1977年,悉尼新南威爾士大學(xué)的John Lions在V6的源代碼中撰寫(xiě)了注釋?zhuān)鹦薪忉屍浜x。全世界有數百所大學(xué)開(kāi)始使用Lions的書(shū)作為UNIX V6教程。
當貝爾實(shí)驗室的擁有者聽(tīng)說(shuō)有數千名學(xué)生在學(xué)習他們的產(chǎn)品時(shí),全都大吃一驚——This had to stop. 在下一個(gè)版本中(1979年的V7),官方明確禁止任何人用Unix寫(xiě)書(shū)或者給學(xué)生授課,導致操作系統課程回歸到單純的理論授課或模擬器模式,全世界的教授為之沮喪不已。UNIX的早期歷史在Peter Salus 1994年的書(shū)中都有記錄。
MINIX的創(chuàng )建
直到1984年我決定利用業(yè)余時(shí)間改寫(xiě)UNIX V7,彼時(shí)我在阿姆斯特丹自由大學(xué)授課,希望這次改寫(xiě)能給學(xué)生們提供一個(gè)UNIX兼容的操作系統。我為這個(gè)名叫MIni-uNIX或者M(jìn)INIX的系統設定的目標是IBM的新款PC,因為這款機器足夠廉價(jià)(1565美元起),學(xué)生們買(mǎi)得起。由于早期的PC不帶硬盤(pán),在我的設計中兼容V7的MINIX要求配置是:256KB RAM的IBM PC,加一個(gè)360KB 5寸軟盤(pán)。這個(gè)配置要遠遠低于PDP-11 V7的要求。盡管建議配置很低,但我從一開(kāi)始就知道,為了編譯構建整個(gè)系統,我需要更好的配置:盡可能達到最大的RAM(640KB)以及2個(gè)360KB的5寸軟盤(pán)。
MINIX的設計目標如下:
構建運行在IBM PC上的V7克隆,載體是一個(gè)360KB的軟盤(pán);
將系統設計為“自托管”,即自動(dòng)執行構建和維護;
所有源碼完全公開(kāi),人人都能拿到;
保持干凈的設計,方便學(xué)生理解;
讓(微)內核盡可能保持較小,因為內核故障是致命的;
將操作系統的其他部分分成獨立的用戶(hù)模式進(jìn)程;
保持Hide interrupt處于很低的水平;
只用傳遞明確協(xié)議的同步消息來(lái)通訊;
嘗試讓系統端口容易移植到未來(lái)的硬件中。
最初開(kāi)發(fā)的時(shí)候,我用自己的家用IBM PC運行著(zhù)與Mark Williams一致的V7克隆版,這份系統由加拿大滑鐵盧大學(xué)的一名畢業(yè)生編寫(xiě),但源碼是不公開(kāi)的。最初使用一致的版本很有必要,因為我沒(méi)有C編譯器。當程序員Ceriel Jacobs根據我自行研制的阿姆斯特丹編譯器套件移植了一個(gè)C編譯器后,系統就可以自托管了。因為使用MINIX編譯,我對任何Bug和缺陷都非常敏感。建議所有開(kāi)發(fā)者都盡可能早地親自嘗試自己開(kāi)發(fā)的系統,這樣就能發(fā)覺(jué)用戶(hù)遇到的問(wèn)題。
經(jīng)驗:自己試用自己的產(chǎn)品。
微內核確實(shí)很小,里面只有調度器、低級別的程序管理、進(jìn)程間通訊與設備驅動(dòng)。盡管設備驅動(dòng)也編譯到了微內核的執行程序中,但實(shí)際上它們是獨立運行的。微內核也被編譯為獨立運行的可執行程序。而運行系統的每個(gè)其他組件,包括文件系統與內存管理器在內都是作為單獨的程序,在單獨的進(jìn)程中運行。由于我使用的機器(IBM PC:CPU 8088)缺少內存管理單元(MMU),雖說(shuō)可以采取捷徑將所有內容打包到一個(gè)可執行文件中,但為了讓這個(gè)設計在有MMU的CPU上也能運行,我決定不用這個(gè)方案。
大約花了兩年時(shí)間,只用晚上和周末,我終于讓這個(gè)系統運行起來(lái)了。但是運行一個(gè)小時(shí)就會(huì )毫無(wú)緣由的崩潰,也沒(méi)有可辨識的模式。裸機Debug調整操作系統,問(wèn)題仍舊防不勝防,我幾乎想要放棄這個(gè)項目了。
然后我做了最后一次努力。我寫(xiě)了一個(gè)8088模擬器,在上面運行MINIX,這樣崩潰時(shí)我就能獲得正確的dump文件和堆棧追蹤。結果嚇了一跳,使用模擬器運行MINIX毫無(wú)問(wèn)題,數日甚至數周還在正常運作,一次也沒(méi)有崩潰。然后我完全的迷惑了。我對一名學(xué)生Robbert van Renesse提到了這個(gè)奇怪的情況,他告訴我傳說(shuō)8088會(huì )在過(guò)熱時(shí)產(chǎn)生中斷。雖然在8088的文檔中沒(méi)有這樣的記錄,他還是堅持有這樣的說(shuō)法。因此我插入了代碼來(lái)捕捉中斷。一個(gè)小時(shí)之內,我在屏幕上看到了這條信息:“你好,我出現中斷了,這條信息不會(huì )再次出現?!蔽伊⒓粗谱餍枰难a丁來(lái)捕捉中斷。之后MINIX就能正常運行并準備發(fā)布了。
經(jīng)驗:別盲目相信文檔,有可能是錯的。
Van Renesse隨口一句對三十年后的今天影響巨大,如果他沒(méi)提過(guò)中斷的事情,也許我已經(jīng)在絕望中放棄了。如果沒(méi)有MINIX,很難想象Linux的出現——Linus Torvalds在詳盡學(xué)習了MINIX的源代碼之后,用它為基礎寫(xiě)出了Linux。沒(méi)有Linux,也就沒(méi)有基于其上構建的Android系統。沒(méi)有Android,蘋(píng)果和三星的股價(jià)可能會(huì )與今天有很大的不同。
經(jīng)驗:聽(tīng)取學(xué)生的意見(jiàn),他們可能比你知道的更多。
大部分的基礎工具都是我自己寫(xiě)的,MINIX 1.1包括有60的工具,從ar到wc,通常大小約在4kB左右,現在的引導裝載程序要比它們大100倍。MINIX的所有內容,包括二進(jìn)制文件和源代碼剛好能放在8張360KB的軟盤(pán)中。其中四張是啟動(dòng)盤(pán)、根文件系統、 /usr和/user (見(jiàn)圖1)。另外四張包含全部的操作系統源代碼,還有60個(gè)工具源代碼。只有編譯器的源碼沒(méi)有放進(jìn)去,因為實(shí)在太大了。
經(jīng)驗:微軟的前CTO Nathan Myhrvold的觀(guān)點(diǎn)是正確的:軟件就是煤氣;會(huì )擴張至充滿(mǎn)整個(gè)容器。

圖1 這是四張原始5英寸的MINIX軟盤(pán)
開(kāi)發(fā)人員想要打破這種“規則”也是有可能的,但必須付出很大的努力。默認規則就是“更加膨脹”。
找到分發(fā)源碼的辦法是個(gè)大問(wèn)題。1987年幾乎沒(méi)人聯(lián)網(wǎng),我決定寫(xiě)一本講這個(gè)源碼的書(shū),就像Lions之前做的那樣。這本書(shū)由Prentice Hall出版發(fā)行,所有源代碼都作為書(shū)籍的贈品。在討論之后,Prentice Hall同意以打包的形式來(lái)出售這本書(shū),包括8張5英寸軟盤(pán),以及500頁(yè)的手冊,售價(jià)為69美元,基本上與制作成本相當。
Prentice Hall并不理解什么是軟件,他將軟件按成本出售的行為當作增加書(shū)籍銷(xiāo)量的手段。后來(lái)在高可用的1.44MB3英寸盤(pán)出現時(shí),我又做了一個(gè)新的3英寸版。
經(jīng)驗:無(wú)論你的產(chǎn)品多有需求,首先需要有推廣或分發(fā)的方式。
在發(fā)布數日后,USENET新聞組comp.os.minix就開(kāi)啟了。不到一個(gè)月就獲得了4萬(wàn)名讀者,考慮到能訪(fǎng)問(wèn)USENET的人并不太多,這個(gè)數字非??捎^(guān)。MINIX立即受到了推崇。
很快我就從現代計算機文化書(shū)店的聯(lián)合創(chuàng )始人Dan Doernberg那里收到了一封郵件,邀請我去硅谷做個(gè)MINIX相關(guān)的演講。剛好我要去舊金山灣區參加一個(gè)會(huì )議,就接受了邀請。我以為他在店內放套桌椅讓我簽售呢,沒(méi)想到他租了圣塔克拉拉會(huì )議中心,還做了廣泛的宣傳,整個(gè)會(huì )議中心滿(mǎn)都是人,演講過(guò)后的答問(wèn)環(huán)節持續到午夜。
之后我收到數百封郵件,要求添加這個(gè)或那個(gè)功能。由于擔心系統過(guò)大,需要更昂貴的硬件才能運行,超出學(xué)生們的預算,有一些請求被我拒絕了。很多人包括我在內,都希望GNU/Hurd或者BSD承擔開(kāi)源系統的重任,以便我能繼續專(zhuān)注于教學(xué)。
人們也提供了很多建議,其中有些非常有用。在這許多貢獻者中,有一個(gè)名叫Jan-Mark Wams的人,他編寫(xiě)了一個(gè)非常有用的測試套件,幫助系統Debug。他還編寫(xiě)了一個(gè)新的壓縮程序,比那時(shí)的很多現有程序要優(yōu)秀,然后系統的發(fā)布內容減到了兩張盤(pán)。即便后來(lái)有了在線(xiàn)發(fā)布版,軟盤(pán)版也非常重要,因為有56kbps貓的人很少。
經(jīng)驗:大小有別。
1985年,Intel發(fā)布了386處理器,配合全保護模式的32位架構。在很多用戶(hù)的幫助下(特別是澳洲的Bruce Evans),我發(fā)布了MINIX的32位受保護模式版本。盡管當初8088只有一個(gè)模式,但由于我對未來(lái)的硬件早有預見(jiàn),從第一天起新版本的代碼就被清楚的分為能在“核心模式”中運行的,以及能在“用戶(hù)模式”中作為獨立進(jìn)程運行的。等到386出現時(shí),我們因此受益良多。另外,在原始代碼中我明確地將物理地址與虛擬地址區分開(kāi)來(lái),雖然在8088中沒(méi)有什么作用,但在386上起了很大作用,使得移植更為簡(jiǎn)單。此時(shí)在阿姆斯特丹自由大學(xué)還有兩個(gè)人:Kees Bot和Philip Homburg制作了32位有虛擬內存的版本,不過(guò)我決定堅持使用Evan貢獻的那個(gè)版本,因為它更接近原始設計。
經(jīng)驗:嘗試在設計時(shí)符合未來(lái)硬件的需求。
到1991年,MINIX 1.5被移植到了Apple Macintosh、Amiga、Atari和Sun SPARCstation上,以及其他一些平臺。

圖2 四個(gè)不同平臺的MINIX 1.5
經(jīng)驗:如果不依賴(lài)硬件的特殊性能,移植到新平臺時(shí)會(huì )更簡(jiǎn)單。
隨著(zhù)系統的發(fā)展,總有意想不到的地方出現問(wèn)題。其中跟網(wǎng)卡驅動(dòng)相關(guān)的特別討厭,因為無(wú)法調試。最后有人發(fā)現,網(wǎng)卡與所標注的規格不符。
經(jīng)驗:跟軟件一樣,硬件也會(huì )有Bug。
硬件“特性”有時(shí)可以被視為硬件的Bug。在意大利主流電腦供應商O(píng)livetti將MINIX移植到PC上時(shí),由于無(wú)法解釋的原因出現了問(wèn)題,最后發(fā)現是因為Olivetti鍵盤(pán)上的幾個(gè)鍵與IBM鍵盤(pán)所返回的掃描代碼不同。這讓我想到,很多國家有自己的標準化鍵盤(pán),因此我對MINIX做了修改,讓它對多個(gè)鍵盤(pán)提供支持,并在安裝系統時(shí)可作出選擇。對于意大利、法國、德國等國家的人來(lái)說(shuō),這種修改非常有用。
經(jīng)驗:當生命給你又酸又苦的檸檬時(shí),你可以把它做成又甜又好喝的檸檬汁。遇到不如意,你可以讓它變成好事。
Linus Torvalds買(mǎi)了一臺PC
1991年1月5日,默默無(wú)聞的芬蘭赫爾辛基大學(xué)學(xué)生Linus Torvalds做了一個(gè)重要的決定。他買(mǎi)了一個(gè)速度飛快(33MHz)、容量很大(4MB RAM,40MB硬盤(pán))的PC,主要是為了運行和學(xué)習MINIX。在1991年3月29日,Torvalds在USENET新聞組(comp.os.minix)發(fā)布了第一條消息:
“大家好,我已經(jīng)運行minix一周了,現在升級到386-minix(很好用),準備下載gcc……”
他的第二個(gè)帖子是在1991年4月1日發(fā)布的,回了別人一個(gè)簡(jiǎn)單的問(wèn)題:
“RTFSC(閱讀源代碼),里面滿(mǎn)是注釋和解決方案,應該非常清楚……”
這個(gè)帖子證明了在10天內,Torvalds就徹底地學(xué)習了MINIX的源代碼,并對沒(méi)學(xué)過(guò)源代碼的人表示了鄙視。MINIX那時(shí)的目標就是要讓學(xué)生很容易的學(xué)習。在Torvalds的個(gè)例中,結果顯然很成功。
然后到了1991年8月25日,Torvalds又發(fā)了一個(gè)帖子:
“致使用minix的人,你們好,我正在為386(486)AT制作一個(gè)免費的操作系統(只是個(gè)人興趣,不會(huì )像GNU那樣大,也沒(méi)那么專(zhuān)業(yè))。這個(gè)系統是從4月開(kāi)始準備的,現在已經(jīng)準備完畢。我希望喜歡/不喜歡MINIX的人都能給我些反饋,因為我的操作系統有些類(lèi)似,除了其他的,在文件系統中也有著(zhù)同樣的物理布局?!?/p>
第二年,Torvalds在繼續學(xué)習MINIX,并使用它開(kāi)發(fā)了自己的新系統。這就是第一代Linux的內核。在Linux的核心中,仍能看到MINIX的文件系統和源樹(shù)布局的殘余痕跡。
在1992年1月29日,我向comp.os.minix發(fā)布了一條消息,表示微內核除了性能之外都比單體設計更優(yōu)秀。這個(gè)帖子引發(fā)了網(wǎng)路論戰,即便到了24年后的今天,全世界也有很多學(xué)生給我發(fā)消息說(shuō)明自己的站隊方向。
經(jīng)驗:傳說(shuō)大象記憶力超群,而互聯(lián)網(wǎng)就像一頭大象,擁有過(guò)目不忘的本領(lǐng)。
當心你放在互聯(lián)網(wǎng)上的東西,有可能在數十年后仍會(huì )出現在你面前。
對一些人來(lái)說(shuō),性能更重要。Windows NT就設計成了微內核的模式,但后來(lái)由于性能不夠,微軟轉向了混合型設計。在Windows NT、2000、XP、7、8和10之中,底層都有一個(gè)硬件抽象層來(lái)隱藏主板的差異,在那之上是處理中斷的微內核、線(xiàn)程調度、低級進(jìn)程間通訊以及線(xiàn)程同步,再之上是Windows Executive,包括一群負責流程管理、內存管理、I/O管理、安全性等功能的獨立組件,共同組成了操作系統的核心。就像MINIX那樣,它們通過(guò)定義明確的協(xié)議來(lái)通訊,不過(guò)在MINIX中使用的是用戶(hù)進(jìn)程。NT及后繼系統都屬于混合型系統,所有這些組件都在內核模式中運行,環(huán)境切換較少,性能更好。因此,從軟件工程師的角度來(lái)看,這屬于微內核設計,但從可靠性的角度來(lái)看還是單體架構,任何組件中的某個(gè)Bug都會(huì )導致整個(gè)系統崩潰。蘋(píng)果的OS X也是類(lèi)似的混合型設計,底層是Mach 3.0的微內核,其上層(Darwin系統)脫胎于FreeBSD。
同樣值得一提的是嵌入式計算的情況。在嵌入式計算世界中,可靠性要比性能更重要,因此微內核成為主流。QNX是一個(gè)類(lèi)UNIX的商用實(shí)時(shí)操作系統,廣泛用于汽車(chē)、工廠(chǎng)自動(dòng)化、發(fā)電廠(chǎng)與醫療器械行業(yè)。L4 microkernel11運行在無(wú)線(xiàn)射頻芯片上和安全處理器之上,前者已有全世界10億多臺手機在使用,后者也有iPhone 6等的新型iOS設備在用。L4很小,其中一個(gè)版本只有大約9000行C代碼,對于單體系統來(lái)說(shuō)簡(jiǎn)直不可思議。不過(guò)由于歷史問(wèn)題,在微內核上仍有爭議,而且性能也有些低。
關(guān)于MINIX的新研究是嘗試在微內核之上建立容錯的、多服務(wù)器的、兼容POSIX的操作系統。
1992年在新聞組comp.os.minix里我也指出了這一點(diǎn):將Linux與386架構緊密結合不是個(gè)好主意,因為RISC機器很快就會(huì )成為市場(chǎng)主流。在很大程度上,這也是正在發(fā)生的事情,有超過(guò)500億(RISC)ARM芯片上市。大多數智能手機和平板電腦都使用了ARM CPU,包括高通驍龍、蘋(píng)果A8和三星Exynos所使用的變種。此外,64位的ARM服務(wù)器和筆記本也開(kāi)始出現。最終Linux被移植到ARM上,不過(guò)要是一開(kāi)始沒(méi)有跟x86架構綁得太緊,移植應該更容易一些。
經(jīng)驗:不要以為如今的硬件永遠能占據主流市場(chǎng)。
也是在這個(gè)關(guān)鍵的時(shí)候,Linux與GCC編譯器綁定在一起。
經(jīng)驗:標準出現時(shí)(比如ANSI),請緊跟標準。
除了Linux的真正出現,在1992年還有一個(gè)很大的發(fā)展。AT&T起訴BSDI公司與加州大學(xué),聲稱(chēng)BSD包含了AT&T的代碼片段,此外BSDI的電話(huà)編號1-800-ITS-UNIX違反了AT&T的知識產(chǎn)權。這個(gè)案子到了1994年達成庭外和解,BSD被判有罪,中間給了新的Linux系統很大的發(fā)展空間。如果AT&T作出更明智的選擇,購買(mǎi)BSDI作為市場(chǎng)營(yíng)銷(xiāo)部門(mén),則有著(zhù)這樣強大而成熟的對手,Linux可能永遠不會(huì )有機會(huì )崛起。
經(jīng)驗:如果你是世界上大公司的老板,有小的創(chuàng )業(yè)公司出現在你關(guān)心卻一無(wú)所知的領(lǐng)域,就把它買(mǎi)下來(lái)。
在1997年,已經(jīng)兼容POSIX的MINIX2發(fā)布了,我撰寫(xiě)的《操作系統設計與實(shí)踐》一書(shū)也更新到第二版,合著(zhù)者是Albert Woodhull。
到了2000年,我最終說(shuō)服了Prentice Hall發(fā)布MINIX 2,并在網(wǎng)上免費發(fā)布所有源代碼。這件事本該早些做,特別是原始協(xié)議允許大學(xué)進(jìn)行無(wú)限的復制,而且賣(mài)給出版商的時(shí)候也是成本價(jià)格。
經(jīng)驗:在采取策略后,應當時(shí)不時(shí)回頭檢視一下。
作為研究項目的MINIX
MINIX 2又緩慢發(fā)展了幾年,但到了2004年方向出現了巨大轉變,那時(shí)我從荷蘭科學(xué)研究組織收到了一筆撥款,可以將純粹的愛(ài)好變?yōu)閲烂C的、有資金資助的研究項目。在2004年之前,我都沒(méi)有外部資金來(lái)源。后來(lái)我又陸續收到幾筆贈款,總共300萬(wàn)美元,作為研究如何將MINIX打造為可靠操作系統的經(jīng)費。
經(jīng)驗:對重要的東西做研究可以讓你獲得研究經(jīng)費,即便它游離于主流之外。
當然,MINIX并非唯一關(guān)注微內核的研究項目。我們后來(lái)又做了些研究,包括運行時(shí)替換崩潰的組件,這是自修復系統的第一步。事實(shí)上,現在MINIX已經(jīng)可以做些事情了:無(wú)需重啟,替換一些崩潰的核心操作系統組件,不會(huì )影響應用進(jìn)程。沒(méi)有其他團隊能做到這一點(diǎn),這為我們的團隊樹(shù)立了信心。
經(jīng)驗:早期成功能夠鼓舞士氣。
這種變化能實(shí)現最小權限原則,在像Windows或Linux這樣的單體系統中,如果出現故障則驅動(dòng)有權刪除磁盤(pán)內容;在MINIX中,微內核的設計不允許這種做法。
經(jīng)驗:每個(gè)設備驅動(dòng)都應當以非特權模式,按照獨立用戶(hù)模式方式來(lái)運行。
微軟顯然很了解這一點(diǎn),為Windows XP以及后續系統引入了用戶(hù)模式驅動(dòng)框架。并鼓勵設備驅動(dòng)按照用戶(hù)模式的方式來(lái)編寫(xiě),就像MINIX那樣。
2005年,我被邀請參加ACM的操作系統準則研討會(huì ),這是操作系統研究的最高榮譽(yù)了。我打算在演講上正式宣布MINIX 3發(fā)布,中途我脫掉了上衣,露出有MINIX 3字樣的T恤。從這天起,MINIX網(wǎng)站正式允許下載。我本以為會(huì )議期間,服務(wù)器能夠承受負載。由于我是會(huì )議的嘉賓,所以住在皇家套房中,房間很棒,有很漂亮的海景,但很不幸,這是唯一一間沒(méi)有互聯(lián)網(wǎng)接口的房子。更糟的是酒店沒(méi)有Wi-Fi,幸好有好心的會(huì )議組織者愿意跟我換房,我才能夠在普通房間內連網(wǎng)處理工作。
經(jīng)驗:專(zhuān)注于你真正的目標。
在有些東西看似很美好的時(shí)候,不要分心;它說(shuō)不定是一個(gè)障礙。
到2005年,MINIX 3已經(jīng)成為了很?chē)烂C的系統,但有很多人讀過(guò)我的書(shū),還有很多在學(xué)校里學(xué)過(guò)它,很難說(shuō)服他們這個(gè)系統跟之前的“玩具”系統有巨大的不同。結果很諷刺,我有一個(gè)知名的系統,因為它之前的名聲卻得努力讓大家認真對待它。微軟很聰明,早期Windows包括95和98都只是MS-DOS,但后來(lái)他們將新系統改名為Windows。
經(jīng)驗:如果你的產(chǎn)品第三版在主要方式上與第二版不同,干脆換個(gè)新名字。
2008年,MINIX獲得了另一次機會(huì ),拿到了大約350萬(wàn)美元的資助。
但這個(gè)巨大的機遇也創(chuàng )造了一個(gè)嚴重的問(wèn)題,我雇了4個(gè)專(zhuān)業(yè)的開(kāi)發(fā)者來(lái)開(kāi)發(fā)MINIX 3,并資助了6名博士生和一些博士后推動(dòng)研究。結果博士生與開(kāi)發(fā)者之間出現了巨大分歧,博士生復制了MINIX 3的源碼,并開(kāi)始用自己的研究進(jìn)行大量的修改,同時(shí)開(kāi)發(fā)者忙著(zhù)改進(jìn)Bug,并讓代碼產(chǎn)品化。兩到三年后,我們沒(méi)辦法將損壞的版本恢復了。
盡管我也希望將研究結果運用到產(chǎn)品中,但遭到了程序員的強烈抵制。因為他們已經(jīng)詳細優(yōu)化過(guò)代碼,不希望再添加很多未經(jīng)測試的東西進(jìn)去。只能再做很多努力,才能讓小組的研究成果轉為現實(shí)產(chǎn)品。
經(jīng)驗:同時(shí)做研究和開(kāi)發(fā)軟件產(chǎn)品的話(huà),結果會(huì )很難結合。
有時(shí)研究人員與開(kāi)發(fā)人員會(huì )遇到同樣的問(wèn)題,其中一個(gè)涉及同步通訊的使用。同步通訊從一開(kāi)始就存在,也非常簡(jiǎn)單,但它與可靠性的目標相矛盾。如果客戶(hù)端進(jìn)程C發(fā)送消息到服務(wù)器進(jìn)程S,然后C在收到回應前陷入崩潰或者無(wú)限循環(huán),S因為無(wú)法發(fā)送回復就會(huì )掛起。這個(gè)問(wèn)題是同步通訊所固有的。為了避免,我們不得不引入虛擬端點(diǎn)、異步通訊等等,導致簡(jiǎn)潔度大幅下降。
經(jīng)驗:愛(ài)因斯坦說(shuō)的沒(méi)錯,事情應當盡可能保持簡(jiǎn)單,但不能太過(guò)簡(jiǎn)單。
他的意思是:每個(gè)人都應當追求簡(jiǎn)潔,并確保解決方案足夠全面地進(jìn)行工作,但不可要求太甚。這也是MINIX從最開(kāi)始的指導準則。
2011年左右,為了提高產(chǎn)品的專(zhuān)注度,我們做出了兩個(gè)重要的決定:第一,我們認識到要想讓人們使用系統,就得有應用,因此我們從BSD中借鑒了很多內容。實(shí)際上,我們已經(jīng)在容錯性更高的子架構中重新部署了NetBSD的用戶(hù)環(huán)境,帶來(lái)的收益是:突然多了6000個(gè)可用的NetBSD包。
經(jīng)驗:如果你希望人們使用你的產(chǎn)品,那它必須有用。
第二,我們意識到想要贏(yíng)過(guò)Windows、Linux、OS X等桌面系統,得打一場(chǎng)硬仗。所以我們將MINIX 3移植到ARM處理器上,并開(kāi)始專(zhuān)注于高可用性的嵌入式系統。此外,很多工程師都在尋找能夠嵌入新相機、電視機、數字視頻錄像機、路由器等其他產(chǎn)品的操作系統,尤其是MINIX 3可以在使用ARM Cortex-A8處理器的BeagleBone系列單片機上運行(參見(jiàn)圖3)它們基本上都是完整的PC,零售價(jià)是50美元,而且經(jīng)常被用作嵌入式系統原型。所有都是開(kāi)源硬件,弄清工作原理很容易。

圖3 BeagleBone組件
經(jīng)驗:如果在市場(chǎng)推廣中,計劃A不起作用,那么改成計劃B。
回顧一下:微內核也許是實(shí)現高穩定性和自修復系統的最好方式,但令人驚訝的是,30年來(lái)MINIX微內核幾乎沒(méi)有增加代碼。甚至有一些主要的軟件組件,包括驅動(dòng)和大部分調度器都被移出。想要進(jìn)行顛覆性的改變,需要耗費大量的時(shí)間,舉個(gè)例子,根據微軟的統計,到2016年3月仍有2.5電腦運行著(zhù)過(guò)時(shí)的Windows XP。
經(jīng)驗:我們很難改變已經(jīng)根深蒂固的做事方式。
此外,現在的電腦性能如此強大,效率已經(jīng)不那么重要了。例如Android是用Java編寫(xiě)的,比C要慢得多,但好像沒(méi)人在意這一點(diǎn)。
另一個(gè)在MINIX中運行良好的機制就是事件驅動(dòng)模型。每個(gè)服務(wù)器和驅動(dòng)都包含:

這種設計使得測試和隔離Debug都很容易。
另一方面,MINIX 1的簡(jiǎn)單性限制了它的可用性,缺乏內核多線(xiàn)程和請求式頁(yè)面調度等在256kB IBM PC上并不實(shí)用的,后來(lái)這些功能可以加進(jìn)去了,但我們之前沒(méi)那么做,導致現在還在買(mǎi)單——移植某些軟件非常困難。
盡管資助暫且告一段落,MINIX項目還未結束。它就像很多其他項目一樣,逐漸轉向開(kāi)源。
聯(lián)系客服