資源描述:
《關于保定百度愛第2章代碼初識本章首先從較高層次介紹linux內核源程序》由會員上傳分享,免費在線閱讀,更多相關內容在應用文檔-天天文庫。
1、關于保定百度愛第2章代碼初識本章首先從較高層次介紹Linux內核源程序.txt等余震的心情,就像初戀的少女等情人,既怕他不來,又怕他亂來。聽說女人如衣服,兄弟如手足,回想起來,我竟然七手八腳地裸奔了二十多年!今天心情不好,我只有四句話想說,包括這句和前面的兩句,我的話說完了!的地方愛的規(guī)格好文章第2章代碼初識
本章首先從較高層次介紹Linux內核源程序的概況,這些都是大家關心的一些基本特點。隨后將簡要介紹一些實際代碼。最后介紹如何編譯內核。
2.1Linux內核源程序的部分特點
在過去的一段時期,Linu
2、x內核同時使用C語言和匯編語言來實現(xiàn)。這兩種語言需要一定的平衡:C語言編寫的代碼移植性較好、易于維護,而匯編語言編寫的程序則速度較快。一般只有在速度是關鍵因素或者一些因平臺相關特性而產生的特殊要求(例如直接和內存管理硬件進行通訊)時才使用匯編語言。
正如實際中所做的,即使內核并未使用C++的對象特性,部分內核也可以在g++(GNU的C++編譯器)下進行編譯。同其他面向對象的編程語言相比較,相對而言C++的開銷是較低的,但是對于內核開發(fā)人員來說,這已經是太多了。
內核開發(fā)人員不斷發(fā)展編程風格,形成了Linu
3、x代碼獨有的特色。本節(jié)將討論其中的一些問題。
2.1.1gcc特性的使用
Linux內核被設計為必須使用GNU的C編譯器gcc來編譯,而不是任何一種C編譯器都可以使用。內核代碼有時要使用gcc特性,本書將陸續(xù)介紹其中的一部分。
一些gcc特有代碼只是簡單地使用gcc語言擴展,例如允許在C(不只是C++)中使用inline關鍵字指示內聯(lián)函數。也就是說,代碼中被調用的函數在每次函數調用時都會被擴充,因而就可以節(jié)約實際函數調用的開銷。
一般情況下,代碼的編寫方式比較復雜。因為對于某些類型的輸入,gcc能夠產生比
4、其他輸入效率更高的執(zhí)行代碼。從理論上講,編譯器可以優(yōu)化具有相同功能的兩種對等的方法,并且得到相同的結果。因此,代碼的編寫方式是無關緊要的。但在實際上,用某種方法編寫所產生的代碼要比用另外一些方法編寫所產生的代碼執(zhí)行速度快許多。內核開發(fā)人員知道怎樣才能產生更高效的執(zhí)行代碼,這不斷地在他們編寫的代碼中反映出來。
例如,考慮內核中經常使用的goto語句—為了提高速度,內核中經常大量使用這種一般要避免使用的語句。在本書中所包含的不到40000行代碼中,一共有500多條goto語句,大約是每80行一個。除匯編文件外
5、,精確的統(tǒng)計數字是接近每72行一個goto語句。公平地說,這是選擇偏向的結果:比例如此高的原因之一是本書中涉及的是內核源程序的核心,在這里速度比其他因素都需要優(yōu)先考慮。整個內核的比例大概是每260行一個goto語句。然而,這仍然是我不再使用Basic進行編程以來見過的使用goto頻率最高的地方。
代碼必需受特定編譯器限制的特性不僅與普通應用程序的開發(fā)有很大不同,而且也不同于大多數內核的開發(fā)。大多數的開發(fā)人員使用C語言編寫代碼來保持較高的可移植性,即使在編寫操作系統(tǒng)時也是如此。這樣做的優(yōu)點是顯而易見的,最為
6、重要的一點是一旦出現(xiàn)更好的編譯器,程序員們可以隨時進行更換。
內核對于gcc特性的完全依賴使得內核向新的編譯器上移植更加困難。最近Linus對這一問題在有關內核的郵件列表上表明了自己的觀點:“記住,編譯器只是一個工具?!边@是對依賴于gcc特性的一個很好的基本思想的表述:編譯器只是為了完成工作。如果通過遵守標準還不能達到工作要求,那么就不是工作要求有問題,而是對于標準的依賴有問題。
在大多數情況下,這種觀點是不能被人所接受的。通常情況下,為了保證和程序語言標準的一致,開發(fā)人員可能需要犧牲某些特性、速度或者其
7、他相關因素。其他的選擇可能會為后期開發(fā)造成很大的麻煩。
但是,在這種特定的情況下,Linus是正確的。Linux內核是一個特例,因為其執(zhí)行速度要比向其他編譯器的可移植性遠為重要。如果設計目標是編寫一個可移植性好而不要求快速運行的內核,或者是編寫一個任何人都可以使用自己喜歡的編譯器進行編譯的內核,那么結論就可能會有所不同了;而這些恰好不是Linux的設計目標。實際上,gcc幾乎可以為所有能夠運行Linux的CPU生成代碼,因此,對于gcc的依賴并不是可移植性的嚴重障礙。
在第3章中我們將對內核設計目標進行詳
8、細說明。
2.1.2內核代碼習慣用語
內核代碼中使用了一些顯著的習慣用語,本節(jié)將介紹常用的幾個。當通讀源代碼時,真正重要的問題并不在這些習慣用語本身,而是這種類型的習慣用語的確存在,而且是不斷被使用和發(fā)展的。如果你需要編寫內核代碼,你應該注意到內核中所使用的習慣用語,并把這些習慣用語應用到你的代碼中。當通讀本書(或者代碼)時,看看你還能找到多少習慣用語。
為了討論這些習慣用語,我們首先需要對它們進行命名。為了便于討論,筆者創(chuàng)造