戴文的Linux內核專題:02 源代碼
在下載並解壓內核源代碼後,用戶可以看到許多文件夾和文件。嘗試去找一個特定的文件或許是一個挑戰。謝天謝地,源代碼以一個特定的方式組織的。這使開發者能夠輕鬆找到任何文件或者內核的一部分。
內核源代碼的根目錄下包含了以下文件夾
arch
block
crypto
Documentation
drivers
firmware
fs
include
init
ipc
kernel
lib
mm
net
samples
scripts
security
sound
tools
usr
virt
還有一些文件在源代碼的根目錄下。它們會在下面列出。
COPYING -許可和授權信息。Linux內核在GPLv2許可證下授權。該許可證授予任何人有權免費去使用、修改、分發和共享源代碼和編譯代碼。然而,沒有人可以出售源代碼。
CREDITS - 貢獻者列表
Kbuild - 這是一個設置一些內核設定的腳本。打個比方,這個腳本設定一個ARCH變數,這是開發者想要生成的內核支持的處理器類型。
Kconfig - 這個腳本會在開發人員配置內核的時候用到,這會在以後的文章中討論。
MAINTAINERS - 這是一個目前維護者列表,他們的電子郵件地址,主頁,和他們負責開發和維護的內核的特定部分或文件。當一個開發者在內核中發現一個問題,並希望能夠報告給能夠處理這個問題的維護者時,這是是很有用的。
Makefile - This script is the main file that is used to compile the kernel. This file passes parameters to the compiler as well as the list of files to compile and any other necessary information. 這個腳本是編譯內核的主要文件。這個文件將編譯參數和編譯所需的文件和必要的信息傳給編譯器。
README - 這個文檔提供給開發者想要知道的如何編譯內核的信息。
REPORTING-BUGS - 這個文檔提供如何報告問題的信息。
內核的代碼是以「.c」或「.h」為擴展名的文件。 「.c」的擴展名表明內核是用眾多的編程語言之一的C語言寫的, 「h」的文件是頭文件,而他們也是用C寫成。頭文件包含了許多「.c」文件需要使用的代碼,因為他們可以引入已有的代碼而不是重新編寫代碼,這節省了程序員的時間。否則,一組執行相同的動作的代碼,將存在許多或全部都是「c」文件。這也會消耗和浪費硬碟空間。(譯註:頭文件不僅僅可節省重複編碼,而且代碼復用也會降低代碼錯誤的幾率)
所有上面列出的文件夾中的文件都組織得很好。文件夾名稱至少可以幫助開發人員很好地猜測文件夾中的內容。下面提供了一個目錄樹和描述。
arch - 這個文件夾包含了一個Kconfig文件,它用於設置這個目錄里的源代碼編譯所需的一系列設定。每個支持的處理器架構都在它相應的文件夾中。如,Alpha處理器的源代碼在alpha文件夾中。請記住,隨著時間的推移,一些新的處理器將被支持,有些會被放棄。對於Linux v3.9.4,arch下有以下文件夾:
alpha
arc
arm
arm64
avr32
blackfin
c6x
cris
frv
h8300
hexagon
ia64
m32r
m68k
metag
microblaze
mips
mn10300
openrisc
parisc
powerpc
s390
score
sh
sparc
tile
um
unicore32
x86
xtensa
block – 此文件夾包含塊設備驅動程序的代碼。塊設備是以數據塊方式接收和發送的數據的設備。數據塊都是一塊一塊的數據而不是持續的數據流。
crypto - 這個文件夾包含許多加密演算法的源代碼。例如,「sha1_generic.c」這個文件包含了SHA1加密演算法的代碼。
Documentation - 此文件夾包含了內核信息和其他許多文件信息的文本文檔。如果開發者需要一些信息,他們也許能在這裡找到所需要的信息。
drivers - 該目錄包含了驅動代碼。驅動是一個控制硬體的軟體。例如,要讓計算機知道鍵盤並使其可用,鍵盤驅動是必要的。這個文件夾中存在許多文件夾。每個文件夾都以硬體的種類或者型號命名。例如,'bluetooth'包含了藍牙驅動程序的代碼。還有其他很明顯的驅動像SCSI、USB和火線等。有些驅動程序可能會比較難找到。例如,操縱桿驅動不在'joystick'文件夾中,它們卻在./drivers/input/joystick。同樣鍵盤和滑鼠驅動也在這個input文件夾中。 'Macintosh'包含了蘋果的硬體代碼。 'Xen'包含了Xen hypervisor代碼。(hypervisor是一種允許用戶在一台計算機上運行多個操作系統的軟體或硬體。這意味著在Xen允許用戶在一台計算機上同時運行的兩個或兩個以上的Linux系統。用戶還可以運行Windows,Solaris,FreeBSD或其他操作系統在Linux系統上。)driver文件夾下還有許多其他的文件夾,但他們在這篇文章中無法一一列舉,他們將在以後的文章中提到。
firmware - fireware中包含了讓計算機讀取和理解從設備發來的信號的代碼。舉例來說,一個攝像頭管理它自己的硬體,但計算機必須了解攝像頭給計算機發送的信號。Linux系統會使用vicam固件(firmware)來理解攝像頭的通訊。否則,沒有了固件,Linux系統將不知道如何處理攝像頭髮來的信息。另外,固件同樣有助於將Linux系統發送消息給該設備。這樣Linux系統可以告訴攝像頭重新調整或關閉攝像頭。
fs - 這是文件系統的文件夾。理解和使用的文件系統所需要的所有的代碼就在這裡。在這個文件夾里,每種文件系統都有自己的文件夾。例如,ext4文件系統的代碼在ext4文件夾內。 在fs文件夾內,開發者會看到一些不在文件夾中的文件。這些文件用來控制整個文件系統。例如,mount.h中會包含掛載文件系統的代碼。文件系統是以結構化的方式來存儲和管理的存儲設備上的文件和目錄。每個文件系統都有自己的優點和缺點。這是由文件系統的設計決定的。舉例來說,NTFS文件系統支持的透明壓縮(當啟用時,會在用戶不知道的情況下自動壓縮存儲文件)。大多數文件系統缺乏此功能,但如果在fs文件夾里編入相應的文件,它們也有這種能力。
include - include包含了內核所需的各種頭文件.這個名字來自於C語言用"include"來在編譯時導入頭文件。
init - init文件夾包含了內核啟動的處理代碼(INITiation)。main.c是內核的核心文件,這是用來銜接所有的其他文件的源代碼主文件。
ipc - IPC代表進程間通訊。此文件夾中的代碼是作為內核與進程之間的通信層。內核控制著硬體,因此程序只能請求內核來執行任務。假設用戶有一個打開DVD托盤的程序。程序不直接打開托盤,相反,該程序通知內核托盤應該被打開。然後,內核給硬體發送一個信號去打開托盤。這些代碼同樣管理kill信號。舉例來說,當系統管理員打開進程管理器去關閉一個已經鎖死的程序,這個關閉程序的信號被稱為kill信號。內核接收到信號,然後內核會要求程序停止或直接把進程從內存和CPU中移除(取決於kill的類型)。命令行中的管道同樣用於進程間通信。管道會告訴內核在某個內存頁上寫入輸出數據。程序或者命令得到的數據是來自內存頁上的某個給定的指針。
kernel - 這個文件夾中的代碼控制內核本身。例如,如果一個調試器需要跟蹤問題,內核將使用這個文件夾中代碼來將內核指令通知調試器跟蹤內核進行的所有動作。這裡也有跟蹤時間的代碼。在內核文件夾下有個"power"文件夾,這裡的代碼可以使計算機重新啟動、關機和掛起。
lib - 這個文件夾包含了內核需要引用的一系列內核庫文件代碼。
mm - mm文件夾中包含了內存管理代碼。內存並不是任意存儲在RAM晶元上的。相反,內核小心地將數據放在RAM晶元上。內核不會覆蓋任何正在使用或保存重要數據的內存區域。
net - net文件夾中包含了網路協議代碼。這包括IPv6、AppleTalk、乙太網、WiFi、藍牙等的代碼,此外處理網橋和DNS解析的代碼也在net目錄。
samples - 此文件夾包含了程序示例和正在編寫中的模塊代碼。假設一個新的模塊引入了一個想要的有用功能,但沒有程序員說它已經可以正常運行在內核上。那麼,這些模塊就會移到這裡。這給了新內核程序員一個機會通過這個文件夾來獲得幫助,或者選擇一個他們想要協助開發的模塊。
scripts - 這個文件夾有內核編譯所需的腳本。最好不要改變這個文件夾內的任何東西。否則,您可能無法配置或編譯內核。
security - 這個文件夾是有關內核安全的代碼。它對計算機免於受到病毒和黑客的侵害很重要。否則,Linux系統可能會遭到損壞。關於內核的安全性,將在以後的文章中討論。
sound - 這個文件夾中包含了音效卡驅動。
tools - 這個文件夾中包含了和內核交互的工具。
usr - 還記得在以前的文章中提到vmlinuz和其他類似的文件么?這個文件夾中的代碼在內核編譯完成後創建這些文件。
virt - 此文件夾包含了虛擬化代碼,它允許用戶一次運行多個操作系統。這與先前提到的Xen是不同的。通過虛擬化,客戶機操作系統就像任何其他運行在Linux主機的應用程序一樣運行。通過Xen這樣的hypervisor(注:虛擬機管理程序),兩個操作系統可以同時管理硬體。在虛擬化中,在客戶機操作系統上運行在Linux內核上,而在hypervisor中,它沒有客戶系統並且所有的系統不互相依賴。
提示: 絕不在內核源代碼內移動文件,除非你知道你在做什麼。否則,編譯會由於缺失文件失敗。
Linux內核的文件夾結構保持相對穩定。內核開發者會做一些修改,但總體來說,這些設置對整個內核版本都是一樣。驅動程序文件夾的布局也基本保持一樣。
via: http://www.linux.org/threads/the-linux-kernel-the-source-code.4204/
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive