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的符號鏈結。因此,體系結構無關部分的核心**可以使用如下形式包含體系相關部分的標頭檔案。
#includeinclude/linux/,與平台無關的標頭檔案都在這個目錄下面,它通常會被鏈結到目錄/usr/include/linux(或者它裡面的所有檔案會被複製到/usr/include/linux目錄下面)。因此使用者應用程式裡和核心**裡的語句:<
asm/some-file
>
#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等。
Linux核心原始碼目錄結構
在對linux核心學習的同時,我們首先應該對linux核心原始碼的目錄有一定的了解,下面是核心原始碼目錄的大概結構說明,根據核心版本的不同略有差異,不過不影響學習。以2.6.28.6核心原始碼為例 arch目錄包括了所有和體系結構相關的核心 它下面的每乙個子目錄都代表一種linux支援的體系結構,例...
linux核心原始碼目錄結構分析
注 本文是學習朱老師課程整理的筆記,基於linux2.6.35.7和九鼎x210bv3s開發板進行移植。arch。arch是architecture的縮寫。arch目錄下是好多個不同架構的cpu的子目錄,譬如arm這種cpu的所有檔案都在arch arm目錄下,x86的cpu的所有檔案都在arch ...
linux核心原始碼目錄結構分析
1 分析原始碼目錄下的單個檔案 1 kbuild,kbuild是kernel build的意思,就是核心編譯的意思。這個檔案就是linux核心特有的核心編譯體系需要用到的檔案。2 makefile,這個是linux核心的總makefile,整個核心工程用這個makefile來管理的。3 mk,是九鼎...