Linux作業系統原始碼詳細分析(二)(轉)

BSDLite發表於2007-08-17
Linux作業系統原始碼詳細分析(二)(轉)[@more@]  第2章 代 碼 初 識

  本章首先從較高層次介紹Linux核心源程式的概況,這些都是大家關心的一些基本特點。隨後將簡要介紹一些實際程式碼。最後介紹如何編譯核心。

  2.1 Linux核心源程式的部分特點

  在過去的一段時期,Linux核心同時使用C語言和組合語言來實現。這兩種語言需要一定的平衡:C語言編寫的程式碼移植性較好、易於維護,而組合語言編寫的程式則速度較快。一般只有在速度是關鍵因素或者一些因平臺相關特性而產生的特殊要求(例如直接和記憶體管理硬體進行通訊)時才使用匯編語言。

  正如實際中所做的,即使核心並未使用C++的物件特性,部分核心也可以在g++(GNU的C++編譯器)下進行編譯。同其他物件導向的程式語言相比較,相對而言C++的開銷是較低的,但是對於核心開發人員來說,這已經是太多了。

  核心開發人員不斷髮展程式設計風格,形成了Linux程式碼獨有的特色。本節將討論其中的一些問題。

  2.1.1 gcc特性的使用

  Linux核心被設計為必須使用GNU的C編譯器gcc來編譯,而不是任何一種C編譯器都可以使用。核心程式碼有時要使用gcc特性,本書將陸續介紹其中的一部分。

  一些gcc特有程式碼只是簡單地使用gcc語言擴充套件,例如允許在C(不只是C++)中使用inline關鍵字指示行內函數。也就是說,程式碼中被呼叫的函式在每次函式呼叫時都會被擴充,因而就可以節約實際函式呼叫的開銷。

  一般情況下,程式碼的編寫方式比較複雜。因為對於某些型別的輸入,gcc能夠產生比其他輸入效率更高的執行程式碼。從理論上講,編譯器可以最佳化具有相同功能的兩種對等的方法,並且得到相同的結果。因此,程式碼的編寫方式是無關緊要的。但在實際上,用某種方法編寫所產生的程式碼要比用另外一些方法編寫所產生的程式碼執行速度快許多。核心開發人員知道怎樣才能產生更高效的執行程式碼,這不斷地在他們編寫的程式碼中反映出來。

  例如,考慮核心中經常使用的goto語句—為了提高速度,核心中經常大量使用這種一般要避免使用的語句。在本書中所包含的不到40 000行程式碼中,一共有500多條goto語句,大約是每80行一個。除彙編檔案外,精確的統計數字是接近每72行一個goto語句。公平地說,這是選擇偏向的結果:比例如此高的原因之一是本書中涉及的是核心源程式的核心,在這裡速度比其他因素都需要優先考慮。整個核心的比例大概是每260行一個goto語句。然而,這仍然是我不再使用Basic進行程式設計以來見過的使用goto頻率最高的地方。

  程式碼必需受特定編譯器限制的特性不僅與普通應用程式的開發有很大不同,而且也不同於大多數核心的開發。大多數的開發人員使用C語言編寫程式碼來保持較高的可移植性,即使在編寫作業系統時也是如此。這樣做的優點是顯而易見的,最為重要的一點是一旦出現更好的編譯器,程式設計師們可以隨時進行更換。

  核心對於gcc特性的完全依賴使得核心向新的編譯器上移植更加困難。最近Linus對這一問題在有關核心的郵件列表上表明瞭自己的觀點:“記住,編譯器只是一個工具。”這是對依賴於gcc特性的一個很好的基本思想的表述:編譯器只是為了完成工作。如果透過遵守標準還不能達到工作要求,那麼就不是工作要求有問題,而是對於標準的依賴有問題。

  在大多數情況下,這種觀點是不能被人所接受的。通常情況下,為了保證和程式語言標準的一致,開發人員可能需要犧牲某些特性、速度或者其他相關因素。其他的選擇可能會為後期開發造成很大的麻煩。

  但是,在這種特定的情況下,Linus是正確的。Linux核心是一個特例,因為其執行速度要比向其他編譯器的可移植性遠為重要。如果設計目標是編寫一個可移植性好而不要求快速執行的核心,或者是編寫一個任何人都可以使用自己喜歡的編譯器進行編譯的核心,那麼結論就可能會有所不同了;而這些恰好不是Linux的設計目標。實際上,gcc幾乎可以為所有能夠執行Linux的CPU生成程式碼,因此,對於gcc的依賴並不是可移植性的嚴重障礙。

  在第3章中我們將對核心設計目標進行詳細說明。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10617542/viewspace-963073/,如需轉載,請註明出處,否則將追究法律責任。

相關文章