內核源碼結構

 轉自asdfasdfzxc:

瀏覽內核代碼之前,有必要知道內核源碼的整體分佈情況,按照慣例,內核代碼安裝在/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

  include/linux/,與平臺無關的頭文件都在這個目錄下面,它通常會被鏈接到目錄/usr/include/linux(或者它裏面的所有文件會被複制到/usr/include/linux目錄下面)。因此用戶應用程序裏和內核代碼裏的語句:

  #include

  包含的頭文件的內容是一致的。

  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等。

閱讀(299) | 評論(0) | 轉發(1) |
0

上一篇:printk信息打印

下一篇:安裝linux源碼

評論熱議
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章