資源描述:
《本章首先從較高層次介紹linux內(nèi)核源程序的概況這些都》由會員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫。
1、本章首先從較高層次介紹Linux內(nèi)核源程序的概況,這些都.txt鮮花往往不屬于賞花的人,而屬于牛糞。。。道德常常能彌補(bǔ)智慧的缺陷,然而智慧卻永遠(yuǎn)填補(bǔ)不了道德空白人生有三樣?xùn)|西無法掩蓋:咳嗽貧窮和愛,越隱瞞,就越欲蓋彌彰。的的范德薩的地方愛的規(guī)格愛你啊好文章第2章代碼初識
本章首先從較高層次介紹Linux內(nèi)核源程序的概況,這些都是大家關(guān)心的一些基本特點(diǎn)。隨后將簡要介紹一些實(shí)際代碼。最后介紹如何編譯內(nèi)核。
2.1Linux內(nèi)核源程序的部分特點(diǎn)
在過去的一段時(shí)期,Linux內(nèi)核同時(shí)使用C語言和匯編語言
2、來實(shí)現(xiàn)。這兩種語言需要一定的平衡:C語言編寫的代碼移植性較好、易于維護(hù),而匯編語言編寫的程序則速度較快。一般只有在速度是關(guān)鍵因素或者一些因平臺相關(guān)特性而產(chǎn)生的特殊要求(例如直接和內(nèi)存管理硬件進(jìn)行通訊)時(shí)才使用匯編語言。
正如實(shí)際中所做的,即使內(nèi)核并未使用C++的對象特性,部分內(nèi)核也可以在g++(GNU的C++編譯器)下進(jìn)行編譯。同其他面向?qū)ο蟮木幊陶Z言相比較,相對而言C++的開銷是較低的,但是對于內(nèi)核開發(fā)人員來說,這已經(jīng)是太多了。
內(nèi)核開發(fā)人員不斷發(fā)展編程風(fēng)格,形成了Linux代碼獨(dú)有的特色。本
3、節(jié)將討論其中的一些問題。
2.1.1gcc特性的使用
Linux內(nèi)核被設(shè)計(jì)為必須使用GNU的C編譯器gcc來編譯,而不是任何一種C編譯器都可以使用。內(nèi)核代碼有時(shí)要使用gcc特性,本書將陸續(xù)介紹其中的一部分。
一些gcc特有代碼只是簡單地使用gcc語言擴(kuò)展,例如允許在C(不只是C++)中使用inline關(guān)鍵字指示內(nèi)聯(lián)函數(shù)。也就是說,代碼中被調(diào)用的函數(shù)在每次函數(shù)調(diào)用時(shí)都會被擴(kuò)充,因而就可以節(jié)約實(shí)際函數(shù)調(diào)用的開銷。
一般情況下,代碼的編寫方式比較復(fù)雜。因?yàn)閷τ谀承╊愋偷妮斎耄琯cc能夠產(chǎn)生比其他輸入效
4、率更高的執(zhí)行代碼。從理論上講,編譯器可以優(yōu)化具有相同功能的兩種對等的方法,并且得到相同的結(jié)果。因此,代碼的編寫方式是無關(guān)緊要的。但在實(shí)際上,用某種方法編寫所產(chǎn)生的代碼要比用另外一些方法編寫所產(chǎn)生的代碼執(zhí)行速度快許多。內(nèi)核開發(fā)人員知道怎樣才能產(chǎn)生更高效的執(zhí)行代碼,這不斷地在他們編寫的代碼中反映出來。
例如,考慮內(nèi)核中經(jīng)常使用的goto語句—為了提高速度,內(nèi)核中經(jīng)常大量使用這種一般要避免使用的語句。在本書中所包含的不到40000行代碼中,一共有500多條goto語句,大約是每80行一個(gè)。除匯編文件外
5、,精確的統(tǒng)計(jì)數(shù)字是接近每72行一個(gè)goto語句。公平地說,這是選擇偏向的結(jié)果:比例如此高的原因之一是本書中涉及的是內(nèi)核源程序的核心,在這里速度比其他因素都需要優(yōu)先考慮。整個(gè)內(nèi)核的比例大概是每260行一個(gè)goto語句。然而,這仍然是我不再使用Basic進(jìn)行編程以來見過的使用goto頻率最高的地方。
代碼必需受特定編譯器限制的特性不僅與普通應(yīng)用程序的開發(fā)有很大不同,而且也不同于大多數(shù)內(nèi)核的開發(fā)。大多數(shù)的開發(fā)人員使用C語言編寫代碼來保持較高的可移植性,即使在編寫操作系統(tǒng)時(shí)也是如此。這樣做的優(yōu)點(diǎn)是顯而易
6、見的,最為重要的一點(diǎn)是一旦出現(xiàn)更好的編譯器,程序員們可以隨時(shí)進(jìn)行更換。
內(nèi)核對于gcc特性的完全依賴使得內(nèi)核向新的編譯器上移植更加困難。最近Linus對這一問題在有關(guān)內(nèi)核的郵件列表上表明了自己的觀點(diǎn):“記住,編譯器只是一個(gè)工具?!?2/12這是對依賴于gcc特性的一個(gè)很好的基本思想的表述:編譯器只是為了完成工作。如果通過遵守標(biāo)準(zhǔn)還不能達(dá)到工作要求,那么就不是工作要求有問題,而是對于標(biāo)準(zhǔn)的依賴有問題。
在大多數(shù)情況下,這種觀點(diǎn)是不能被人所接受的。通常情況下,為了保證和程序語言標(biāo)準(zhǔn)的一致,開發(fā)人員可
7、能需要犧牲某些特性、速度或者其他相關(guān)因素。其他的選擇可能會為后期開發(fā)造成很大的麻煩。
但是,在這種特定的情況下,Linus是正確的。Linux內(nèi)核是一個(gè)特例,因?yàn)槠鋱?zhí)行速度要比向其他編譯器的可移植性遠(yuǎn)為重要。如果設(shè)計(jì)目標(biāo)是編寫一個(gè)可移植性好而不要求快速運(yùn)行的內(nèi)核,或者是編寫一個(gè)任何人都可以使用自己喜歡的編譯器進(jìn)行編譯的內(nèi)核,那么結(jié)論就可能會有所不同了;而這些恰好不是Linux的設(shè)計(jì)目標(biāo)。實(shí)際上,gcc幾乎可以為所有能夠運(yùn)行Linux的CPU生成代碼,因此,對于gcc的依賴并不是可移植性的嚴(yán)重障礙
8、。
在第3章中我們將對內(nèi)核設(shè)計(jì)目標(biāo)進(jìn)行詳細(xì)說明。
2.1.2內(nèi)核代碼習(xí)慣用語
內(nèi)核代碼中使用了一些顯著的習(xí)慣用語,本節(jié)將介紹常用的幾個(gè)。當(dāng)通讀源代碼時(shí),真正重要的問題并不在這些習(xí)慣用語本身,而是這種類型的習(xí)慣用語的確存在,而且是不斷被使用和發(fā)展的。如果你需要編寫內(nèi)核代碼,你應(yīng)該注意到內(nèi)核中所使用的習(xí)慣用語,并把這些習(xí)慣用語應(yīng)用到你的代碼中。當(dāng)通讀本書(或者代碼)時(shí),看看你還能找到多少習(xí)慣用語。
為了討論這些習(xí)慣用語,我們首先需要對它們進(jìn)行命名。為了便于討論,筆者創(chuàng)造了這些名字。而在實(shí)際中,大家不