2019/4/10 9:22:22
Linux的(de)最大(dà)的(de)好處之一就是它的(de)源碼公開(kāi)。
Linux的(de)最大(dà)的(de)好處之一就是它的(de)源碼公開(kāi)。同時,公開(kāi)的(de)核心源碼也(yě)吸引著(zhe)無數的(de)電腦(nǎo)愛好者和(hé)程序員;他(tā)們把解讀(dú)和(hé)分(fēn)析Linux的(de)核心源碼作爲自己的(de)最大(dà)興趣,把修改Linux源碼和(hé)改造Linux系統作爲自己對計(jì)算機技術(shù)追求的(de)最大(dà)目标。
Linux内核源碼是很具吸引力的(de),特别是當你(nǐ)弄懂了一個(gè)分(fēn)析了好久都(dōu)沒搞懂的(de)問題;或者是被你(nǐ)修改過了的(de)内核,順利通過編譯,一切運行(xíng)正常的(de)時候。那種成就感真是油然而生!而且,對内核的(de)分(fēn)析,除了出自對技術(shù)的(de)狂熱(rè)追求之外,這種令人(rén)生畏的(de)勞動所帶來的(de)回報也(yě)是非常令人(rén)著(zhe)迷的(de),這也(yě)正是它擁有(yǒu)衆多追随者的(de)主要原因:
首先,你(nǐ)可(kě)以從中學到(dào)很多的(de)計(jì)算機的(de)底層知識,如(rú)後面将講到(dào)的(de)系統的(de)引導和(hé)硬件(jiàn)提供的(de)中斷機制(zhì)等;其它,象虛拟存儲的(de)實現機制(zhì),多任務機制(zhì),系統保護機制(zhì)等等,這些都(dōu)是非都(dōu)源碼不能(néng)體會(huì)的(de)。
同時,你(nǐ)還将從操作系統的(de)整體結構中,體會(huì)整體設計(jì)在軟件(jiàn)設計(jì)中的(de)份量和(hé)作用(yòng),以及一些宏觀設計(jì)的(de)方法和(hé)技巧:Linux的(de)内核爲上(shàng)層應用(yòng)提供一個(gè)與具體硬件(jiàn)不相(xiàng)關的(de)平台;同時在内核内部,它又(yòu)把代碼分(fēn)爲與體系結構和(hé)硬件(jiàn)相(xiàng)關的(de)部分(fēn),和(hé)可(kě)移植的(de)部分(fēn);再例如(rú),Linux雖然不是微内核的(de),但(dàn)他(tā)把大(dà)部分(fēn)的(de)設備驅動處理(lǐ)成相(xiàng)對獨立的(de)内核模塊,這樣減小(xiǎo)了内核運行(xíng)的(de)開(kāi)銷,增強了内核代碼的(de)模塊獨立性。
而且你(nǐ)還能(néng)從對内核源碼的(de)分(fēn)析中,體會(huì)到(dào)它在解決某個(gè)具體細節問題時,方法的(de)巧妙:如(rú)後面将分(fēn)析到(dào)了的(de)Linux通過Botoom_half機制(zhì)來加快系統對中斷的(de)處理(lǐ)。
最重要的(de)是:在源碼的(de)分(fēn)析過程中,你(nǐ)将會(huì)被一點一點地(dì)、潛移默化地(dì)專業(yè)化。一個(gè)專業(yè)的(de)程序員,總是把代碼的(de)清晰性,兼容性,可(kě)移植性放(fàng)在很重要的(de)位置。他(tā)們總是通過定義大(dà)量的(de)宏,來增強代碼的(de)清晰度和(hé)可(kě)讀(dú)性,而又(yòu)不增加編譯後的(de)代碼長度和(hé)代碼的(de)運行(xíng)效率;他(tā)們總是在編碼的(de)同時,就考慮到(dào)了以後的(de)代碼維護和(hé)升級。 甚至,隻要分(fēn)析百分(fēn)之一的(de)代碼後,你(nǐ)就會(huì)深刻地(dì)體會(huì)到(dào),什(shén)麽樣的(de)代碼才是一個(gè)專業(yè)的(de)程序員寫的(de),什(shén)麽樣的(de)代碼是一個(gè)業(yè)餘愛好者寫的(de)。而這一點是任何沒有(yǒu)真正分(fēn)析過标準代碼的(de)人(rén)都(dōu)無法體會(huì)到(dào)的(de)。
然而,由于内核代碼的(de)冗長,和(hé)内核體系結構的(de)龐雜,所以分(fēn)析内核也(yě)是一個(gè)很艱難,很需要毅力的(de)事;在缺乏指導和(hé)交流的(de)情況下,尤其如(rú)此。隻有(yǒu)方法正确,才能(néng)事半功倍。正是基于這種考慮,作者希望通過此文(wén)能(néng)給大(dà)家一些借鑒和(hé)啓迪。
由于本人(rén)所進行(xíng)的(de)分(fēn)析都(dōu)是基于2.2.5版本的(de)内核;所以,如(rú)果沒有(yǒu)特别說明(míng),以下分(fēn)析都(dōu)是基于i386單處理(lǐ)器(qì)的(de)2.2.5版本的(de)Linux内核。所有(yǒu)源文(wén)件(jiàn)均是相(xiàng)對于目錄/usr/src/linux的(de)。
要分(fēn)析Linux内核源碼,首先必須找到(dào)各個(gè)模塊的(de)位置,也(yě)即要弄懂源碼的(de)文(wén)件(jiàn)組織形式。雖然對于有(yǒu)經驗的(de)高(gāo)手而言,這個(gè)不是很難;但(dàn)對于很多初級的(de)Linux愛好者,和(hé)那些對源碼分(fēn)析很有(yǒu)興趣但(dàn)接觸不多的(de)人(rén)來說,這還是很有(yǒu)必要的(de)。
1、Linux核心源程序通常都(dōu)安裝在/usr/src/linux下,而且它有(yǒu)一個(gè)非常簡單的(de)編号約定:任何偶數的(de)核心(的(de)二個(gè)數爲偶數,例如(rú)2.0.30)都(dōu)是一個(gè)穩定地(dì)發行(xíng)的(de)核心,而任何奇數的(de)核心(例如(rú)2.1.42)都(dōu)是一個(gè)開(kāi)發中的(de)核心。
2、核心源程序的(de)文(wén)件(jiàn)按樹形結構進行(xíng)組織,在源程序樹的(de)最上(shàng)層,即目錄/usr/src/linux下有(yǒu)這樣一些目錄和(hé)文(wén)件(jiàn)。
◆ COPYING: GPL版權申明(míng)。對具有(yǒu)GPL版權的(de)源代碼改動而形成的(de)程序,或使用(yòng)GPL工(gōng)具産生的(de)程序,具有(yǒu)使用(yòng)GPL發表的(de)義務,如(rú)公開(kāi)源代碼。
◆ CREDITS: 光(guāng)榮榜。對Linux做出過很大(dà)貢獻的(de)一些人(rén)的(de)信息。
◆ MAINTAINERS: 維護人(rén)員列表,對當前版本的(de)内核各部分(fēn)都(dōu)有(yǒu)誰負責。
◆ Makefile: 第一個(gè)Makefile文(wén)件(jiàn)。用(yòng)來組織内核的(de)各模塊,記錄了個(gè)模塊間的(de)相(xiàng)互這間的(de)聯系和(hé)依托關系,編譯時使用(yòng);仔細閱讀(dú)各子目錄下的(de)Makefile文(wén)件(jiàn)對弄清各個(gè)文(wén)件(jiàn)這間的(de)聯系和(hé)依托關系很有(yǒu)幫助。
◆ ReadMe: 核心及其編譯配置方法簡單介紹。
◆ Rules.make: 各種Makefilemake所使用(yòng)的(de)一些共同規則。
◆ REPORTING-BUGS:有(yǒu)關報告Bug 的(de)一些内容。
● Arch/ :arch子目錄包括了所有(yǒu)和(hé)體系結構相(xiàng)關的(de)核心代碼。它的(de)每一個(gè)子目錄都(dōu)代表一種支持的(de)體系結構,例如(rú)i386就是關于intel cpu及與之相(xiàng)兼容體系結構的(de)子目錄。PC機一般都(dōu)基于此目錄;
● Include/: include子目錄包括編譯核心所需要的(de)大(dà)部分(fēn)頭文(wén)件(jiàn)。與平台無關的(de)頭文(wén)件(jiàn)在 include/linux子目錄下,與 intel cpu相(xiàng)關的(de)頭文(wén)件(jiàn)在include/asm-i386子目錄下,而include/scsi目錄則是有(yǒu)關scsi設備的(de)頭文(wén)件(jiàn)目錄。
● Init/: 這個(gè)目錄包含核心的(de)初始化代碼(注:不是系統的(de)引導代碼),包含兩個(gè)文(wén)件(jiàn)main.c和(hé)Version.c,這是研究核心如(rú)何工(gōng)作的(de)好的(de)起點之一。
● Mm/:這個(gè)目錄包括所有(yǒu)獨立于 cpu 體系結構的(de)内存管理(lǐ)代碼,如(rú)頁式存儲管理(lǐ)内存的(de)分(fēn)配和(hé)釋放(fàng)等;而和(hé)體系結構相(xiàng)關的(de)内存管理(lǐ)代碼則位于arch/*/mm/,例如(rú)arch/i386/mm/Fault.c。
● Kernel/:主要的(de)核心代碼,此目錄下的(de)文(wén)件(jiàn)實現了大(dà)多數linux系統的(de)内核函數,其中最重要的(de)文(wén)件(jiàn)當屬sched.c;同樣,和(hé)體系結構相(xiàng)關的(de)代碼在arch/*/kernel中。
● Drivers/: 放(fàng)置系統所有(yǒu)的(de)設備驅動程序;每種驅動程序又(yòu)各占用(yòng)一個(gè)子目錄:如(rú),/block 下爲塊設備驅動程序,比如(rú)ide (ide.c)。如(rú)果你(nǐ)希望查看所有(yǒu)可(kě)能(néng)包含文(wén)件(jiàn)系統的(de)設備是如(rú)何初始化的(de),你(nǐ)可(kě)以看drivers/block/genhd.c中的(de) device_setup()。它不僅初始化硬盤,也(yě)初始化網絡,因爲安裝nfs文(wén)件(jiàn)系統的(de)時候需要網絡。
● Documentation/: 文(wén)檔目錄,沒有(yǒu)内核代碼,隻是一套有(yǒu)用(yòng)的(de)文(wén)檔,可(kě)惜都(dōu)是English的(de),看看應該有(yǒu)用(yòng)的(de)哦。
● Fs/: 所有(yǒu)的(de)文(wén)件(jiàn)系統代碼和(hé)各種類型的(de)文(wén)件(jiàn)操作代碼,它的(de)每一個(gè)子目錄支持一個(gè)文(wén)件(jiàn)系統, 例如(rú)fat和(hé)ext2。
● Ipc/: 這個(gè)目錄包含核心的(de)進程間通訊的(de)代碼。
● Lib/: 放(fàng)置核心的(de)庫代碼。
● Net/: 核心與網絡相(xiàng)關的(de)代碼。
● Modules/: 模塊文(wén)件(jiàn)目錄,是個(gè)空目錄,用(yòng)于存放(fàng)編譯時産生的(de)模塊目标文(wén)件(jiàn)。
● Scripts/: 描述文(wén)件(jiàn),腳本,用(yòng)于對核心的(de)配置。
一般,在每個(gè)子目錄下,都(dōu)有(yǒu)一個(gè) Makefile 和(hé)一個(gè)Readme 文(wén)件(jiàn),仔細閱讀(dú)這兩個(gè)文(wén)件(jiàn),對内核源碼的(de)理(lǐ)解很有(yǒu)用(yòng)。
對Linux内核源碼的(de)分(fēn)析,有(yǒu)幾個(gè)很好的(de)入口點:一個(gè)就是系統的(de)引導和(hé)初始化,即從機器(qì)加電到(dào)系統核心的(de)運行(xíng);另外一個(gè)就是系統調用(yòng),系統調用(yòng)是用(yòng)戶程序或操作調用(yòng)核心所提供的(de)功能(néng)的(de)接口。對于那些對硬件(jiàn)比較熟悉的(de)愛好者,從系統的(de)引導入手進行(xíng)分(fēn)析,可(kě)能(néng)來的(de)容易一些;而從系統調用(yòng)下口,則可(kě)能(néng)更合适于那些在dos或Uinx、Linux下有(yǒu)過C編程經驗的(de)高(gāo)手。
深圳市南山區南山街(jiē)道南海(hǎi)大(dà)道西(xī)桂廟路(lù)北陽光(guāng)華藝大(dà)廈1棟4F、4G-04
咨詢電話(huà):136 8237 6272
大(dà)客戶咨詢:139 0290 5075
業(yè)務QQ:195006118
技術(shù)QQ:179981967