1. 程式人生 > >第一章、Linux是什麼

第一章、Linux是什麼

早在Linux出現之前的二十年(大約在1970 年代),就有一個相當穩定而成熟的作業系統存在了! 那就是Linux的老大哥『Unix』是也!怎麼這麼說呢?他們這兩個傢伙有什麼關係呀?這裡就給他說一說囉!

眾所皆知的,Linux的核心是由Linus Torvalds在1991年的時候給他開發出來的, 並且丟到網路上提供大家下載,後來大家覺得這個小東西(Linux Kernel)相當的小而精巧, 所以慢慢的就有相當多的朋友投入這個小東西的研究領域裡面去了! 但是為什麼這個小東西這麼棒呢?又為什麼大家都可以免費的下載這個東西呢? 嗯!等鳥哥慢慢的道來!

  • 1969年以前:一個偉大的夢想--Bell,MIT與GE的『Multics』系統

早期的計算機並不像現在的個人計算機一樣普遍,他可不是一般人碰的起的呢~ 除非是軍事或者是高科技用途,或者是學術單位的學術研究,否則真的很難接觸到。 非但如此,早期的計算機架構還很難使用,除了指令週期並不快之外,操作介面也很困擾的! 因為那個時候的輸入裝置只有卡片閱讀機、輸出裝置只有印表機, 使用者也無法與作業系統互動(批次型作業系統)。

在那個時候,寫程式是件很可憐的事情,因為程式設計者,必須要將程式相關的資訊在讀卡紙上面打洞, 然後再將讀卡紙插入卡片閱讀機來將資訊讀入主機中運算。光是這樣就很麻煩了,如果程式有個小地方寫錯, 哈哈!光是重新打卡就很慘,加上主機少,使用者眾多,光是等待,就耗去很多的時間了!

在那之後,由於硬體與作業系統的改良,使得後來可以使用鍵盤來進行資訊的輸入。 不過,在一間學校裡面,主機畢竟可能只有一部,如果多人等待使用,那怎麼辦?大家還是得要等待啊! 好在1960年代初期麻省理工學院(MIT)發展了所謂的: 『相容分時系統(Compatible Time-Sharing System, CTSS)』, 它可以讓大型主機透過提供數個終端機(terminal)以聯機進入主機,來利用主機的資源進行運算工作。 架構有點像這樣:

早期主機與終端機的相關性圖示
圖1.2.1、早期主機與終端機的相關性圖示
Tips:
這個相容分時系統可以說是近代作業系統的始祖呢!他可以讓多個使用者在某一段時間內分別使用CPU的資源, 感覺上你會覺得大家是同時使用該主機的資源!事實上,是CPU在每個使用者的工作之間進行切換, 在當時,這可是個劃時代的技術喔!
鳥哥的圖示

如此一來,無論主機在哪裡,只要在終端機前面進行輸入輸出的作業,就可利用主機提供的功能了。 不過,需要注意的是,此時終端機只具有輸入/輸出的功能,本身完全不具任何運算或者軟體安裝的能力。 而且,比較先進的主機大概也只能提供30個不到的終端機而已。

為了更加強化大型主機的功能,以讓主機的資源可以提供更多使用者來利用,所以在1965年前後, 由貝爾實驗室(Bell)、麻省理工學院(MIT)及奇異公司(GE, 或稱為通用電器)共同發起了Multics的計劃, Multics計劃的目的是想要讓大型主機可以達成提供300個以上的終端機聯機使用的目標。 不過,到了1969年前後,計劃進度落後,資金也短缺,所以該計劃雖然繼續在研究,但貝爾實驗室還是退出了該計劃的研究工作。 (注:Multics有複雜、多數的意思存在。)

Tips:
最終Multics還是有成功的發展出他們的系統,完整的歷史說明可以參考:http://www.multicians.org/網站內容。 Multics計劃雖然後來沒有受到很大的重視,但是他培養出來的人材是相當優秀的! ^_^
鳥哥的圖示
  • 1969年:Ken Thompson的小型file server system

在認為Multics計劃不可能成功之後,貝爾研究室就退出該計劃。不過,原本參與Multics計劃的人員中,已經從該計劃當中獲得一些點子, Ken Thompson 就是其中一位!

Thompson因為自己的需要,希望開發一個小小的作業系統以提供自己的需求。 在開發時,有一部DEC(Digital Equipment Corporation)公司推出的PDP-7剛好沒人使用, 於是他就準備針對這部主機進行作業系統核心程式的撰寫。本來Thompson應該是沒時間的(有家有小孩的宿命?), 無巧不巧的是,在1969年八月份左右,剛好Thompson的妻兒去了美西探親, 於是他有了額外的一個月的時間好好的待在家將一些構想實現出來!

經過四個星期的奮鬥,他終於以組合語言(Assembler)寫出了一組核心程式,同時包括一些核心工具程式, 以及一個小小的檔案系統。那個系統就是Unix的原型! 當時Thompson將Multics龐大的複雜系統簡化了不少,於是同實驗室的朋友都戲稱這個系統為:Unics。(當時尚未有Unix的名稱)

Thompson 的這個檔案系統有兩個重要的概念,分別是:

  • 所有的程式或系統裝置都是檔案
  • 不管建構編輯器還是附屬檔案,所寫的程式只有一個目的,且要有效的完成目標。

這些概念在後來對於Linux的發展有相當重要的影響喔!

Tips:
套一句常聽到的廣告詞:『科技始終來自於人性』,當初Thompson會寫這套Unix核心程式, 卻是想要移植一套名為『太空旅遊』的遊戲呢! ^_^
鳥哥的圖示
  • 1973年:Unix的正式誕生,Ritchie等人以C語言寫出第一個正式Unix核心

由於Thompson寫的那個作業系統實在太好用了,所以在貝爾實驗室內部廣為流傳,並且數度經過改版。 但是因為Unics本來是以組合語言寫成的,而如第零章計算器概論談到的, 組合語言具有專一性,加上當時的計算機機器架構都不太相同,所以每次要安裝到不同的機器都得要重新編寫組合語言,真不方便!

後來Thompson與Ritchie合作想將Unics改以高階程式語言來撰寫。當時現成的高階程式語言有B語言。 但是由B語言所編譯出來的核心效能不是很好。後來Dennis Ritchie將B語言重新改寫成C語言,再以C語言重新改寫與編譯Unics的核心, 最後正名與發行出Unix的正式版本!

Tips:
這群高階黑客實在很厲害!因為自己的需求來開發出這麼多好用的工具! C程式語言開發成功後,甚至一直沿用至今呢!你說厲不厲害啊!這個故事也告訴我們,不要小看自己的潛能喔! 你想作的,但是現實生活中沒有的,就動手自己搞一個來玩玩吧!
鳥哥的圖示

由於貝爾實驗室是隸屬於美國電信大廠AT&T公司的, 只是AT&T當時忙於其他商業活動,對於Unix並不支援也不排斥。此外,Unix在這個時期的發展者都是貝爾實驗室的工程師, 這些工程師對於程式當然相當有研究,所以,Unix在此時當然是不容易被一般人所接受的!不過對於學術界的學者來說, 這個 Unix 真是學者們進行研究的福音!因為程式程式碼可改寫並且可作為學術研究之用嘛!

需要特別強調的是,由於Unix是以較高階的C語言寫的,相對於組合語言需要與硬體有密切的配合, 高階的C語言與硬體的相關性就沒有這麼大了!所以,這個改變也使得Unix很容易被移植到不同的機器上面喔!

  • 1977年:重要的Unix分支--BSD的誕生

雖然貝爾屬於AT&T,但是AT&T此時對於Unix是採取較開放的態度,此外,Unix是以高階的C語言寫成的, 理論上是具有可移植性的!亦即只要取得Unix的原始碼,並且針對大型主機的特性加以修訂原有的原始碼(Source Code), 就可能將Unix移植到另一部不同的主機上頭了。所以在1973年以後,Unix便得以與學術界合作開發! 最重要的接觸就是與加州柏克萊(Berkeley)大學的合作了。

柏克萊大學的Bill Joy在取得了Unix的核心原始碼後,著手修改成適合自己機器的版本, 並且同時增加了很多工具軟體與編譯程式,最終將它命名為Berkeley Software Distribution (BSD)。這個BSD是Unix很重要的一個分支,Bill Joy也是Unix業者『Sun(昇陽)』這家公司的創辦者! Sun公司即是以BSD發展的核心進行自己的商業Unix版本的發展的。 (後來可以安裝在x86硬體架構上面FreeBSD即是BSD改版而來!)

  • 1979年:重要的 System V 架構與版權宣告

由於Unix的高度可移植性與強大的效能,加上當時並沒有版權的糾紛, 所以讓很多商業公司開始了Unix作業系統的發展,例如AT&T自家的System V、IBM的AIX以及HP與DEC等公司, 都有推出自家的主機搭配自己的Unix作業系統。

但是,如同我們前面提到的,作業系統的核心(Kernel)必須要跟硬體配合, 以提供及控制硬體的資源進行良好的工作!而在早期每一家生產計算機硬體的公司還沒有所謂的『協議』的概念, 所以每一個計算機公司出產的硬體自然就不相同囉!因此他們必須要為自己的計算機硬體開發合適的Unix系統。 例如在學術機構相當有名的Sun、Cray與HP就是這一種情況。 他們開發出來的Unix作業系統以及內含的相關軟體並沒有辦法在其他的硬體架構下工作的! 另外,由於沒有廠商針對個人計算機設計Unix系統,因此,在早期並沒有支援個人計算機的Unix作業系統的出現。

Tips:
如同相容分時系統的功能一般,Unix強調的是多人多工的環境! 但早期的286個人計算機架構下的CPU是沒有能力達到多工的作業,因此,並沒有人對移植Unix到x86的計算機上有興趣。
鳥哥的圖示

每一家公司自己出的Unix雖然在架構上面大同小異,但是卻真的僅能支援自身的硬體, 所以囉,早先的Unix只能與伺服器(Server)或者是大型工作站(Workstation)劃上等號! 但到了 1979 年時,AT&T推出 System V 第七版 Unix 後,這個情況就有點改善了。 這一版最重要的特色是可以支援x86架構的個人計算機系統,也就是說 System V 可以在個人計算機上面安裝與運作了。

不過因為AT&T由於商業的考慮,以及在當時現實環境下的思考,於是想將Unix的版權收回去。因此, AT&T在1979年發行的第七版Unix中,特別提到了 『不可對學生提供原始碼』的嚴格限制! 同時,也造成Unix業界之間的緊張氣氛,並且也引爆了很多的商業糾紛~

Tips:
目前被稱為純種的Unix指的就是System V以及BSD這兩套囉!
鳥哥的圖示
  • 1984年之一:x86架構的Minix作業系統誕生

既然1979年的Unix第七版可以在Intel的x86架構上面進行移植, 那麼是否意味著可以將Unix改寫並移植到x86上面了呢?在這個想法上, 譚寧邦教授於是乎自己動手寫了Minix這個Unix Like的核心程式! 在撰寫的過程中,為了避免版權糾紛,譚寧邦完全不看Unix核心原始碼! 並且強調他的Minix必須能夠與Unix相容才行!譚寧邦在1984年開始撰寫核心程式, 到了1986年終於完成,並於次年出版Minix相關書籍,同時與新聞組(BBS及News)相結合~

Tips:
之所以稱為Minix的原因,是因為他是個Mini的Unix系統囉!^_^
鳥哥的圖示

這個Minix版本比較有趣的地方是,他並不是完全免費的,無法在網路上提供下載! 必須要透過磁碟/磁帶購買才行!雖然真的很便宜~不過,畢竟因為沒有在網路上流傳, 所以Minix的傳遞速度並沒有很快速!此外,購買時,隨磁碟還會附上Minix的原始碼! 這意味著使用者可以學習Minix的核心程式設計概念喔! (這個特色對於Linux的啟始開發階段,可是有很大的關係喔!)

此外,Minix作業系統的開發者僅有譚寧邦教授,因為學者很忙啊!加上譚寧邦始終認為Minix主要用在教育用途上面, 所以對於Minix是點到為止!沒錯,Minix是很受歡迎,不過,使用者的要求/需求的聲音可能就比較沒有辦法上升到比較高的地方了! 這樣說,你明白吧?^_^ 

  • 1984年之二:GNU計劃與FSF基金會的成立

Richard Mathew Stallman(史託曼)在1984年發起的GNU計劃,對於現今的自由軟體風潮, 真有不可磨滅的地位!目前我們所使用得很多自由軟體,幾乎均直接或間接受益於GNU這個計劃呢! 那麼史託曼是何許人也?為何他會發起這個GNU計劃呢?

  • 一個分享的環境:

    Richard Mathew Stallman(生於1953年, 網路上自稱的ID為RMS)從小就很聰明!他在1971年的時候,進入黑客圈中相當出名的人工智慧實驗室(AI Lab.), 這個時候的黑客專指計算機功力很強的人,而非破壞計算機的怪客(cracker)喔!

    當時的黑客圈對於軟體的著眼點幾乎都是在『分享』,所以並沒有專利方面的困擾! 這個特色對於史託曼的影響很大!不過,後來由於管理階層的問題,導致實驗室的優秀黑客離開該實驗室, 並且進入其他商業公司繼續發展優秀的軟體。但史託曼並不服輸,仍然持續在原來的實驗室開發新的程式與軟體。 後來,他發現到,自己一個人並無法完成所有的工作,於是想要成立一個開放的團體來共同努力!

  • 使用Unix開發階段:

    1983年以後,因為實驗室硬體的更換,使得史託曼無法繼續以原有的硬體與作業系統繼續自由程式的撰寫~ 而且他進一步發現到,過去他所使用的Lisp作業系統,是麻省理工學院的專利軟體, 是無法共享的,這對於想要成立一個開放團體的史託曼是個阻礙。於是他便放棄了Lisp這個系統。 後來,他接觸到Unix這個系統,並且發現,Unix在理論與實際上,都可以在不同的機器間進行移植。雖然 Unix 依舊是專利軟體, 但至少 Unix 架構上還是比較開放的!於是他開始轉而使用Unix系統。

    因為Lisp與Unix是不同的系統,所以,他原本已經撰寫完畢的軟體是無法在Unix上面執行的!為此, 他就開始將軟體移植到Unix上面。並且,為了讓軟體可以在不同的平臺上運作, 因此,史託曼將他發展的軟體均撰寫成可以移植的型態!也就是他都會將程式的原始碼公佈出來!

  • GNU計劃的推展:

    1984年,史託曼開始GNU計劃, 這個計劃的目的是:建立一個自由、開放的Unix作業系統(Free Unix)。 但是建立一個作業系統談何容易啊!而且在當時的GNU是僅有自己一個人單打獨鬥的史託曼~ 這實在太麻煩,但又不想放棄這個計劃,那可怎麼辦啊?

    聰明的史託曼乾脆反其道而行~『既然作業系統太複雜,我就先寫可以在Unix上面執行的小程式,這總可以了吧?』在這個想法上, 史託曼開始參考Unix上面現有的軟體,並依據這些軟體的作用開發出功能相同的軟體,且開發期間史託曼絕不看其他軟體的原始碼, 以避免吃上官司。後來一堆人知道免費的GNU軟體,並且實際使用後發現與原有的專利軟體也差不了太多,於是便轉而使用GNU軟體, 於是GNU計劃逐漸開啟知名度。

    雖然GNU計劃漸漸開啟知名度,但是能見度還是不夠。這時史託曼又想:不論是什麼軟體, 都得要進行編譯成為二進位制檔案(binary program)後才能夠執行,如果能夠寫出一個不錯的編譯程式,那不就是大家都需要的軟體了嗎? 因此他便開始撰寫C語言的編譯程式,那就是現在相當有名的GNU C Compiler(gcc)! 這個點相當的重要!這是因為C語言編譯程式版本眾多,但都是專利軟體, 如果他寫的C編譯程式夠棒,效能夠佳,那麼將會大大的讓GNU計劃出現在眾人眼前!如果忘記啥是編譯程式, 請回到第零章去瞧瞧編譯程式吧!

    但開始撰寫GCC時並不順利,為此,他先轉而將他原先就已經寫過的Emacs編輯器寫成可以在Unix上面跑的軟體,並公佈原始碼。 Emacs是一種程式編輯器,他可以在使用者撰寫程式的過程中就進行程式語法的檢驗,此一功能可以減少程式設計師除錯的時間! 因為Emacs太優秀了,因此,很多人便直接向他購買。

    此時因特網尚未流行,所以,史託曼便藉著Emacs以磁帶(tape)出售,賺了一點錢 ,進而開始全力撰寫其他軟體。並且成立自由軟體基金會(FSF, Free Software Foundation),請更多工程師與志工撰寫軟體。終於還是完成了GCC,這比Emacs還更有幫助! 此外,他還撰寫了更多可以被呼叫的C函式庫(GNU C library),以及可以被使用來操作作業系統的基本介面BASH shell! 這些都在1990年左右完成了!

    Tips:
    如果純粹使用文字編輯器來編輯程式的話,那麼程式語法如果寫錯時,只能利用編譯時發生的錯誤訊息來修訂了,這樣實在很沒有效率。 Emacs則是一個很棒的編輯器!注意!是編輯(editor)而非編譯(compiler)! 他可以很快的立刻顯示出你寫入的語法可能有錯誤的地方,這對於程式設計師來說, 實在是一個好到不能再好的工具了!所以才會這麼的受到歡迎啊!
    鳥哥的圖示
  • GNU的通用公共許可證:

    到了1985年,為了避免GNU所開發的自由軟體被其他人所利用而成為專利軟體, 所以他與律師草擬了有名的通用公共許可證(General Public License, GPL), 並且稱呼他為copyleft(相對於專利軟體的copyright!)。 關於GPL的相關內容我們在下一個小節繼續談論,在這裡,必須要說明的是, 由於有GNU所開發的幾個重要軟體,如:

    • Emacs
    • GNU C (GCC)
    • GNU C Library (glibc)
    • Bash shell

    造成後來很多的軟體開發者可以藉由這些基礎的工具來進行程式開發! 進一步壯大了自由軟體團體!這是很重要的!不過,對於GNU的最初構想 『建立一個自由的Unix作業系統』來說,有這些優秀的程式是仍無法滿足, 因為,當下並沒有『自由的Unix核心』存在...所以這些軟體仍只能在那些有專利的 Unix平臺上工作~~一直到Linux的出現...更多的FSF開發的軟體可以參考如下網頁:


  • 1988年:圖形介面XFree86計劃

有鑑於圖形使用者介面(Graphical User Interface, GUI) 的需求日益加重,在1984年由MIT與其他第三方首次發表了X Window System ,並且更在1988年成立了非營利性質的XFree86這個組織。所謂的XFree86其實是 X Window System + Free + x86的整合名稱呢! 而這個XFree86的GUI介面更在Linux的核心1.0版於1994年釋出時,整合於Linux作業系統當中!

Tips:
為什麼稱圖形使用者介面為X呢?因為由英文單字來看,Window的W接的就是X啦!意指Window的下一版就是了! 需注意的是,X Window並不是X Windows喔!
鳥哥的圖示
  • 1991年:芬蘭大學生Linus Torvalds的一則簡訊

到了1991年,芬蘭的赫爾辛基大學的Linus Torvalds在BBS上面貼了一則訊息, 宣稱他以bash, gcc等工具寫了一個小小的核心程式,這個核心程式可以在Intel的386機器上面運作, 讓很多人很感興趣!從此開始了Linux不平凡的路程!