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