Linux原始碼目錄結構說明
3.3 核心原始碼目錄結構
瀏覽核心程式碼之前,有必要知道核心原始碼的整體分佈情況,按照慣例,核心程式碼安裝在/usr/src/linux目錄下,該目錄下的每一個子目錄都代表了一個特定的核心功能性子集,下面針對2.6.23版本進行簡單描述。
(1)Documentation。
這個目錄下面沒有核心程式碼,只有很多質量參差不齊的文件,但往往能夠給我們提供很多的幫助。
(2)arch。
所有與體系結構相關的程式碼都在這個目錄以及include/asm-*/目錄中,Linux支援的每種體系結構在arch目錄下都有對應的子目錄,而在每個體系結構特有的子目錄下又至少包含3個子目錄。
kernel:存放支援體系結構特有的諸如訊號量處理和SMP之類特徵的實現。
lib:存放體系結構特有的對諸如strlen和memcpy之類的通用函式的實現。
mm:存放體系結構特有的記憶體管理程式的實現。
除了這3個子目錄之外,大多數體系結構在必要的情況下還有一個boot子目錄,包含了在這種硬體平臺上啟動核心所使用的部分或全部平臺特有程式碼。
此外,大部分體系結構所特有的子目錄還根據需要包含了供附加特性使用的其他子目錄。比如,i386目錄包含一個math-emu子目錄,其中包括了在缺少數學協處理器(FPU)的CPU上執行模擬FPU的程式碼。
(3)drivers。
這個目錄是核心中最龐大的一個目錄,顯示卡、網絡卡、SCSI介面卡、PCI匯流排、USB匯流排和其他任何Linux支援的外圍裝置或匯流排的驅動程式都可以在這裡找到。
(4)fs。
虛擬檔案系統(VFS,Virtual File System)的程式碼,和各個不同檔案系統的程式碼都在這個目錄中。Linux支援的所有檔案系統在fs目錄下面都有一個對應的子目錄。比如ext2檔案系統對應的是fs/ext2目錄。
一個檔案系統是儲存裝置和需要訪問儲存裝置的程序之間的媒介。儲存裝置可能是本地的物理上可訪問的,比如硬碟或CD-ROM驅動器,它們分別使用ext2/ext3和isofs檔案系統;也可能是通過網路訪問的,使用NFS檔案系統。
還有一些虛擬檔案系統,比如proc,它以一個標準檔案系統出現,然而,它其中的檔案只存在於記憶體中,並不佔用磁碟空間。
(5)include。
這個目錄包含了核心中大部分的標頭檔案,它們按照下面的子目錄進行分組。
include/asm-*/,這樣的子目錄有多個,每一個都對應著一個arch的子目錄,比如include/asm-alpha、include/asm-arm、include/asm-i386等。每個子目錄中的檔案都定義了支援給定體系結構所必須的前處理器巨集和行內函數,這些行內函數多數都是全部或部分使用匯編語言實現的。
編譯核心時,系統會建立一個從include/asm目錄到目標體系結構特有的目錄的符號連結。比如對於arm平臺,就是include/asm-arm到include/asm的符號連結。因此,體系結構無關部分的核心程式碼可以使用如下形式包含體系相關部分的標頭檔案。
- #include <asm/some-file>
include/linux/,與平臺無關的標頭檔案都在這個目錄下面,它通常會被連結到目錄/usr/include/linux(或者它裡面的所有檔案會被複制到/usr/include/linux目錄下面)。因此使用者應用程式裡和核心程式碼裡的語句:
- #include <linux/some-file>
包含的標頭檔案的內容是一致的。
include目錄下的其他子目錄,在此不做贅述。
(6)init。
核心的初始化程式碼。包括main.c、建立早期使用者空間的程式碼以及其他初始化程式碼。
(7)ipc。
IPC,即程序間通訊(interprocess communication)。它包含了共享記憶體、訊號量以及其他形式IPC的程式碼。
(8)kernel。
核心中最核心的部分,包括程序的排程(kernel/sched.c),以及程序的建立和撤銷(kernel/fork.c和kernel/exit.c)等,和平臺相關的另外一部分核心的程式碼在arch/*/kernel目錄。
(9)lib。
庫程式碼,實現了一個標準C庫的通用子集,包括字串和記憶體操作的函式(strlen、mmcpy和其他類似的函式)以及有關sprintf和atoi的系列函式。與arch/lib下的程式碼不同,這裡的庫程式碼都是使用C編寫的,在核心新的移植版本中可以直接使用。
(10)mm。
包含了體系結構無關部分的記憶體管理程式碼,體系相關的部分位於arch/*/mm目錄下。
(11)net。
網路相關程式碼,實現了各種常見的網路協議,如TCP/IP、IPX等。
(12)scripts。
該目錄下沒有核心程式碼,只包含了用來配置核心的指令碼檔案。當執行make menuconfig或者make xconfig之類的命令配置核心時,使用者就是和位於這個目錄下的指令碼進行互動的。
(13)block。
block層的實現。最初block層的程式碼一部分位於drivers目錄,一部分位於fs目錄,從2.6.15開始,block層的核心程式碼被提取出來放在了頂層的block目錄。
(14)crypto。
核心本身所用的加密API,實現了常用的加密和雜湊演算法,還有一些壓縮和CRC校驗演算法。
(15)security。
這個目錄包括了不同的Linux安全模型的程式碼,比如NSA Security-Enhanced Linux。
(16)sound。
音效卡驅動以及其他聲音相關的程式碼。
(17)usr。
實現了用於打包和壓縮的的cpio等。