Linux 內核的組成

1. Linux 內核源代碼的目錄結構

Linux 內核源代碼包含如下目錄。

● arch :包含和硬件體系結構相關的代碼,每種平臺佔一個相應的目錄,如 i386、arm、arm64、powerpc、mips 等。Linux 內核目前已經支持30 種左右的體系結構。在arch目錄下,存放的是各個平臺以及各個平臺的芯片對Linux 內核進程調度、內存管理、中斷等的支持,以及每個具體的SoC 和電路板的板級支持代碼。

● block:塊設備驅動程序 I/O 調度。

● crypto:常用加密和散列算法(如 AES、SHA 等),還有一些壓縮和 CRC 校驗算法。

● documentation:內核各部分的通用解釋和註釋。

● drivers :設備驅動程序,每個不同的驅動佔用一個子目錄,如 char、block、net、mtd、i2c 等。

● fs:所支持的各種文件系統,如 EXT、FAT、NTFS、JFFS2 等。

● include:頭文件,與系統相關的頭文件放置在 include/linux 子目錄下。

● init:內核初始化代碼。著名的 start_kernel() 就位於 init/main.c 文件中。

● ipc:進程間通信的代碼。

kernel :內核最核心的部分,包括進程調度、定時器等,而和平臺相關的一部分代碼放在arch/*/kernel 目錄下。

● lib:庫文件代碼。

● mm:內存管理代碼,和平臺相關的一部分代碼放在 arch/*/mm 目錄下。

● net:網絡相關代碼,實現各種常見的網絡協議。

● scripts:用於配置內核的腳本文件。

● security:主要是一個 SELinux 的模塊。

● sound:ALSA、OSS 音頻設備的驅動核心代碼和常用設備驅動。

● usr:實現用於打包和壓縮的 cpio 等。

● include:內核 API 級別頭文件。

內核一般要做到drivers 與arch 的軟件架構分離,驅動中不包含板級信息,讓驅動跨平臺。同時內核的通用部分(如kernel、fs、ipc、net 等)則與具體的硬件(arch 和drivers)剝離。

2 Linux 內核的組成部分

Linux 內核主要由進程調度(SCHED)、內存管理(MM)、虛擬文件系統(VFS)、網絡接口(NET)和進程間通信(IPC)5個子系統組成。

2.1 進程調度

進程調度控制系統中的多個進程對CPU 的訪問,使得多個進程能在CPU 中“微觀串行,宏觀並行”地執行。進程調度處於系統的中心位置,內核中其他的子系統都依賴它,因爲每個子系統都需要掛起或恢復進程。Linux 的進程在幾個狀態間進
行切換。在設備驅動編程中,當請求的資源不能得到滿足時,驅動一般會調度其他進程執行,並使本進程進入睡眠狀態,直到它請求的資源被釋放,纔會被喚醒而進入就緒狀態。睡眠分成可中斷的睡眠和不可中斷的睡眠,兩者的區別在於可中斷的睡眠在收到信號的時候會醒。

完全處於TASK_UNINTERRUPTIBLE 狀態的進程甚至都無法被“殺死”,所以Linux2.6.26 之後的內核也存在一種TASK_KILLABLE 的狀態, 它等於“ TASK_WAKEKILL | TASK_UNINTERRUPTIBLE”,可以響應 致命信號。

在Linux 內核中,使用task_struct 結構體來描述進程,該結構體中包含描述該進程內存資源、文件系統資源、文件資源、tty 資源、信號處理等的指針。Linux 的線程採用輕量級進程模型來實現,在用戶空間通過pthread_create() API 創建線程的時候,本質上內核只是創建了一個新的task_struct,並將新task_struct 的所有資源指針都指向創建它的那個task_struct的資源指針。

絕大多數進程(以及進程中的多個線程)是由用戶空間的應用創建的,當它們存在底層資源和硬件訪問的需求時,會通過系統調用進入內核空間。有時候,在內核編程中,如果需要幾個併發執行的任務,可以啓動內核線程,這些線程沒有用戶空間。啓動內核線程的函數爲:

pid_t kernel_thread(int (*fn)(void *), void *arg, unsigned long flags);

2.2 內存管理

內存管理的主要作用是控制多個進程安全地共享主內存區域。當CPU 提供內存管理單元(MMU)時,Linux 內存管理對於每個進程完成從虛擬內存到物理內存的轉換。Linux 2.6 引入了對無MMU CPU 的支持。

一般而言,32 位處理器的Linux 的每個進程享有4GB 的內存空間,0 ~ 3GB 屬於用戶空間,3 ~ 4GB 屬於內核空間,內核空間對常規內存、I/O 設備內存以及高端內存有不同的處理方式。當然,內核空間和用戶空間的具體界限是可以調整的,在內核
配置選項Kernel Features → Memory split 下,可以設置界限爲2GB 或者3GB。

Linux內核的內存管理總體比較龐大,包含底層的Buddy 算法,它用於管理每個頁的佔用情況,內核空間的slab 以及用戶空間的C 庫的二次管理。另外,內核也提供了頁緩存的支持,用內存來緩存磁盤,per-BDI flusher 線程用於刷回髒的頁緩存到磁盤。Kswapd(交換進程)則是Linux 中用於頁面回收(包括file-backed 的頁和匿名頁)的內核線程,它採用最近最少使用(LRU)算法進行內存回收。

2.3 虛擬文件系統

Linux 虛擬文件系統隱藏了各種硬件的具體細節,爲所有設備提供了統一的接口。而且,它獨立於各個具體的文件系統,是對各種文件系統的一個抽象。它爲上層的應用程序提供了統一的vfs_read()、vfs_write() 等接口,並調用具體底層文件系統或者設備驅動中實現的file_operations 結構體的成員函數。

2.4 網絡接口

網絡接口提供了對各種網絡標準的存取和各種網絡硬件的支持。如圖3.8 所示,在Linux中網絡接口可分爲網絡協議和網絡驅動程序,網絡協議部分負責實現每一種可能的網絡傳輸協議,網絡設備驅動程序負責與硬件設備通信,每一種可能的硬件設備都有相應的設備驅動程序。

Linux 內核支持的協議棧種類較多,如Internet、UNIX、CAN、NFC、Bluetooth、WiMAX、IrDA 等,上層的應用程序統一使用套接字接口。

2.5 進程間通信

進程間通信支持進程之間的通信,Linux 支持進程間的多種通信機制,包含信號量、共享內存、消息隊列、管道、UNIX 域套接字等,這些機制可協助多個進程、多資源的互斥訪問、進程間的同步和消息傳遞。在實際的Linux 應用中,人們更多地趨向於使用UNIX 域套接字,而不是System V IPC 中的消息隊列等機制。Android 內核則新增了Binder 進程間通信方式。

Linux 內核5 個組成部分之間的依賴關係如下。

● 進程調度與內存管理之間的關係:這兩個子系統互相依賴。在多程序環境下,程序要運行,則必須爲之創建進程,而創建進程的第一件事情,就是將程序和數據裝入內存。

● 進程間通信與內存管理的關係:進程間通信子系統要依賴內存管理支持共享內存通信機制,這種機制允許兩個進程除了擁有自己的私有空間之外,還可以存取共同的內存區域。

● 虛擬文件系統與網絡接口之間的關係:虛擬文件系統利用網絡接口支持網絡文件系統(NFS),也利用內存管理支持RAMDISK 設備。

● 內存管理與虛擬文件系統之間的關係:內存管理利用虛擬文件系統支持交換,交換進
程定期由調度程序調度,這也是內存管理依賴於進程調度的原因。當一個進程存取的內存映射被換出時,內存管理向虛擬文件系統發出請求,同時,掛起當前正在運行的進程。

除了這些依賴關係外,內核中的所有子系統還要依賴於一些共同的資源。這些資源包括所有子系統都用到的API,如分配和釋放內存空間的函數、輸出警告或錯誤消息的函數及系統提供的調試接口等。

3. Linux內核空間與用戶空間

現代CPU 內部往往實現了不同操作模式(級別),不同模式有不同功能,高層程序往往不能訪問低級功能,而必須以某種方式切換到低級模式。例如,ARM 處理器分爲7 種工作模式。

● 用戶模式(usr):大多數應用程序運行在用戶模式下,當處理器運行在用戶模式下時,某些被保護的系統資源是不能訪問的。

● 快速中斷模式(fiq):用於高速數據傳輸或通道處理。

● 外部中斷模式(irq):用於通用的中斷處理。

● 管理模式(svc):操作系統使用的保護模式。

● 數據訪問中止模式(abt):當數據或指令預取中止時進入該模式,可用於虛擬存儲及存儲保護。

● 系統模式(sys):運行具有特權的操作系統任務。

● 未定義指令中止模式(und):當未定義的指令執行時進入該模式,可用於支持硬件協處理器的軟件仿真。

ARM Linux 的系統調用實現原理是採用swi 軟中斷從用戶(usr)模式陷入管理模式(svc)。

又如,x86 處理器包含4 個不同的特權級,稱爲Ring 0 ~ Ring 3。在Ring0 下,可以執行特權級指令,對任何I/O 設備都有訪問權等,而Ring3 則被限制很多操作。

Linux 系統可充分利用CPU 的這一硬件特性,但它只使用了兩級。在Linux 系統中,內核可進行任何操作,而應用程序則被禁止對硬件的直接訪問和對內存的未授權訪問。例如,若使用x86 處理器,則用戶代碼運行在特權級3,而系統內核代碼則運行在特權級0。

內核空間和用戶空間這兩個名詞用來區分程序執行的兩種不同狀態,它們使用不同的地址空間。Linux 只能通過系統調用和硬件中斷完成從用戶空間到內核空間的控制轉移。

 

 

 

 

盛世嫡妃

發佈了9 篇原創文章 · 獲贊 0 · 訪問量 973
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章