Linux 內核主要由 5 個模塊構成,它們分別是:安全
進程調度模塊 用來負責控制進程對 CPU 資源的使用。所採起的調度策略是各進程可以公平合理地訪問 CPU,同時保證內核能及時地執行硬件操做。網絡
內存管理模塊 用於確保全部進程可以安全地共享機器主內存區,同時,內存管理模塊還支持虛擬內存管理方式,使得 Linux 支持進程使用比實際內存空間更多的內存容量。並能夠利用文件系統把暫時不用的內存數據塊會被交換到外部存儲設備上去,當須要時再交換回來。架構
文件系統模塊 用於支持對外部設備的驅動和存儲。虛擬文件系統模塊經過向全部的外部存儲設備提供一個通用的文件接口,隱藏了各類硬件設備的不一樣細節。從而提供並支持與其它操做系統兼容的多種文件系統格式。app
進程間通訊模塊 子系統用於支持多種進程間的信息交換方式。socket
網絡接口模塊 提供對多種網絡通訊標準的訪問並支持許多網絡硬件。函數
這幾個模塊之間的依賴關係見圖 2-3 所示。其中的連線表明它們之間的依賴關係,虛線和虛框部分表示 Linux 0.11 中還未實現的部分(從 Linux 0.95 版纔開始逐步實現虛擬文件系統,而網絡接口的支持到 0.96 版纔有)。工具
Linux-0.11文件系統介紹性能
本文是「Linux內核分析」系列文章的第一篇,會之內核的核心功能爲出發點,描述Linux內核的總體架構,以及架構之下主要的軟件子系統。以後,會介紹Linux內核源文件的目錄結構,並和各個軟件子系統對應。測試
以下圖所示,Linux內核只是Linux操做系統一部分。對下,它管理系統的全部硬件設備;對上,它經過系統調用,向Library Routine(例如C庫)或者其它應用程序提供接口。ui
所以,其核心功能就是:管理硬件設備,供應用程序使用。而現代計算機(不管是PC仍是嵌入式系統)的標準組成,就是CPU、Memory(內存和外存)、輸入輸出設備、網絡設備和其它的外圍設備。因此爲了管理這些設備,Linux內核提出了以下的架構。
上圖說明了Linux內核的總體架構。根據內核的核心功能,Linux內核提出了5個子系統,分別負責以下的功能:
1. Process Scheduler,也稱做進程管理、進程調度。負責管理CPU資源,以便讓各個進程能夠以儘可能公平的方式訪問CPU。
2. Memory Manager,內存管理。負責管理Memory(內存)資源,以便讓各個進程能夠安全地共享機器的內存資源。另外,內存管理會提供虛擬內存的機制,該機制可讓進程使用多於系統可用Memory的內存,不用的內存會經過文件系統保存在外部非易失存儲器中,須要使用的時候,再取回到內存中。
3. VFS(Virtual File System),虛擬文件系統。Linux內核將不一樣功能的外部設備,例如Disk設備(硬盤、磁盤、NAND Flash、Nor Flash等)、輸入輸出設備、顯示設備等等,抽象爲能夠經過統一的文件操做接口(open、close、read、write等)來訪問。這就是Linux系統「一切皆是文件」的體現(其實Linux作的並不完全,由於CPU、內存、網絡等還不是文件,若是真的須要一切皆是文件,還得看貝爾實驗室正在開發的"Plan 9」的)。
4. Network,網絡子系統。負責管理系統的網絡設備,並實現多種多樣的網絡標準。
5. IPC(Inter-Process Communication),進程間通訊。IPC無論理任何的硬件,它主要負責Linux系統中進程之間的通訊。
進程調度是Linux內核中最重要的子系統,它主要提供對CPU的訪問控制。由於在計算機中,CPU資源是有限的,而衆多的應用程序都要使用CPU資源,因此須要「進程調度子系統」對CPU進行調度管理。
進程調度子系統包括4個子模塊(見下圖),它們的功能以下:
1. Scheduling Policy,實現進程調度的策略,它決定哪一個(或哪幾個)進程將擁有CPU。
2. Architecture-specific Schedulers,體系結構相關的部分,用於將對不一樣CPU的控制,抽象爲統一的接口。這些控制主要在suspend和resume進程時使用,牽涉到CPU的寄存器訪問、彙編指令操做等。
3. Architecture-independent Scheduler,體系結構無關的部分。它會和「Scheduling Policy模塊」溝通,決定接下來要執行哪一個進程,而後經過「Architecture-specific Schedulers模塊」resume指定的進程。
4. System Call Interface,系統調用接口。進程調度子系統經過系統調用接口,將須要提供給用戶空間的接口開放出去,同時屏蔽掉不須要用戶空間程序關心的細節。
內存管理一樣是Linux內核中最重要的子系統,它主要提供對內存資源的訪問控制。Linux系統會在硬件物理內存和進程所使用的內存(稱做虛擬內存)之間創建一種映射關係,這種映射是以進程爲單位,於是不一樣的進程可使用相同的虛擬內存,而這些相同的虛擬內存,能夠映射到不一樣的物理內存上。
內存管理子系統包括3個子模塊(見下圖),它們的功能以下:
1. Architecture Specific Managers,體系結構相關部分。提供用於訪問硬件Memory的虛擬接口。
2. Architecture Independent Manager,體系結構無關部分。提供全部的內存管理機制,包括:以進程爲單位的memory mapping;虛擬內存的Swapping。
3. System Call Interface,系統調用接口。經過該接口,向用戶空間程序應用程序提供內存的分配、釋放,文件的map等功能。
傳統意義上的文件系統,是一種存儲和組織計算機數據的方法。它用易懂、人性化的方法(文件和目錄結構),抽象計算機磁盤、硬盤等設備上冰冷的數據塊,從而使對它們的查找和訪問變得容易。於是文件系統的實質,就是「存儲和組織數據的方法」,文件系統的表現形式,就是「從某個設備中讀取數據和向某個設備寫入數據」。
隨着計算機技術的進步,存儲和組織數據的方法也是在不斷進步的,從而致使有多種類型的文件系統,例如FAT、FAT3二、NTFS、EXT二、EXT3等等。而爲了兼容,操做系統或者內核,要以相同的表現形式,同時支持多種類型的文件系統,這就延伸出了虛擬文件系統(VFS)的概念。VFS的功能就是管理各類各樣的文件系統,屏蔽它們的差別,以統一的方式,爲用戶程序提供訪問文件的接口。
咱們能夠從磁盤、硬盤、NAND Flash等設備中讀取或寫入數據,於是最初的文件系統都是構建在這些設備之上的。這個概念也能夠推廣到其它的硬件設備,例如內存、顯示器(LCD)、鍵盤、串口等等。咱們對硬件設備的訪問控制,也能夠概括爲讀取或者寫入數據,於是能夠用統一的文件操做接口訪問。Linux內核就是這樣作的,除了傳統的磁盤文件系統以外,它還抽象出了設備文件系統、內存文件系統等等。這些邏輯,都是由VFS子系統實現。
VFS子系統包括6個子模塊(見下圖),它們的功能以下:
1. Device Drivers,設備驅動,用於控制全部的外部設備及控制器。因爲存在大量不能相互兼容的硬件設備(特別是嵌入式產品),因此也有很是多的設備驅動。所以,Linux內核中將近一半的Source Code都是設備驅動,大多數的Linux底層工程師(特別是國內的企業)都是在編寫或者維護設備驅動,而無暇估計其它內容(它們偏偏是Linux內核的精髓所在)。
2. Device Independent Interface, 該模塊定義了描述硬件設備的統一方式(統一設備模型),全部的設備驅動都遵照這個定義,能夠下降開發的難度。同時能夠用一致的形勢向上提供接口。
3. Logical Systems,每一種文件系統,都會對應一個Logical System(邏輯文件系統),它會實現具體的文件系統邏輯。
4. System Independent Interface,該模塊負責以統一的接口(快設備和字符設備)表示硬件設備和邏輯文件系統,這樣上層軟件就再也不關心具體的硬件形態了。
5. System Call Interface,系統調用接口,向用戶空間提供訪問文件系統和硬件設備的統一的接口。
網絡子系統在Linux內核中主要負責管理各類網絡設備,並實現各類網絡協議棧,最終實現經過網絡鏈接其它系統的功能。在Linux內核中,網絡子系統幾乎是自成體系,它包括5個子模塊(見下圖),它們的功能以下:
1. Network Device Drivers,網絡設備的驅動,和VFS子系統中的設備驅動是同樣的。
2. Device Independent Interface,和VFS子系統中的是同樣的。
3. Network Protocols,實現各類網絡傳輸協議,例如IP, TCP, UDP等等。
4. Protocol Independent Interface,屏蔽不一樣的硬件設備和網絡協議,以相同的格式提供接口(socket)。
5. System Call interface,系統調用接口,向用戶空間提供訪問網絡設備的統一的接口。
至於IPC子系統,因爲功能比較單純,這裏就再也不描述了。
Linux內核源代碼包括三個主要部分:
1. 內核核心代碼,包括第3章所描述的各個子系統和子模塊,以及其它的支撐子系統,例如電源管理、Linux初始化等
2. 其它非核心代碼,例如庫文件(由於Linux內核是一個自包含的內核,即內核不依賴其它的任何軟件,本身就能夠編譯經過)、固件集合、KVM(虛擬機技術)等
3. 編譯腳本、配置文件、幫助文檔、版權說明等輔助性文件
下圖示使用ls命令看到的內核源代碼的頂層目錄結構,具體描述以下。
include/ ---- 內核頭文件,須要提供給外部模塊(例如用戶空間代碼)使用。
kernel/ ---- Linux內核的核心代碼,包含了3.2小節所描述的進程調度子系統,以及和進程調度相關的模塊。
mm/ ---- 內存管理子系統(3.3小節)。
fs/ ---- VFS子系統(3.4小節)。
net/ ---- 不包括網絡設備驅動的網絡子系統(3.5小節)。
ipc/ ---- IPC(進程間通訊)子系統。
arch// ---- 體系結構相關的代碼,例如arm, x86等等。
arch//mach- ---- 具體的machine/board相關的代碼。
arch//include/asm ---- 體系結構相關的頭文件。
arch//boot/dts ---- 設備樹(Device Tree)文件。
init/ ---- Linux系統啓動初始化相關的代碼。
block/ ---- 提供塊設備的層次。
sound/ ---- 音頻相關的驅動及子系統,能夠看做「音頻子系統」。
drivers/ ---- 設備驅動(在Linux kernel 3.10中,設備驅動佔了49.4的代碼量)。
lib/ ---- 實現須要在內核中使用的庫函數,例如CRC、FIFO、list、MD5等。
crypto/ ----- 加密、解密相關的庫函數。
security/ ---- 提供安全特性(SELinux)。
virt/ ---- 提供虛擬機技術(KVM等)的支持。
usr/ ---- 用於生成initramfs的代碼。
firmware/ ---- 保存用於驅動第三方設備的固件。
samples/ ---- 一些示例代碼。
tools/ ---- 一些經常使用工具,如性能剖析、自測試等。
Kconfig, Kbuild, Makefile, scripts/ ---- 用於內核編譯的配置文件、腳本等。
COPYING ---- 版權聲明。
MAINTAINERS ----維護者名單。
CREDITS ---- Linux主要的貢獻者名單。
REPORTING-BUGS ---- Bug上報的指南。
Documentation, README ---- 幫助、說明文檔。