|  | |
| 如何分析Linux內核源碼 | |
| 不少程序員把解讀和分析(xi)(xi)Linux的(de)核(he)(he)心(xin)源(yuan)碼作為(wei)自己的(de)大興趣,把修改Linux源(yuan)碼和改造Linux系(xi)統(tong)作為(wei)自己對計算(suan)機技術(shu)追求的(de)大目標。 不過(guo),由于Linux內(nei)(nei)核(he)(he)代碼的(de)冗長,和Linux內(nei)(nei)核(he)(he)體系(xi)結(jie)構的(de)龐雜,所以分析(xi)(xi)Linux內(nei)(nei)核(he)(he)也是(shi)一個很(hen)艱難,很(hen)需要(yao)毅(yi)力的(de)事;在缺乏指(zhi)導(dao)和交流的(de)情況(kuang)下,尤其(qi)如此(ci)。那么,到(dao)底該如何(he)分析(xi)(xi)Linux內(nei)(nei)核(he)(he)源(yuan)碼呢(ni)? 要分(fen)析Linux內(nei)核源(yuan)(yuan)碼,首先必須找到各個模塊的(de)(de)(de)位置(zhi),也即要弄懂源(yuan)(yuan)碼的(de)(de)(de)文件組織形式。雖(sui)然對(dui)于(yu)有經驗的(de)(de)(de)高手(shou)而言,這(zhe)個不(bu)是很難;但對(dui)于(yu)很多初級的(de)(de)(de)Linux愛好(hao)者(zhe),和那些對(dui)源(yuan)(yuan)碼分(fen)析很有興(xing)趣但接觸不(bu)多的(de)(de)(de)人來說,這(zhe)還是很有必要的(de)(de)(de)。 1、Linux核(he)(he)(he)心源程序通常都安裝(zhuang)在/usr/src/linux下,而(er)且它有一(yi)(yi)個非常簡單的(de)編號約定:任(ren)何偶(ou)數的(de)核(he)(he)(he)心(的(de)二個數為偶(ou)數,例(li)如2.0.30)都是(shi)一(yi)(yi)個穩定地發行的(de)核(he)(he)(he)心,而(er)任(ren)何奇數的(de)核(he)(he)(he)心(例(li)如2.1.42)都是(shi)一(yi)(yi)個開發中(zhong)的(de)核(he)(he)(he)心。 2、核(he)心源程序的文(wen)件按樹形(xing)結構(gou)進行組(zu)織,在源程序樹的上層(ceng),即目(mu)錄/usr/src/linux下有(you)這樣一些目(mu)錄和文(wen)件: (1) COPYING: GPL版權申明(ming)。對(dui)具(ju)有GPL版權的(de)源(yuan)代碼改動而形成的(de)程(cheng)(cheng)序,或使用GPL工具(ju)產生的(de)程(cheng)(cheng)序,具(ju)有使用GPL發(fa)表(biao)的(de)義務,如公開源(yuan)代碼; (2) CREDITS: 光榮榜。對(dui)Linux做出過很大貢獻的一些人的信息(xi); (3) MAINTAINERS: 維護人員(yuan)列表(biao),對當前版(ban)本的內核各部分都有誰(shui)負責;   (4) Makefile: 第一(yi)個Makefile文(wen)件。用來組織內核(he)的(de)各(ge)(ge)模塊(kuai),記(ji)錄了(le)個模塊(kuai)間(jian)的(de)相互這間(jian)的(de)聯系和(he)依(yi)托關系,編(bian)譯時使(shi)用;仔細閱(yue)讀各(ge)(ge)子目(mu)錄下的(de)Makefile文(wen)件對弄清各(ge)(ge)個文(wen)件這間(jian)的(de)聯系和(he)依(yi)托關系很有幫(bang)助; (5) ReadMe: 核心及(ji)其(qi)編譯(yi)配置(zhi)方法(fa)簡單介紹; (6) Rules.make: 各種Makefilemake所(suo)使(shi)用的一些共同(tong)規(gui)則;   (7) REPORTING-BUGS:有(you)關報告Bug 的一(yi)些內容; ● Arch/ :arch子(zi)目(mu)錄(lu)包括了(le)所(suo)有和體(ti)系(xi)(xi)結構(gou)相關(guan)的核(he)心代(dai)碼(ma)。它的每一個子(zi)目(mu)錄(lu)都代(dai)表一種(zhong)支(zhi)持的體(ti)系(xi)(xi)結構(gou),例(li)如i386就(jiu)是關(guan)于intel cpu及與之相兼(jian)容(rong)體(ti)系(xi)(xi)結構(gou)的子(zi)目(mu)錄(lu)。PC機(ji)一般都基于此目(mu)錄(lu); ● Include/: include子(zi)目錄(lu)包括編譯核心所需(xu)要(yao)的大部分頭文件。與平(ping)臺無關的頭文件在 include/linux子(zi)目錄(lu)下,與 intel cpu相關的頭文件在include/asm-i386子(zi)目錄(lu)下,而include/scsi目錄(lu)則是有關scsi設(she)備的頭文件目錄(lu); ● Init/: 這(zhe)個目錄包含(han)核心(xin)的(de)初始化代碼(注:不是系統的(de)引導代碼),包含(han)兩個文件(jian)main.c和(he)Version.c,這(zhe)是研究核心(xin)如何工作的(de)好的(de)起點(dian)之一。 ● Mm/:這個目錄包括(kuo)所有獨立于 cpu 體(ti)系結構的內(nei)(nei)存管理代碼,如(ru)(ru)頁式存儲管理內(nei)(nei)存的分(fen)配和釋放等;而(er)和體(ti)系結構相關的內(nei)(nei)存管理代碼則(ze)位于arch/*/mm/,例(li)如(ru)(ru)arch/i386/mm/Fault.c; ● Kernel/:主要的(de)核心代(dai)碼,此目錄下的(de)文(wen)件實現了大多數linux系(xi)統的(de)內核函數,其(qi)中(zhong)重要的(de)文(wen)件當(dang)屬sched.c;同樣,和體系(xi)結構相關(guan)的(de)代(dai)碼在arch/*/kernel中(zhong); ● Drivers/: 放置系(xi)統(tong)所有(you)(you)的(de)設備(bei)(bei)驅動程序(xu);每種驅動程序(xu)又各占用一個子目(mu)錄:如,/block 下為塊設備(bei)(bei)驅動程序(xu),比如ide(ide.c)。如果你希(xi)望查看所有(you)(you)可(ke)能包含(han)文(wen)件(jian)系(xi)統(tong)的(de)設備(bei)(bei)是如何初始(shi)(shi)化的(de),你可(ke)以看drivers/block/genhd.c中的(de)device_setup()。它不僅初始(shi)(shi)化硬盤,也初始(shi)(shi)化網絡,因為安裝(zhuang)nfs文(wen)件(jian)系(xi)統(tong)的(de)時候需要網絡; ● Documentation/: 文檔目(mu)錄,沒有內核代碼,只是(shi)一套有用(yong)的文檔,可惜都(dou)是(shi)English的,看看應該有用(yong)的哦; ● Fs/: 所有的(de)文件系統代碼(ma)和(he)各(ge)種類(lei)型的(de)文件操(cao)作代碼(ma),它的(de)每一個子目(mu)錄支持(chi)一個文件系統, 例如fat和(he)ext2; ● Ipc/: 這(zhe)個目錄(lu)包含核心的進程(cheng)間通訊的代碼; ● Lib/: 放置核心的庫(ku)代碼; ● Net/: 核心與網絡相關的代(dai)碼; ● Modules/: 模(mo)塊(kuai)文件(jian)目錄(lu),是個空目錄(lu),用于存放(fang)編譯時產生的模(mo)塊(kuai)目標文件(jian);  ● Scripts/: 描(miao)述文件(jian),腳本,用于(yu)對核(he)心(xin)的配置; 一般,在(zai)每個(ge)子目錄下,都有一個(ge) Makefile 和(he)一個(ge)Readme 文件,仔細(xi)閱讀這兩(liang)個(ge)文件,對內核(he)源碼的理(li)解很有用。 對Linux內核源碼的(de)(de)(de)分析,有幾個(ge)很好(hao)的(de)(de)(de)入口(kou)(kou)點:一(yi)個(ge)就(jiu)是(shi)(shi)系(xi)統(tong)(tong)(tong)(tong)的(de)(de)(de)引(yin)導和(he)初(chu)始化(hua),即從(cong)(cong)機(ji)器(qi)加電(dian)到系(xi)統(tong)(tong)(tong)(tong)核心的(de)(de)(de)運行;另外一(yi)個(ge)就(jiu)是(shi)(shi)系(xi)統(tong)(tong)(tong)(tong)調用,系(xi)統(tong)(tong)(tong)(tong)調用是(shi)(shi)用戶程(cheng)序(xu)或(huo)操(cao)作調用核心所提供的(de)(de)(de)功(gong)能的(de)(de)(de)接口(kou)(kou)。對于那(nei)些(xie)(xie)對硬(ying)件比較熟悉的(de)(de)(de)愛好(hao)者,從(cong)(cong)系(xi)統(tong)(tong)(tong)(tong)的(de)(de)(de)引(yin)導入手進(jin)行分析,可能來的(de)(de)(de)容易一(yi)些(xie)(xie);而從(cong)(cong)系(xi)統(tong)(tong)(tong)(tong)調用下口(kou)(kou),則可能更合適于那(nei)些(xie)(xie)在dos或(huo)Uinx、Linux下有過C編程(cheng)經驗(yan)的(de)(de)(de)高(gao)手。 熱(re)點鏈接(jie): 
         1、Linux內核模塊程序結構 |