Linux內核源碼樹介紹
Linux內核簡介
Linux是一種開源的操作系統(tǒng)內核。它是一個用C語言寫成,符合POSIX標準的類Unix操作系統(tǒng)。Linux最早是由芬蘭大學生Linus Torvalds于1991年開發(fā)的一款全新的操作系統(tǒng)。那時,作為芬蘭赫爾辛基大學的一名學生的linus,正為不能隨心所欲使用強大而自由的Unix系統(tǒng)而苦惱。Linus熱衷于使用Minix,一種教學用的廉價Unix,但是,他不能輕易修改和發(fā)布該系統(tǒng)的源代碼,也不能對Minix開發(fā)者所作的設計進行修改,基于此linus開始了開發(fā)自己的操作系統(tǒng),并于1991年年底在internet上發(fā)布了早期版本,由此Linux內核誕生。Linux內核的主要功能有以下幾個方面:存儲管理、CPU和進程管理、文件系統(tǒng)、設備管理和驅動、網絡通信,以及系統(tǒng)的初始化、系統(tǒng)調用等。
獲取Linux內核源碼
通過Linux內核官網www.kernel.org下載自己需要的Linux內核源碼,筆者下載的是4.14版本的源碼。
Linux內核源碼樹展示
Linux內核源碼目錄和文件介紹
了解Linux內核源碼各個目錄和文件的作用,對于我們以后進行Linux內核源碼閱讀和Linux內核編程大有益處。
arch目錄
arch是architecture的縮寫,所有與體系結構相關的代碼都在這個目錄,Linux支持的每種體系結構在arch目錄下都有對應的子目錄,例如arm子目錄是arm32位體系相關代碼,arm64子目錄是arm64位體系相關代碼,x86子目錄是intel x86體系相關代碼。每個體系結構子目錄下又包含和啟動相關的代碼目錄boot,和內核配置相關的代碼目錄configs,和體系結構相關的頭文件目錄include,和具體體系結構相關的內存管理代碼目錄mm等。
block目錄
塊設備驅動所在目錄。塊設備是以數據塊方式發(fā)送和接收數據的設備。
certs目錄
認證相關的一些代碼實現。
crypto目錄
內核本身所用的加密API,實現了常用的加密和散列算法,還有一些壓縮和CRC校驗算法。例如SHA1加密算法的代碼。
Documentation目錄
內核幫助文檔目錄,是學習內核了解內核實現機制的重要途徑,關于內核的一些說明信息,在這個目錄下會有幫助手冊。
drivers目錄
各種設備驅動代碼、驅動架構代碼所在目錄,這個目錄是內核中最龐大的一個目錄,內核源碼數量的一半以上都是這個目錄貢獻的。顯卡、網卡、SCSI適配器、PCI總線、USB總線和其他任何Linux支持的外圍設備或總線的驅動程序都可以在這兒找到。
firmware目錄
fireware中包含了讓計算機讀取和理解從設備發(fā)來的信號的代碼。舉例來說,一個攝像頭管理它自己的硬件,但計算機必須了解攝像頭給計算機發(fā)送的信號。Linux系統(tǒng)會使用vicam固件(firmware)來理解攝像頭的通訊。否則,沒有了固件,Linux系統(tǒng)將不知道如何處理攝像頭發(fā)來的信息。另外,固件同樣有助于將Linux系統(tǒng)發(fā)送消息給該設備。這樣Linux系統(tǒng)可以告訴攝像頭重新調整或關閉攝像頭。
fs目錄
虛擬文件系統(tǒng)(VFS)的代碼和各種不同類型的文件系統(tǒng)的代碼都在這個目錄中。Linux支持的所有文件系統(tǒng)在fs目錄下面都有一個對應的子目錄。比如ext4文件系統(tǒng)對應的是fs/ext4目錄,fat文件系統(tǒng)對應的是fs/fat目錄。一個文件系統(tǒng)是存儲設備和需要訪問存儲設備的進程之間的媒介。存儲設備可能是本地的物理上可以訪問的設備,比如硬盤、U盤、Flash,他們分別使用系統(tǒng)ext4/UBIFS文件系統(tǒng)。還有一些虛擬文件系統(tǒng),比如proc、sysfs等,他們以一個標準文件系統(tǒng)出現。然而,他們的文件只存在于內存中,并不占磁盤空間。
include目錄
這個目錄包含了內核中大部分的頭文件,按照不同的功能分散在不同的子目錄下。例如與平臺相關的頭文件在/include/linux子目錄下。
init目錄
內核的初始化代碼。包括main.c、創(chuàng)建早期用戶空間的代碼及其他初始化代碼。do_mounts.c內核啟動后掛載根文件系統(tǒng)。
ipc目錄
IPC(進程間通信)。它包含了共享內存、信號量、消息隊列及其他形式的IPC代碼。
kernel目錄
內核中核心的部分,包括進程的調度(sched.c),以及進程的創(chuàng)建和撤銷(fork.c和exit.c)等。
lib目錄
此目錄包含了核心的庫代碼。實現了一個標準C庫的通用子集,包括字符串和內存操作的函數(strlen、mmcpy)以及有關sprintf和atoi系列函數。
mm目錄
此目錄包含了與體系結構無關的部分內存管理代碼。與體系結構相關的內存管理代碼位于arch目錄相對應的子目錄下的mm目錄。
net目錄
核心的網絡部分代碼,實現了各種常見的網絡協(xié)議,如TCP/IP。
samples目錄
一些內核編程的范例。
scripts目錄
該目錄下沒有內核代碼,只是包含了用來配置內核的腳本文件。當運行make menuconfig之類的命令配置內核時,用戶就是和位于這個目錄下的腳本進行交互的。
security目錄
這個目錄下包含了不同的Linux安全模型的代碼。它對計算機免于受到病毒和黑客的侵害很重要。包括SELinux安全模塊。
sound目錄
ALSA,OSS音頻設備的驅動核心代碼和常用設備驅動。
tools目錄
這個文件夾中包含了和內核交互的工具。
usr目錄
實現了用于打包和壓縮的cpio等。
virt目錄
內核虛擬化相關的代碼。包括kvm等。
COPYING文件
許可和授權信息。Linux內核在GPLv2許可證下授權。該許可證授予任何人有權免費去使用、修改、分發(fā)和共享源代碼和編譯代碼。
CREDITS文件
貢獻者列表
Kbuild文件
這是一個設置一些內核設定的腳本。例如設定一個ARCH變量,這是開發(fā)者想要生成的內核支持的處理器類型。
Kconfig文件
這個腳本會在開發(fā)人員配置內核的時候用到。
MAINTAINERS文件
這是一個目前維護者列表,他們的電子郵件地址,主頁,和他們負責開發(fā)和維護的內核的特定部分或文件。這是內核問題反饋的途徑。
Makefile文件
這個腳本是編譯內核的主要文件。這個文件將編譯參數和編譯所需的文件和必要的信息傳給編譯器。
README文件
這個文檔提供給開發(fā)者想要知道的如何編譯內核的信息。
總結
本文簡要介紹了Linux內核源碼樹下各個目錄的作用,以及它們主要實現了哪些功能,是我們以后進行Linux內核開發(fā)的基礎。
評論
查看更多