|
Linux源代碼目錄結(jié)構(gòu)說(shuō)明 系統(tǒng)核心組件: Linux源代碼目錄結(jié)構(gòu)示意圖: ![]() 圖:linux源代碼目錄結(jié)構(gòu)示意圖(一) scripts目錄: 該目錄中不包含任何核心代碼,該目錄下存放了用來(lái)配置內(nèi)核的腳本和應(yīng)用程序源碼。 (二) Lib目錄: 該目錄主要分兩部分:gnuzip加壓縮算法,用于在系統(tǒng)啟動(dòng)過程中將壓縮的內(nèi)核鏡像解壓縮;剩余的文件用于實(shí)現(xiàn)一個(gè)C庫(kù)的子集,主要包括字符串和內(nèi)存操作等相關(guān)函數(shù)。 (三) Mm目錄: 該目錄主要包含了和體系結(jié)構(gòu)無(wú)關(guān)的內(nèi)存管理代碼,包括通用的分頁(yè)模型的框架、伙伴算法的實(shí)現(xiàn)和對(duì)象緩沖器slab的實(shí)現(xiàn)代碼。這些代碼最終依賴具體的平臺(tái)完成相關(guān)操作。 (四) Include目錄: 這 個(gè)目錄包含linux源代碼目錄樹中絕大部分頭文件,每個(gè)體系架構(gòu)都在該目錄下對(duì)應(yīng)一個(gè)子目錄,該子目錄中包含了給定體系結(jié)構(gòu)所必需的宏定義和內(nèi)聯(lián)函數(shù)。 這些內(nèi)聯(lián)函數(shù)很多都是適用匯編語(yǔ)言實(shí)現(xiàn)的,而且在編譯內(nèi)核的過程中,首先會(huì)建立一個(gè)名稱為include/asm的符號(hào)鏈接,該鏈接指向目標(biāo)體系結(jié)構(gòu)在該 目錄中的子目錄,使得與體系結(jié)構(gòu)無(wú)關(guān)內(nèi)核代碼可以使用如下簡(jiǎn)潔的形式來(lái)引用語(yǔ)體系結(jié)構(gòu)相關(guān)的代碼為: #include “Linux/asm/xxx.h”除 了與體系結(jié)構(gòu)相關(guān)的頭文件之外,該目錄還用與存放于體系架構(gòu)無(wú)關(guān)的內(nèi)核模塊的頭文件,這些頭文件都是某一個(gè)內(nèi)核模塊對(duì)外提供的接口,供內(nèi)核其他模塊使用。 這些接口主要包含進(jìn)程管理訪問接口、內(nèi)存管理訪問接口、文件操作訪問接口、網(wǎng)絡(luò)訪問接口等,這些接口函數(shù)通常用于內(nèi)核模塊的編寫,如編寫設(shè)備驅(qū)動(dòng)程序或者 設(shè)計(jì)一個(gè)新的文件系統(tǒng)等。 (五) Init目錄: 該目錄中存放的是系統(tǒng)核心初始化代碼,內(nèi)核初始化入口函數(shù) start_kernel就是在該目錄下的文件main.c內(nèi)實(shí)現(xiàn)的。內(nèi)核初始化入口函數(shù)start_kernel負(fù)責(zé)調(diào)用其它模塊的初始化函數(shù),完成系 統(tǒng)的初始化工作。該目錄種存放的代碼還負(fù)責(zé)測(cè)試CPU性能,算出系統(tǒng)處理器的BogoMIPS值[w1] ,該值代表了處理器在一定時(shí)間執(zhí)行循環(huán)操作的次數(shù)。除此之外,該目錄還負(fù)責(zé)完成根文件系統(tǒng)初始化過程中的相關(guān)工作。 (六) Kernel目錄: 該 目錄存放的是linux內(nèi)核的最核心代碼,用于實(shí)現(xiàn)系統(tǒng)的核心模塊,這些模塊包括進(jìn)程管理、進(jìn)程調(diào)度器、中斷處理、系統(tǒng)時(shí)鐘管理、同步機(jī)制等。該目錄中的 代碼實(shí)現(xiàn)了這些核心模塊的主體框架,獨(dú)立于具體的平臺(tái)和系統(tǒng)架構(gòu)。核心模塊與平臺(tái)相關(guān)代碼存放在目錄arch中,具體看后面對(duì)該目錄的介紹。 (七) Arch目錄: 該目錄中每個(gè)子目錄都與某種體系結(jié)構(gòu)對(duì)應(yīng),用于存放系統(tǒng)結(jié)構(gòu)相關(guān)代碼,向平臺(tái)無(wú)關(guān)的系統(tǒng)核心模塊提供所需的功能接口。每個(gè)體系結(jié)構(gòu)對(duì)應(yīng)的子目錄下通常至少包含以下幾個(gè)子目錄: Kernel子目錄:用于存放特定體系結(jié)構(gòu)特有信號(hào)量的實(shí)現(xiàn)代碼和對(duì)稱多處理器(Symmetric MultiProccessing,簡(jiǎn)稱SMP)相關(guān)模塊。 Lib子目錄:用于存放以來(lái)依賴當(dāng)前體系結(jié)構(gòu)的輔助功能,如利用當(dāng)前體系結(jié)構(gòu)特性實(shí)現(xiàn)的strlen和memcpy內(nèi)存操作函數(shù);與通用的實(shí)現(xiàn)方法相比,他們的開銷小、更加高效。 Mm子目錄:用于存放體系架構(gòu)特定的內(nèi)存管理模塊,包括內(nèi)存的初始化、頁(yè)表管理等內(nèi)容。 Boot子目錄:該目錄中包含了當(dāng)前平臺(tái)上系統(tǒng)引導(dǎo)過程使用的部分或全部代碼。這部分代碼以來(lái)當(dāng)前平臺(tái),用于完成向系統(tǒng)內(nèi)存裝載內(nèi)核鏡像的工作。 系統(tǒng)次核心組件: Block目錄:該目錄用于實(shí)現(xiàn)塊設(shè)備的基本框架和塊設(shè)備的I/O調(diào)度算法。 Usr目錄:該目錄中的代碼為內(nèi)核尚未完全啟動(dòng)時(shí)執(zhí)行用戶空間代碼提供了支持。 Ipc目錄:用于實(shí)現(xiàn)System V的進(jìn)程間通信(Inter Process Communication,IPC)模塊。 Driver目錄:用于存放各類設(shè)備的驅(qū)動(dòng)程序。 Sound目錄:存放聲音系統(tǒng)架構(gòu)相關(guān)代碼和具體聲卡的設(shè)備驅(qū)動(dòng)程序。 Secturity目錄:用于存放安全框架的實(shí)現(xiàn)代碼 Crypto目錄:用于存放相關(guān)的加密算法 Documentation目錄:文檔目錄 [w1]MIPS:million instructions per second就是指每秒運(yùn)行多少百萬(wàn)條指令數(shù)。Bogo就是偽,bogoMIPS就是偽MIPS。這是linux中的測(cè)量處理器的性能。實(shí)現(xiàn)該功能的函數(shù)就bogoMips 3.3 內(nèi)核源碼目錄結(jié)構(gòu) 瀏覽內(nèi)核代碼之前,有必要知道內(nèi)核源碼的整體分布情況,按照慣例,內(nèi)核代碼安裝在/usr/src/linux目錄下,該目錄下的每一個(gè)子目錄都代表了一個(gè)特定的內(nèi)核功能性子集,下面針對(duì)2.6.23版本進(jìn)行簡(jiǎn)單描述。 (1)Documentation。 這個(gè)目錄下面沒有內(nèi)核代碼,只有很多質(zhì)量參差不齊的文檔,但往往能夠給我們提供很多的幫助。 (2)arch。 所有與體系結(jié)構(gòu)相關(guān)的代碼都在這個(gè)目錄以及include/asm-*/目錄中,Linux支持的每種體系結(jié)構(gòu)在arch目錄下都有對(duì)應(yīng)的子目錄,而在每個(gè)體系結(jié)構(gòu)特有的子目錄下又至少包含3個(gè)子目錄。 kernel:存放支持體系結(jié)構(gòu)特有的諸如信號(hào)量處理和SMP之類特征的實(shí)現(xiàn)。 lib:存放體系結(jié)構(gòu)特有的對(duì)諸如strlen和memcpy之類的通用函數(shù)的實(shí)現(xiàn)。 mm:存放體系結(jié)構(gòu)特有的內(nèi)存管理程序的實(shí)現(xiàn)。 除了這3個(gè)子目錄之外,大多數(shù)體系結(jié)構(gòu)在必要的情況下還有一個(gè)boot子目錄,包含了在這種硬件平臺(tái)上啟動(dòng)內(nèi)核所使用的部分或全部平臺(tái)特有代碼。 此外,大部分體系結(jié)構(gòu)所特有的子目錄還根據(jù)需要包含了供附加特性使用的其他子目錄。比如,i386目錄包含一個(gè)math-emu子目錄,其中包括了在缺少數(shù)學(xué)協(xié)處理器(FPU)的CPU上運(yùn)行模擬FPU的代碼。 (3)drivers。 這個(gè)目錄是內(nèi)核中最龐大的一個(gè)目錄,顯卡、網(wǎng)卡、SCSI適配器、PCI總線、USB總線和其他任何Linux支持的外圍設(shè)備或總線的驅(qū)動(dòng)程序都可以在這里找到。 (4)fs。 虛擬文件系統(tǒng)(VFS,Virtual File System)的代碼,和各個(gè)不同文件系統(tǒng)的代碼都在這個(gè)目錄中。Linux支持的所有文件系統(tǒng)在fs目錄下面都有一個(gè)對(duì)應(yīng)的子目錄。比如ext2文件系統(tǒng)對(duì)應(yīng)的是fs/ext2目錄。 一個(gè)文件系統(tǒng)是存儲(chǔ)設(shè)備和需要訪問存儲(chǔ)設(shè)備的進(jìn)程之間的媒介。存儲(chǔ)設(shè)備可能是本地的物理上可訪問的,比如硬盤或CD-ROM驅(qū)動(dòng)器,它們分別使用ext2/ext3和isofs文件系統(tǒng);也可能是通過網(wǎng)絡(luò)訪問的,使用NFS文件系統(tǒng)。 還有一些虛擬文件系統(tǒng),比如proc,它以一個(gè)標(biāo)準(zhǔn)文件系統(tǒng)出現(xiàn),然而,它其中的文件只存在于內(nèi)存中,并不占用磁盤空間。 (5)include。 這個(gè)目錄包含了內(nèi)核中大部分的頭文件,它們按照下面的子目錄進(jìn)行分組。 include/asm-*/,這樣的子目錄有多個(gè),每一個(gè)都對(duì)應(yīng)著一個(gè)arch的子目錄,比如include/asm-alpha、include/asm-arm、include/asm-i386等。每個(gè)子目錄中的文件都定義了支持給定體系結(jié)構(gòu)所必須的預(yù)處理器宏和內(nèi)聯(lián)函數(shù),這些內(nèi)聯(lián)函數(shù)多數(shù)都是全部或部分使用匯編語(yǔ)言實(shí)現(xiàn)的。 編譯內(nèi)核時(shí),系統(tǒng)會(huì)建立一個(gè)從include/asm目錄到目標(biāo)體系結(jié)構(gòu)特有的目錄的符號(hào)鏈接。比如對(duì)于arm平臺(tái),就是include/asm-arm到include/asm的符號(hào)鏈接。因此,體系結(jié)構(gòu)無(wú)關(guān)部分的內(nèi)核代碼可以使用如下形式包含體系相關(guān)部分的頭文件。
include/linux/,與平臺(tái)無(wú)關(guān)的頭文件都在這個(gè)目錄下面,它通常會(huì)被鏈接到目錄/usr/include/linux(或者它里面的所有文件會(huì)被復(fù)制到/usr/include/linux目錄下面)。因此用戶應(yīng)用程序里和內(nèi)核代碼里的語(yǔ)句:
包含的頭文件的內(nèi)容是一致的。 include目錄下的其他子目錄,在此不做贅述。 (6)init。 內(nèi)核的初始化代碼。包括main.c、創(chuàng)建早期用戶空間的代碼以及其他初始化代碼。 (7)ipc。 IPC,即進(jìn)程間通信(interprocess communication)。它包含了共享內(nèi)存、信號(hào)量以及其他形式IPC的代碼。 (8)kernel。 內(nèi)核中最核心的部分,包括進(jìn)程的調(diào)度(kernel/sched.c),以及進(jìn)程的創(chuàng)建和撤銷(kernel/fork.c和kernel/exit.c)等,和平臺(tái)相關(guān)的另外一部分核心的代碼在arch/*/kernel目錄。 (9)lib。 庫(kù)代碼,實(shí)現(xiàn)了一個(gè)標(biāo)準(zhǔn)C庫(kù)的通用子集,包括字符串和內(nèi)存操作的函數(shù)(strlen、mmcpy和其他類似的函數(shù))以及有關(guān)sprintf和atoi的系列函數(shù)。與arch/lib下的代碼不同,這里的庫(kù)代碼都是使用C編寫的,在內(nèi)核新的移植版本中可以直接使用。 (10)mm。 包含了體系結(jié)構(gòu)無(wú)關(guān)部分的內(nèi)存管理代碼,體系相關(guān)的部分位于arch/*/mm目錄下。 (11)net。 網(wǎng)絡(luò)相關(guān)代碼,實(shí)現(xiàn)了各種常見的網(wǎng)絡(luò)協(xié)議,如TCP/IP、IPX等。 (12)scripts。 該目錄下沒有內(nèi)核代碼,只包含了用來(lái)配置內(nèi)核的腳本文件。當(dāng)運(yùn)行make menuconfig或者make xconfig之類的命令配置內(nèi)核時(shí),用戶就是和位于這個(gè)目錄下的腳本進(jìn)行交互的。 (13)block。 block層的實(shí)現(xiàn)。最初block層的代碼一部分位于drivers目錄,一部分位于fs目錄,從2.6.15開始,block層的核心代碼被提取出來(lái)放在了頂層的block目錄。 (14)crypto。 內(nèi)核本身所用的加密API,實(shí)現(xiàn)了常用的加密和散列算法,還有一些壓縮和CRC校驗(yàn)算法。 (15)security。 這個(gè)目錄包括了不同的Linux安全模型的代碼,比如NSA Security-Enhanced Linux。 (16)sound。 聲卡驅(qū)動(dòng)以及其他聲音相關(guān)的代碼。 (17)usr。 實(shí)現(xiàn)了用于打包和壓縮的的cpio等。 |
|
|