首頁 > 運維 > linux運維 > Linux五大模組核心原始碼以及核心整體架構設計(圖文詳解)

Linux五大模組核心原始碼以及核心整體架構設計(圖文詳解)

WBOY
發布: 2022-02-23 18:24:38
轉載
3800 人瀏覽過

這篇文章為大家帶來了關於Linux五大模組核心原始碼的相關知識,其中包含了核心整體架構設計的相關問題,希望對大家有幫助。

Linux五大模組核心原始碼以及核心整體架構設計(圖文詳解)

相關推薦:《Linux影片教學

一、前言

本文是“ Linux核心原始碼分析」系列的專業,將以核心的核心功能為出發點,描述Linux核心的整體架構,以及架構之下主要的軟體子系統。之後,會介紹Linux核心原始檔的目錄結構,並與各個軟體子系統對應。

附註:本文及其它的「Linux核心分析」文章都基於以下約定:
a) 核心版本為Linux 5.6.18,可以從下面的連結取得:
https:// mirrors.edge.kernel.org/pub/linux/kernel/v5.x/linux-5.6.18.tar.xz
b) 鑑於嵌入式系統大多使用ARM處理器,因此涉及體系結構部分的內容,都以ARM為分析物件

二、 Linux核心的核心功能

如下圖所示,Linux核心只是Linux作業系統一部分。對下,它管理系統的所有硬體設備;對上,它透過系統調用,向Library Routine(例如C庫)或其它應用程式提供介面。

Linux五大模組核心原始碼以及核心整體架構設計(圖文詳解)

因此,其核心功能是:管理硬體設備,供應用程式使用。而現代電腦(無論是PC或嵌入式系統)的標準組成,就是CPU、Memory(記憶體和周邊)、輸入輸出設備、網路設備和其它的外圍設備。所以為了管理這些設備,Linux核心提出如下的架構。

(程式碼免費取得後台私訊【程式碼】)

三、Linux核心的整體架構

3.1 整體架構與子系統分割

Linux五大模組核心原始碼以及核心整體架構設計(圖文詳解)

上圖說明了Linux核心的整體架構。根據核心的核心功能,Linux核心提出了5個子系統,分別負責如下的功能:

1. Process Scheduler,也稱為進程管理、進程調度。負責管理CPU資源,以便讓各個行程可以以盡量公平的方式存取CPU。 Linux五大模組核心原始碼以及核心整體架構設計(圖文詳解)

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系統中進程之間的通訊。

3.2 進程調度(Process Scheduler)######進程調度是Linux核心中最重要的子系統,它主要提供對CPU的存取控制。因為在電腦中,CPU資源是有限的,而眾多的應用程式都要使用CPU資源,所以需要「進程調度子系統」對CPU進行調度管理。 ######進程調度子系統包含4個子模組(見下圖),它們的功能如下:###############1. Scheduling Policy,實作進程調度的策略,它決定哪個(或哪幾個)進程將擁有CPU。 ######2. Architecture-specific Sc​​hedulers,體系結構相關的部分,用於將對不同CPU的控制,抽象化為統一的介面。這些控制主要在suspend和resume進程時使用,牽涉到CPU的暫存器存取、組譯指令操作等。 ######3. Architecture-independent Scheduler,體系結構無關的部分。它會和「Scheduling Policy模組」溝通,決定接下來要執行哪個進程,然後透過「Architecture-specific Sc​​hedulers模組」resume指定的進程。 ######4. System Call Interface,系統呼叫介面。進程調度子系統透過系統呼叫接口,將需要提供給用戶空間的接口開放出去,同時屏蔽掉不需要用戶空間程序關心的細節。 ###

3.3 記憶體管理(Memory Manager, MM)

記憶體管理同樣是Linux核心中最重要的子系統,它主要提供對記憶體資源的存取控制。 Linux系統會在硬體實體記憶體和進程所使用的記憶體(稱為虛擬記憶體)之間建立一種映射關係,這種映射是以進程為單位,因而不同的進程可以使用相同的虛擬內存,而這些相同的虛擬內存,可以映射到不同的物理內存。

記憶體管理子系統包含3個子模組(見下圖),它們的功能如下:

Linux五大模組核心原始碼以及核心整體架構設計(圖文詳解)

1. Architecture Specific Managers,體系結構相關部分。提供用於存取硬體Memory的虛擬介面。

2. Architecture Independent Manager,體系結構無關部分。提供所有的記憶體管理機制,包括:以進程為單位的memory mapping;虛擬記憶體的Swapping。

3. System Call Interface,系統呼叫介面。透過此接口,向使用者空間程式應用程式提供記憶體的分配、釋放,檔案的map等功能。

3.4 虛擬檔案系統(Virtual Filesystem, VFS)

傳統意義上的檔案系統,是一種儲存和組織電腦資料的方法。它用易懂、人性化的方法(檔案和目錄結構),抽象電腦磁碟、硬碟等裝置上冰冷的資料塊,從而使對它們的查找和存取變得容易。因而檔案系統的實質,就是“儲存和組織資料的方法”,檔案系統的表現形式,就是“從某個裝置中讀取資料和向某個裝置寫入資料」。

隨著電腦技術的進步,儲存和組織資料的方法也是在不斷進步的,從而導致有多種類型的檔案系統,例如FAT、FAT32、NTFS、EXT2、EXT3等等。而為了相容,作業系統或內核,要以相同的表現形式,同時支援多種類型的檔案系統,這就延伸出了虛擬檔案系統(VFS)的概念。

VFS的功能是管理各種各樣的檔案系統,屏蔽它們的差異,以統一的方式,為使用者程式提供存取檔案的介面。

我們可以從磁碟、硬碟、NAND Flash等裝置中讀取或寫入數據,因而最初的檔案系統都是建構在這些裝置之上的。這個概念也可以推廣到其它的硬體設備,例如內存、顯示器(LCD)、鍵盤、串列埠等等。

我們對硬體設備的存取控制,也可以歸納為讀取或寫入數據,因而可以用統一的檔案操作介面存取。 Linux核心就是這樣做的,除了傳統的磁碟檔案系統之外,它還抽象化了裝置檔案系統、記憶體檔案系統等等。這些邏輯,都是由VFS子系統實作。

VFS子系統包含6個子模組(見下圖),它們的功能如下:

Linux五大模組核心原始碼以及核心整體架構設計(圖文詳解)

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,系統呼叫接口,向用戶空間提供存取檔案系統和硬體設備的統一的介面。

3.5 網路子系統(Net)

網路子系統在Linux核心中主要負責管理各種網路設備,並實現各種網路協定棧,最終實現透過網路連接其它系統的功能。在Linux核心中,網路子系統幾乎是自成體系,它包括5個子模組(見下圖),它們的功能如下:

Linux五大模組核心原始碼以及核心整體架構設計(圖文詳解)

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核心原始碼的目錄結構

Linux核心原始碼包含三個主要部分:

1. 核心核心程式碼,包括第3章所描述的各個子系統和子模組,以及其它的支撐子系統,例如電源管理、Linux初始化等

2. 其它非核心程式碼,例如庫檔案(因為Linux核心是一個自包含的內核,即內核不依賴其它的任何軟體,自己就可以編譯通過)、韌體集合、KVM(虛擬機器技術)等

#3. 編譯腳本、設定檔、幫助文件、版權說明等輔助性檔案

下圖r所示使用ls指令看到的核心原始碼的頂層目錄結構,具體描述如下。

Linux五大模組核心原始碼以及核心整體架構設計(圖文詳解)

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 ---- 帮助、说明文档。
登入後複製

相關推薦:《Linux影片教學

#

以上是Linux五大模組核心原始碼以及核心整體架構設計(圖文詳解)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:csdn.net
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板