亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來(lái)到蟲(chóng)蟲(chóng)下載站! | ?? 資源下載 ?? 資源專(zhuān)輯 ?? 關(guān)于我們
? 蟲(chóng)蟲(chóng)下載站

?? 2.txt

?? Linux內(nèi)核源代碼的介紹
?? TXT
字號(hào):
第2章   代 碼 初 識(shí)本章首先從較高層次介紹Linux內(nèi)核源程序的概況,這些都是大家關(guān)心的一些基本特點(diǎn)。隨后將簡(jiǎn)要介紹一些實(shí)際代碼。最后介紹如何編譯內(nèi)核。2.1   Linux內(nèi)核源程序的部分特點(diǎn)在過(guò)去的一段時(shí)期,Linux內(nèi)核同時(shí)使用C語(yǔ)言和匯編語(yǔ)言來(lái)實(shí)現(xiàn)。這兩種語(yǔ)言需要一定的平衡:C語(yǔ)言編寫(xiě)的代碼移植性較好、易于維護(hù),而匯編語(yǔ)言編寫(xiě)的程序則速度較快。一般只有在速度是關(guān)鍵因素或者一些因平臺(tái)相關(guān)特性而產(chǎn)生的特殊要求(例如直接和內(nèi)存管理硬件進(jìn)行通訊)時(shí)才使用匯編語(yǔ)言。正如實(shí)際中所做的,即使內(nèi)核并未使用C++的對(duì)象特性,部分內(nèi)核也可以在g++(GNU的C++編譯器)下進(jìn)行編譯。同其他面向?qū)ο蟮木幊陶Z(yǔ)言相比較,相對(duì)而言C++的開(kāi)銷(xiāo)是較低的,但是對(duì)于內(nèi)核開(kāi)發(fā)人員來(lái)說(shuō),這已經(jīng)是太多了。內(nèi)核開(kāi)發(fā)人員不斷發(fā)展編程風(fēng)格,形成了Linux代碼獨(dú)有的特色。本節(jié)將討論其中的一些問(wèn)題。2.1.1   gcc特性的使用Linux內(nèi)核被設(shè)計(jì)為必須使用GNU的C編譯器gcc來(lái)編譯,而不是任何一種C編譯器都可以使用。內(nèi)核代碼有時(shí)要使用gcc特性,本書(shū)將陸續(xù)介紹其中的一部分。一些gcc特有代碼只是簡(jiǎn)單地使用gcc語(yǔ)言擴(kuò)展,例如允許在C(不只是C++)中使用inline關(guān)鍵字指示內(nèi)聯(lián)函數(shù)。也就是說(shuō),代碼中被調(diào)用的函數(shù)在每次函數(shù)調(diào)用時(shí)都會(huì)被擴(kuò)充,因而就可以節(jié)約實(shí)際函數(shù)調(diào)用的開(kāi)銷(xiāo)。一般情況下,代碼的編寫(xiě)方式比較復(fù)雜。因?yàn)閷?duì)于某些類(lèi)型的輸入,gcc能夠產(chǎn)生比其他輸入效率更高的執(zhí)行代碼。從理論上講,編譯器可以?xún)?yōu)化具有相同功能的兩種對(duì)等的方法,并且得到相同的結(jié)果。因此,代碼的編寫(xiě)方式是無(wú)關(guān)緊要的。但在實(shí)際上,用某種方法編寫(xiě)所產(chǎn)生的代碼要比用另外一些方法編寫(xiě)所產(chǎn)生的代碼執(zhí)行速度快許多。內(nèi)核開(kāi)發(fā)人員知道怎樣才能產(chǎn)生更高效的執(zhí)行代碼,這不斷地在他們編寫(xiě)的代碼中反映出來(lái)。例如,考慮內(nèi)核中經(jīng)常使用的goto語(yǔ)句—為了提高速度,內(nèi)核中經(jīng)常大量使用這種一般要避免使用的語(yǔ)句。在本書(shū)中所包含的不到40 000行代碼中,一共有500多條goto語(yǔ)句,大約是每80行一個(gè)。除匯編文件外,精確的統(tǒng)計(jì)數(shù)字是接近每72行一個(gè)goto語(yǔ)句。公平地說(shuō),這是選擇偏向的結(jié)果:比例如此高的原因之一是本書(shū)中涉及的是內(nèi)核源程序的核心,在這里速度比其他因素都需要優(yōu)先考慮。整個(gè)內(nèi)核的比例大概是每260行一個(gè)goto語(yǔ)句。然而,這仍然是我不再使用Basic進(jìn)行編程以來(lái)見(jiàn)過(guò)的使用goto頻率最高的地方。代碼必需受特定編譯器限制的特性不僅與普通應(yīng)用程序的開(kāi)發(fā)有很大不同,而且也不同于大多數(shù)內(nèi)核的開(kāi)發(fā)。大多數(shù)的開(kāi)發(fā)人員使用C語(yǔ)言編寫(xiě)代碼來(lái)保持較高的可移植性,即使在編寫(xiě)操作系統(tǒng)時(shí)也是如此。這樣做的優(yōu)點(diǎn)是顯而易見(jiàn)的,最為重要的一點(diǎn)是一旦出現(xiàn)更好的編譯器,程序員們可以隨時(shí)進(jìn)行更換。內(nèi)核對(duì)于gcc特性的完全依賴(lài)使得內(nèi)核向新的編譯器上移植更加困難。最近Linus對(duì)這一問(wèn)題在有關(guān)內(nèi)核的郵件列表上表明了自己的觀點(diǎn):“記住,編譯器只是一個(gè)工具。”這是對(duì)依賴(lài)于gcc特性的一個(gè)很好的基本思想的表述:編譯器只是為了完成工作。如果通過(guò)遵守標(biāo)準(zhǔn)還不能達(dá)到工作要求,那么就不是工作要求有問(wèn)題,而是對(duì)于標(biāo)準(zhǔn)的依賴(lài)有問(wèn)題。在大多數(shù)情況下,這種觀點(diǎn)是不能被人所接受的。通常情況下,為了保證和程序語(yǔ)言標(biāo)準(zhǔn)的一致,開(kāi)發(fā)人員可能需要犧牲某些特性、速度或者其他相關(guān)因素。其他的選擇可能會(huì)為后期開(kāi)發(fā)造成很大的麻煩。但是,在這種特定的情況下,Linus是正確的。Linux內(nèi)核是一個(gè)特例,因?yàn)槠鋱?zhí)行速度要比向其他編譯器的可移植性遠(yuǎn)為重要。如果設(shè)計(jì)目標(biāo)是編寫(xiě)一個(gè)可移植性好而不要求快速運(yùn)行的內(nèi)核,或者是編寫(xiě)一個(gè)任何人都可以使用自己喜歡的編譯器進(jìn)行編譯的內(nèi)核,那么結(jié)論就可能會(huì)有所不同了;而這些恰好不是Linux的設(shè)計(jì)目標(biāo)。實(shí)際上,gcc幾乎可以為所有能夠運(yùn)行Linux的CPU生成代碼,因此,對(duì)于gcc的依賴(lài)并不是可移植性的嚴(yán)重障礙。在第3章中我們將對(duì)內(nèi)核設(shè)計(jì)目標(biāo)進(jìn)行詳細(xì)說(shuō)明。2.1.2   內(nèi)核代碼習(xí)慣用語(yǔ)內(nèi)核代碼中使用了一些顯著的習(xí)慣用語(yǔ),本節(jié)將介紹常用的幾個(gè)。當(dāng)通讀源代碼時(shí),真正重要的問(wèn)題并不在這些習(xí)慣用語(yǔ)本身,而是這種類(lèi)型的習(xí)慣用語(yǔ)的確存在,而且是不斷被使用和發(fā)展的。如果你需要編寫(xiě)內(nèi)核代碼,你應(yīng)該注意到內(nèi)核中所使用的習(xí)慣用語(yǔ),并把這些習(xí)慣用語(yǔ)應(yīng)用到你的代碼中。當(dāng)通讀本書(shū)(或者代碼)時(shí),看看你還能找到多少習(xí)慣用語(yǔ)。為了討論這些習(xí)慣用語(yǔ),我們首先需要對(duì)它們進(jìn)行命名。為了便于討論,筆者創(chuàng)造了這些名字。而在實(shí)際中,大家不一定非要參考這些用語(yǔ),它們只是對(duì)內(nèi)核工作方式的描述而已。一個(gè)普通的習(xí)慣用語(yǔ),筆者稱(chēng)之為“資源獲取”(resource acquisition idiom)。在這個(gè)用語(yǔ)中,一個(gè)函數(shù)必須實(shí)現(xiàn)一系列資源的獲取,包括內(nèi)存、鎖等等(這些資源的類(lèi)型未必相同)。只有成功地獲取當(dāng)前所需要的資源之后,才能處理后面的資源請(qǐng)求。最后,該函數(shù)還必須釋放所有已經(jīng)獲取的資源,而不必考慮沒(méi)有獲取的資源。我采用“錯(cuò)誤變量”這一用語(yǔ)(error variable idiom)來(lái)輔助說(shuō)明資源獲取用語(yǔ),它使用一個(gè)臨時(shí)變量來(lái)記錄函數(shù)的期望返回值。當(dāng)然,相當(dāng)多的函數(shù)都能實(shí)現(xiàn)這個(gè)功能。但是錯(cuò)誤變量的不同點(diǎn)在于它通常是用來(lái)處理由于速度的因素而變得非常復(fù)雜的流程控制中的問(wèn)題。錯(cuò)誤變量有兩個(gè)典型的值,0(表示成功)和負(fù)數(shù)(表示有錯(cuò))。這兩個(gè)用語(yǔ)結(jié)合使用,我們就可以十分自然地得到符合模式的代碼如下:(注意變量err是使用錯(cuò)誤變量的一個(gè)明確實(shí)例,同樣,諸如out之類(lèi)的標(biāo)號(hào)則指明了資源獲取用語(yǔ)的使用。)如果執(zhí)行到標(biāo)號(hào)out2,則都已經(jīng)獲取了r1和r2資源,而且也都需要進(jìn)行釋放。如果執(zhí)行到標(biāo)號(hào)out1(不管是順序執(zhí)行還是使用goto語(yǔ)句進(jìn)行跳轉(zhuǎn)到),則r2資源是無(wú)效的(也可能剛被釋放),但是r1資源卻是有效的,而且必需在此將其釋放。同理,如果標(biāo)號(hào)out能被執(zhí)行,則r1和r2資源都無(wú)效,err所返回的是錯(cuò)誤或成功標(biāo)志。在這個(gè)簡(jiǎn)單的例子中,對(duì)err的一些賦值是沒(méi)有必要的。在實(shí)踐中,實(shí)際代碼必須遵守這種模式。這樣做的原因主要在于同一行中可能包含有多種測(cè)試,而這些測(cè)試應(yīng)該返回相同的錯(cuò)誤代碼,因此對(duì)錯(cuò)誤變量統(tǒng)一賦值要比多次賦值更為簡(jiǎn)單。雖然在這個(gè)例子中對(duì)于這種屬性的必要性并不非常迫切,但是我還是傾向于保留這種特點(diǎn)。有關(guān)的實(shí)際應(yīng)用可以參考sys_shmctl(第21654行),在第9章中還將詳細(xì)介紹這個(gè)例子。2.1.3   減少#if和#ifdef的使用現(xiàn)在的Linux內(nèi)核已經(jīng)移植到不同的平臺(tái)上,但是我們還必須解決移植過(guò)程中所出現(xiàn)的問(wèn)題。大部分支持各種不同平臺(tái)的代碼由于包含許多預(yù)處理代碼而已經(jīng)變得非常不規(guī)范,例如:這個(gè)例子試圖實(shí)現(xiàn)操作系統(tǒng)的可移植性,雖然Linux關(guān)注的焦點(diǎn)很明顯是實(shí)現(xiàn)代碼在各種CPU上的可移植性,但是二者的基本原理是一致的。對(duì)于這類(lèi)問(wèn)題來(lái)說(shuō),預(yù)處理器是一種錯(cuò)誤的解決方式。這些雜亂的問(wèn)題使得代碼晦澀難懂。更為糟糕的是,增加對(duì)新平臺(tái)的支持有可能要求重新遍歷這些雜亂分布的低質(zhì)量代碼段(實(shí)際上你很難能找到這類(lèi)代碼段的全部)。與現(xiàn)有方式不同的是,Linux一般通過(guò)簡(jiǎn)單函數(shù)(或者是宏)調(diào)用來(lái)抽象出不同平臺(tái)間的差異。內(nèi)核的移植可以通過(guò)實(shí)現(xiàn)適合于相應(yīng)平臺(tái)的函數(shù)(或宏)來(lái)實(shí)現(xiàn)。這樣不僅使代碼的主體簡(jiǎn)單易懂,而且在移植的過(guò)程中還可以比較容易地自動(dòng)檢測(cè)出你沒(méi)有注意到的內(nèi)容:如引用未聲明函數(shù)時(shí)會(huì)出現(xiàn)鏈接錯(cuò)誤。有時(shí)用預(yù)處理器來(lái)支持不同的體系結(jié)構(gòu),但這種方式并不常用,而相對(duì)于代碼風(fēng)格的變化就更是微不足道了。順便說(shuō)一下,我們可以注意到這種解決方法和使用用戶(hù)對(duì)象(或者C語(yǔ)言中充滿(mǎn)函數(shù)指針的struct結(jié)構(gòu))來(lái)代替離散的switch語(yǔ)句處理不同類(lèi)型的方法十分相似。在某些層次上,這些問(wèn)題和解決方法是統(tǒng)一的。可移植性的問(wèn)題并不僅限于平臺(tái)和CPU的移植,編譯器也是一個(gè)重要的問(wèn)題。此處為了簡(jiǎn)化,假設(shè)Linux只使用gcc來(lái)編譯。由于Linux只使用同一個(gè)編譯器,所以就沒(méi)有必要使用#if塊(或者#ifdef塊)來(lái)選擇不同的編譯器。內(nèi)核代碼主要使用#ifdef來(lái)區(qū)分需要編譯或不需要編譯的部分,從而對(duì)不同的結(jié)構(gòu)提供支持。例如,代碼經(jīng)常測(cè)試SMP宏是否定義過(guò),從而決定是否支持SMP機(jī)。2.2   代碼樣例了解Linux代碼風(fēng)格最好的方法就是實(shí)際研究一下它的部分代碼。即使你不完全理解本節(jié)所討論代碼的細(xì)節(jié)也無(wú)關(guān)緊要,畢竟本節(jié)的主要目的不是理解代碼,一些讀者可以只對(duì)本節(jié)進(jìn)行瀏覽。本節(jié)的主要目的是讓讀者對(duì)Linux代碼進(jìn)行初步了解,為今后的工作提供必要基礎(chǔ)。該討論將涉及部分廣泛使用的內(nèi)核代碼。2.2.1   printkprintk(25836行)是內(nèi)核內(nèi)部消息日志記錄函數(shù)。在出現(xiàn)諸如內(nèi)核檢測(cè)到其數(shù)據(jù)結(jié)構(gòu)出現(xiàn)不一致的事件時(shí),內(nèi)核會(huì)使用printk把相關(guān)信息打印到系統(tǒng)控制臺(tái)上。對(duì)于printk的調(diào)用一般分為如下幾類(lèi):

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲男同性恋视频| 国产精品久久久爽爽爽麻豆色哟哟| 免费观看在线综合| 中文字幕亚洲精品在线观看| 91精品国产综合久久精品| a亚洲天堂av| 捆绑变态av一区二区三区| 最新国产の精品合集bt伙计| 欧美v日韩v国产v| 欧美日韩一本到| 99久久er热在这里只有精品66| 麻豆国产91在线播放| 亚洲国产日韩在线一区模特| 国产精品久久久久桃色tv| 精品国产青草久久久久福利| 欧美人狂配大交3d怪物一区 | 国产91对白在线观看九色| 丝袜亚洲另类欧美| 一区二区三区.www| 1000部国产精品成人观看| 国产亚洲欧美激情| 精品久久久久久久久久久久久久久| 欧美午夜视频网站| 欧美最猛黑人xxxxx猛交| 99re这里只有精品6| 成人一区二区三区| 国产精品亚洲а∨天堂免在线| 美女一区二区三区在线观看| 亚洲国产成人av| 亚洲无线码一区二区三区| 亚洲精品国产精华液| 国产精品初高中害羞小美女文| 久久精品亚洲乱码伦伦中文| 2023国产一二三区日本精品2022| 欧美一级高清片在线观看| 欧美喷水一区二区| 欧美一区二区黄色| 欧美一区二区视频网站| 日韩丝袜情趣美女图片| 精品免费日韩av| 久久人人爽爽爽人久久久| 久久人人爽人人爽| 日本一区二区三区四区 | 丝袜美腿成人在线| 五月婷婷综合在线| 日韩成人一区二区| 蜜臀91精品一区二区三区| 日本少妇一区二区| 国产一区二区0| 高清日韩电视剧大全免费| 成人高清av在线| 91亚洲精品乱码久久久久久蜜桃| 色综合av在线| 欧美日韩国产综合一区二区| 欧美日韩国产高清一区二区| 欧美一级黄色片| 久久综合九色综合欧美就去吻| 久久久久88色偷偷免费| 亚洲视频一二三区| 亚洲一二三区在线观看| 日韩高清不卡在线| 国产一区二区三区香蕉| 成人免费毛片嘿嘿连载视频| 色一情一乱一乱一91av| 欧美日本一区二区三区四区| 日韩欧美综合一区| 国产精品久久免费看| 一区二区三区高清在线| 免费的成人av| 成人午夜免费av| 欧美日韩一区精品| 久久久久免费观看| 亚洲永久免费视频| 国内成人免费视频| 日本道色综合久久| 日韩午夜在线播放| 亚洲男人都懂的| 六月丁香婷婷色狠狠久久| 成人动漫视频在线| 91精品国产综合久久精品性色| www激情久久| 亚洲国产欧美在线| 国产美女主播视频一区| 在线观看视频一区二区| 日韩三级精品电影久久久 | 日本视频免费一区| 粗大黑人巨茎大战欧美成人| 精品视频123区在线观看| 国产欧美一区二区在线观看| 首页亚洲欧美制服丝腿| 大白屁股一区二区视频| 欧美一区欧美二区| 亚洲男人电影天堂| 国产精品一区二区你懂的| 欧美亚洲日本一区| 国产欧美在线观看一区| 蜜乳av一区二区三区| 日本福利一区二区| 国产日产欧产精品推荐色| 免费视频最近日韩| 色欧美乱欧美15图片| 国产日韩欧美麻豆| 免费日本视频一区| 日本二三区不卡| 中文字幕在线免费不卡| 国产真实乱子伦精品视频| 欧美日韩国产一区二区三区地区| 国产精品美女久久久久久久| 激情另类小说区图片区视频区| 777色狠狠一区二区三区| 亚洲少妇最新在线视频| 国产成人av一区二区三区在线观看| 3751色影院一区二区三区| 亚洲免费伊人电影| 成人h动漫精品一区二区 | 午夜久久电影网| 日本高清不卡aⅴ免费网站| 国产欧美视频一区二区三区| 九色|91porny| 欧美一二三四区在线| 亚洲成人1区2区| 色天天综合色天天久久| 中文字幕亚洲一区二区va在线| 国产一区二区三区综合| 精品99999| 国内精品久久久久影院一蜜桃| 日韩欧美一级精品久久| 日韩av网站在线观看| 欧美精品aⅴ在线视频| 亚洲成人在线网站| 欧美在线观看视频一区二区三区| ㊣最新国产の精品bt伙计久久| 成人晚上爱看视频| 国产精品国产三级国产普通话蜜臀| 国产乱淫av一区二区三区| 亚洲精品在线观看视频| 国产自产2019最新不卡| 久久众筹精品私拍模特| 国产一区二区女| 欧美经典三级视频一区二区三区| 国产成人在线影院| 中文字幕国产一区| 欧美一区二区三区免费观看视频| 亚洲成年人影院| 日韩欧美激情一区| 国产乱人伦精品一区二区在线观看 | 欧美做爰猛烈大尺度电影无法无天| 一区二区成人在线视频 | 欧美一区二区三区日韩| 蜜桃久久久久久| 久久午夜羞羞影院免费观看| 国产激情精品久久久第一区二区 | 精品剧情在线观看| 国产露脸91国语对白| 国产精品狼人久久影院观看方式| 99久久精品国产网站| 一区二区日韩av| 日韩精品一区二区三区视频 | 欧美三级资源在线| 美腿丝袜亚洲三区| 国产色综合久久| 91色|porny| 日韩国产欧美三级| 久久影院视频免费| 91在线云播放| 琪琪久久久久日韩精品| 国产欧美日韩麻豆91| 一本色道久久综合亚洲91| 亚洲国产sm捆绑调教视频| 精品国产麻豆免费人成网站| 成人国产视频在线观看| 午夜精品123| 中文在线一区二区| 欧美日韩激情一区二区| 国产69精品一区二区亚洲孕妇| 亚洲一二三级电影| 精品国产免费人成在线观看| 91麻豆精品秘密| 蜜乳av一区二区三区| 亚洲丝袜美腿综合| 精品久久久久一区| 欧美在线一区二区| 精彩视频一区二区| 亚洲一级二级三级在线免费观看| 欧美xxxx在线观看| 欧美视频在线一区| 丰满少妇在线播放bd日韩电影| 亚洲成人av福利| 中文字幕一区二区三区四区| 精品久久久久久最新网址| 欧美伊人精品成人久久综合97| 国产乱人伦精品一区二区在线观看| 亚洲成a人在线观看| 亚洲欧美一区二区在线观看| 日韩精品一区二区三区视频| 在线亚洲一区二区| 懂色av一区二区三区免费看| 日本成人在线看| 亚洲综合另类小说| 国产精品视频线看|