當前位置:首頁 > 嵌入式培訓(xùn) > 嵌入式學(xué)習(xí) > 講師博文 > 細說Linux內(nèi)核目錄結(jié)構(gòu)
Linux內(nèi)核源碼有幾千萬行,包含源文件和工程文件有48374個
浩瀚的源碼該如何入手?我們學(xué)習(xí)和研究linux內(nèi)核必須掌握一定的方法,才能夠提高效率,做到事半功倍,首先我們必須先了解linux內(nèi)核的主要目錄。
下面內(nèi)核目錄以linux-3.14內(nèi)核作為講解
1、documentation:
提供文檔幫助。關(guān)于內(nèi)核的一些說明信息,在這個目錄下會有幫助手冊。
比如linux-3.14-fs4412/Documentation/devicetree/bindings/interrupt-controller/interrupts.txt
該文件講解了關(guān)于設(shè)備數(shù)節(jié)點 中斷設(shè)備interrupts屬性的cell的詳細說明。
只要根據(jù)文件夾名字,便可查找到我們所需的說明文檔。
2、arch:
arch是architecture的縮寫。所有與體系結(jié)構(gòu)相關(guān)的代碼都在這個目錄以
include/asm-*/目錄中。Linux支持的每種體系結(jié)構(gòu)在arch目錄下都有對應(yīng)的目錄,又進一
步分解為boot,mm,kernel等子目錄:
|--arm arm及與之相兼容體系結(jié)構(gòu)的子目錄
|--boot 引導(dǎo)程序,以及在這種硬件平臺上啟動內(nèi)核所使用的內(nèi)存管理程序的實現(xiàn)。
|--compressed 內(nèi)核解壓縮
|--tools 生成壓縮內(nèi)核映像的程序
| --kernel: 存放支持體系結(jié)構(gòu)特有的諸如信號量處理和SMP之類特征的實現(xiàn)。
| --lib: 存放體系結(jié)構(gòu)特有的對諸如strlen和memcpy之類的通用函數(shù)的實現(xiàn)。
| --mm: 存放體系結(jié)構(gòu)特有的內(nèi)存管理程序的實現(xiàn)。
除了這3個子目錄以外,大多數(shù)體系結(jié)構(gòu)在必要的情況下還有一個boot子目錄,包括了在這種硬件平臺上啟動內(nèi)核所使用的內(nèi)存管理程序的實現(xiàn)。
3、drivers:
驅(qū)動代碼,驅(qū)動是一個控制硬件的軟件。這個目錄是內(nèi)核中龐大的一個目錄,顯卡、網(wǎng)卡、SCSI適配器、PCI總線、USB總線和其他任何Linux支持的外圍設(shè)備或總線的驅(qū)動程序都可以在這兒找到。
4、fs:
虛擬文件系統(tǒng)(VFS)的代碼,和各個不同文件系統(tǒng)的代碼都在這個目錄中。Linux支持的所有文件系統(tǒng)在fs目錄下面都有一個對應(yīng)的子目錄。比如ext2文件系統(tǒng)對應(yīng)的是fs/ext2目錄。
一個文件系統(tǒng)是存儲設(shè)備和需要訪問存儲設(shè)備的進程之間的媒介。存儲設(shè)備可能是本地的物理上可以訪問的,比如硬盤或者CD-ROM驅(qū)動器,他們分別使用而系統(tǒng)ext2/ext3和isofs文件系統(tǒng)。
還有一些虛擬文件系統(tǒng)(proc),它是一個標準文件系統(tǒng)出現(xiàn)。然而,他其中的文件只存在于內(nèi)存中,并不占磁盤空間。
5、include:
這個目錄包含了內(nèi)核中大部分的頭文件,它按照下面的子目錄進行分組。要修改處理器結(jié)構(gòu)則只需編輯核心的makefile并重新運行Linux核心配置程序。
| include/asm-*/ 每一個對應(yīng)著一個arch的子目錄,比如include/asm-alpha、
Include/asm-arm等。每個子目錄中的文件都定義了支持給定體系結(jié)構(gòu)所必要的預(yù)處理函數(shù)和內(nèi)聯(lián)函數(shù),這些內(nèi)聯(lián)函數(shù)多數(shù)都是全部或者部分的匯編語言實現(xiàn)。
| include/linux 與平臺無關(guān)的頭文件都在這個目錄下,它通常會被鏈接到目錄
/usr/include/linux(或者它里面的所有文件都會被復(fù)制到/usrinclude/linux目錄下邊)
6、init:
內(nèi)核的初始化代碼。包括main.c、創(chuàng)建早起用戶空間的代碼及其他初始化代碼。
7、ipc:
IPC(進程間通信)。它包含了共享內(nèi)存、信號量及其他形式的IPC代碼。
8、kernel:
內(nèi)核中核心的部分,包括進程的調(diào)度(sched.c),以及進程的創(chuàng)建和撤銷(fork.c和exit.c)和平臺相關(guān)的另外一部分核心代碼在arch/*/kernel目錄下。
9、mm
此目錄包含了與體系無關(guān)的部分內(nèi)存管理代碼。與體系結(jié)構(gòu)相關(guān)的內(nèi)存管理代碼位于arch/*/mm下。
10、net
核心的網(wǎng)絡(luò)部分代碼,實現(xiàn)了各種常見的網(wǎng)絡(luò)協(xié)議,入TCP/IP、IPX等。
11、lib
此目錄包含了核心的庫代碼。實現(xiàn)了一個標準C庫的通用子集,包括字符串和內(nèi)存操作的函數(shù)(strlen、mmcpy等)以及有關(guān)sprintf和atoi系列函數(shù)。與arch/lib下的代碼不同,這里的庫代碼都是C編寫的,在內(nèi)核新的移植版本中可以直接使用。與處理器結(jié)構(gòu)相關(guān)庫代碼被放在arch/mm中。
12、block:
塊設(shè)備驅(qū)動包括IDE(在ide.c中)驅(qū)動。塊設(shè)備是以數(shù)據(jù)塊方式接收和發(fā)送的數(shù)據(jù)的設(shè)備。初block層代碼一部分位于drivers目錄,一部分位于fs目錄。從2.6.15開始,block層的核心代碼就被提取出來放在頂層的block目錄中。如果你想尋找這些可包含文件系統(tǒng)的設(shè)備的初始化過程則應(yīng)該在drivers/block/genhd.c中的device_setup()。當安裝一個nfs文件系統(tǒng)時不但要初始化硬盤還需初始化網(wǎng)絡(luò)。塊設(shè)備包括IDE與SCSI設(shè)備。
13、firmware
fireware中包含了讓計算機讀取和理解從設(shè)備發(fā)來的信號的代碼。舉例來說,一個攝像頭管理它自己的硬件,但計算機必須了解攝像頭給計算機發(fā)送的信號。Linux系統(tǒng)會使用vicam固件(firmware)來理解攝像頭的通訊。否則,沒有了固件,Linux系統(tǒng)將不知道如何處理攝像頭發(fā)來的信息。另外,固件同樣有助于將Linux系統(tǒng)發(fā)送消息給該設(shè)備。這樣Linux系統(tǒng)可以告訴攝像頭重新調(diào)整或關(guān)閉攝像頭。
14、usr:
實現(xiàn)用于打包和壓縮的cpio等。這個文件夾中的代碼在內(nèi)核編譯完成后創(chuàng)建這些文件。
15、securtity:
這個目錄下包含了不同的Linux安全模型的代碼。它對計算機免于受到病毒和黑客的侵害很重要。否則,Linux系統(tǒng)可能會遭到損壞。
16、crypto:
內(nèi)核本身所用的加密API,實現(xiàn)了常用的加密和散列算法,還有一些壓縮和CRC校驗算法。例:“sha1_generic.c”這個文件包含了SHA1加密算法的代碼。
17、scripts:
該目錄下沒有內(nèi)核代碼,只是包含了用來配置內(nèi)核的腳本文件。當運行make menuconfig或者make xconfig之類的命令配置內(nèi)核時,用戶就是和位于這個目錄下的腳本進行交互的。
18、sound:
聲卡驅(qū)動以及其他聲音相關(guān)的源碼。
19、samples
一些內(nèi)核編程的范例
20、virt
此文件夾包含了虛擬化代碼,它允許用戶一次運行多個操作系統(tǒng)。通過虛擬化,客戶機操作系統(tǒng)就像任何其他運行在Linux主機的應(yīng)用程序一樣運行。
21、tools
這個文件夾中包含了和內(nèi)核交互的工具。
COPYING:許可和授權(quán)信息。Linux內(nèi)核在GPLv2許可證下授權(quán)。該許可證授予任何人有權(quán)免費去使用、修改、分發(fā)和共享源代碼和編譯代碼。然而,沒有人可以出售源代碼。
CREDITS : 貢獻者列表
Kbuild : 這是一個設(shè)置一些內(nèi)核設(shè)定的腳本。打個比方,這個腳本設(shè)定一個ARCH變量,這是開發(fā)者想要生成的內(nèi)核支持的處理器類型。
Kconfig: 這個腳本會在開發(fā)人員配置內(nèi)核的時候用到
MAINTAINERS : 這是一個目前維護者列表,他們的電子郵件地址,主頁,和他們負責開發(fā)和維護的內(nèi)核的特定部分或文件。當一個開發(fā)者在內(nèi)核中發(fā)現(xiàn)一個問題,并希望能夠報告給能夠處理這個問題的維護者時,這是是很有用的。
Makefile :這個腳本是編譯內(nèi)核的主要文件。這個文件將編譯參數(shù)和編譯所需的文件和必要的信息傳給編譯器。
README : 這個文檔提供給開發(fā)者想要知道的如何編譯內(nèi)核的信息。
REPORTING-BUGS : 這個文檔提供如何報告問題的信息。
內(nèi)核的代碼是以“.c”或“.h”為擴展名的文件。 “.c”的擴展名表明內(nèi)核是用眾多的編程語言之一的C語言寫的, “h”的文件是頭文件,而他們也是用C寫成。頭文件包含了許多“.c”文件需要使用的代碼,因為他們可以引入已有的代碼而不是重新編寫代碼,這節(jié)省了程序員的時間。否則,一組執(zhí)行相同的動作的代碼,將存在許多或全部都是“c”文件。這也會消耗和浪費硬盤空間。(譯注:頭文件不僅僅可節(jié)省重復(fù)編碼,而且代碼復(fù)用也會降低代碼錯誤的幾率)