- Android底層接口與驅動開發技術詳解
- 陳強
- 1661字
- 2019-10-12 15:38:30
1.6.1 源碼目錄結構
Linux內核源碼的官方下載地址為http://www.kernel.org/,如圖1-5所示。

圖1-5 Linux內核官方下載界面
當下載內核代碼后,很有必要知道內核源碼的整體分布情況。通常其內核代碼保存在/usr/src/linux目錄下,該目錄下的每一個子目錄都代表一個特定的內核功能性子集。接下來針對Linux3.4版本進行簡單描述。
(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
在此目錄中保存了虛擬文件系統(Virtual File System,VFS)的代碼,還有各個不同文件系統的代碼。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的符號鏈接。因此,體系結構無關部分的內核代碼可以使用如下形式包含體系相關部分的頭文件。
(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、memcpy和其他類似的函數)以及有關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目錄,從Linux 2.6.15開始,block層的核心代碼被提取出來放在頂層的block目錄。
(14)目錄crypto
在此目錄中保存內核本身所用的加密API信息,實現了常用的加密和散列算法,還有一些壓縮和CRC校驗算法。
(15)目錄security
在此目錄下包括不同的Linux安全模型的代碼,如NSA Security-Enhanced Linux等。
(16)目錄sound
在此目錄下保存聲卡驅動及其他聲音相關的代碼。
(17)目錄usr
此目錄實現了用于打包和壓縮的cpio等。
- Learn Blockchain Programming with JavaScript
- Android Jetpack開發:原理解析與應用實戰
- CockroachDB權威指南
- Hands-On Machine Learning with scikit:learn and Scientific Python Toolkits
- 深入淺出Spring Boot 2.x
- Vue.js 3.x從入門到精通(視頻教學版)
- Mastering Articulate Storyline
- Hands-On Enterprise Automation with Python.
- Learning Apache Mahout Classification
- Mastering Apache Maven 3
- Android應用案例開發大全(第二版)
- Mastering Backbone.js
- Programming with CodeIgniterMVC
- LabVIEW虛擬儀器入門與測控應用100例
- Web App Testing Using Knockout.JS