一文了解Linux内核
本文來自? [https://www.ssdfans.com]
目錄
什么是操作系統OS
操作系統的的組成
什么是內核kernel
內核的操作
內核的分類
Linux操作系統
Linux內核
內核源碼結構
?Linux內核與硬件的關系
是什么使Linux內核與其他經典Unix內核不同?
Linux內核架構
Linux內核接口
?Linux可加載內核模塊 (The Linux Loadable Kernel Module (LKM) )
什么是操作系統OS
操作系統(簡稱為OS)是一種軟件平臺,可創建一個環境,用戶可以在該環境中在計算設備上運行不同的應用程序。 操作系統充當軟件程序和系統硬件組件之間的橋梁。 它被移動設備,標簽,臺式機,Web服務器,視頻游戲機等不同的設備所利用。市場上有各種操作系統可用,例如Windows,Linux,Unix和Mac OSX。
操作系統的的組成
Bootloader:它負責設備的啟動過程。
Shell:Shell是一種編程語言,它可以控制其他文件,進程以及所有其他程序。
Kernel:它是操作系統的主要組件,管理內存,CPU和其他相關組件。
Desktop Environment:這是用戶通常與之交互的環境。
Graphical server(圖形服務器):它是操作系統的子系統,用于在屏幕上顯示圖形
Applications: 這些是執行不同用戶任務(例如word,excel等)的程序集。
Daemons : 后臺服務提供商。
什么是內核kernel
內核是操作系統的關鍵組件。 它借助進程間通信和系統調用,在硬件級別上充當應用程序和數據處理之間的橋梁。
每當將操作系統加載到內存中時,首先,將加載內核并將其保留在那里,直到操作系統關閉。 內核負責處理低級任務,例如任務管理,內存管理,風險管理等。
內核的任務
- 用于應用程序執行的流程管理
- 內存和I / O(輸入/輸出)管理
- 系統調用控制(內核的核心行為)
- 借助設備驅動程序進行設備管理
內核空間,用戶空間是什么?
內核空間
內核處于提升的系統狀態,其中包括受保護的內存空間以及對設備硬件的完全訪問權限。 此系統狀態和內存空間統稱為內核空間。 在內核空間內,對硬件和系統服務的核心訪問進行管理,并作為服務提供給系統的其余部分。
用戶空間
用戶空間或用戶域是在操作系統內核環境之外運行的代碼,用戶空間定義為操作系統用來與內核連接的各種應用程序或程序或庫。
用戶的應用程序是在用戶空間中執行的,它們可以通過內核系統調用訪問計算機可用資源的一部分。 通過使用內核提供的核心服務,可以創建用戶級別的應用程序,例如游戲或辦公軟件。
內核的操作
內核是任何操作系統的心臟,因為它控制系統中的所有其他程序。 當設備啟動時,內核會經歷一個初始化的過程,例如檢查內存。 它負責內存分配部分,并創建了一個運行應用程序的環境,而沒有任何干擾。
內核充當服務提供者,因此程序可以請求內核完成多項任務,例如請求使用磁盤,網卡或其他硬件,并且內核為CPU設置中斷以啟用多任務處理。 它不讓錯誤的程序進入其他程序的操作功能,從而保護了計算環境。 它通過不允許存儲空間來阻止未經授權的程序進入入口,并限制它們消耗的CPU時間。
內核的分類
通常有三類內核:
Monolithic kernel: 它包含許多設備驅動程序,可在設備的硬件和軟件之間創建通信接口。
它是操作系統廣泛使用的內核。 在單片架構中,內核由可以動態加載和卸載的各種模塊組成。 這種體系結構將擴展OS的功能,并允許輕松擴展內核。
使用單片式體系結構,內核的維護變得容易,因為當需要修復特定模塊中的錯誤時,它允許相關模塊進行加載和卸載。 因此,它消除了繁瑣的工作,即降低并重新編譯整個內核以進行很小的更改。 在單片內核中,卸載不再使用的模塊更加容易。
Micro kernel: 它只能執行基本功能。
微內核已經發展成為單片內核的替代產品,以解決單片內核無法做到的內核代碼不斷增長的問題。 這種體系結構允許某些基本服務(例如協議棧,設備驅動程序管理,文件系統等)在用戶空間中運行。 這樣可以以最少的代碼增強OS的功能,提高安全性并確保穩定性。
它通過使系統的其余部分正常運行而不會造成任何中斷,從而限制了對受影響區域的損壞。 在微內核體系結構中,所有基本OS服務都可以通過進程間通信(IPC)提供給程序。 微內核允許設備驅動程序和硬件之間的直接交互。
Hybrid kernel: 它結合了單片內核和微內核的各個方面。
混合內核可以決定要在用戶模式和主管模式下運行什么。 通常,在混合內核環境中,設備驅動程序,文件系統I / O之類的內容將在用戶模式下運行,而服務器調用和IPC則保持在管理者模式下。 它提供了兩個世界的最佳體驗。
Linux操作系統
Linux是Linus Torvalds在1991年開發的開源平臺。 它在各種設備中用作操作系統,例如在計算機,服務器,移動設備,大型機和其他嵌入式設備中。 由于它是開源軟件,因此用戶可以根據需要自定義此操作系統。 它支持幾乎所有主要的計算機平臺,例如ARM,x86,SPARK等。Linux的最常見用法是用于Server,但也用于臺式機,電子書閱讀器,智能手機等。
Linux內核
內核是任何基于Linux的操作系統的核心組件。 它代表了臺式機和服務器的Linux發行版的核心方面。 它具有整體架構,并且操作系統完全在內核空間中運行。 整體內核不僅包圍中央處理器,IPC和內存,而且具有系統服務器調用,設備驅動程序和文件系統管理。 Linux內核充當設備軟件和硬件之間的一層。
內核可以是單片,微內核或混合內核(例如OS X和Windows 7)。 Linux內核是類似于UNIX系統的單片計算機操作系統內核。 Linux操作系統系列(通常稱為Linux發行版)基于此內核。與微內核不同,單塊內核不僅包含中央處理單元,內存和IPC,還具有設備驅動程序,系統服務器調用和文件系統管理。他們最擅長與硬件通信并同時執行多項任務。由于這個原因,此處的過程反應速度很快。
但是,很少的挫折是所需的巨大安裝和內存占用空間以及安全性不足,因為一切都以管理員模式運行。相反,隨著用戶服務和內核的分離,微內核對應用程序調用的反應可能會很慢。因此,與整體內核相比,它們的尺寸更小。微內核很容易擴展,但是編寫微內核需要更多代碼。 Linux內核是用C和Assembly編程語言編寫的。
內核源碼結構
在Linux系統中查看內核源碼,如圖所示
- arch 特定體系結構的代碼
- block 塊設備I/O層
- crypo 加密API
- Documentation 內核源碼文檔
- drivers 設備驅動程序
- firmware 使用某些驅動程序而需要的設備固件
- fs VFS和各種文件系統
- include 內核頭文件
- init 內核引導和初始化
- ipc 進程間通信代碼
- kernel 像調度程序這樣的核心子系統
- lib 同樣內核函數
- mm 內存管理子系統和VM
- net 網絡子系統
- samples 示例,示范代碼
- scripts 編譯內核所用的腳本
- security Linux 安全模塊
- sound 語音子系統
- usr 早期用戶空間代碼(所謂的initramfs)
- tools 在Linux開發中有用的工具
- virt 虛擬化基礎結構
?Linux內核與硬件的關系
內核可以通過所謂的中斷來管理系統的硬件。 當硬件要與系統接口時,會發出一個中斷,中斷處理器,從而對內核執行相同的操作。 為了提供同步,內核可以禁用中斷,無論是單個中斷還是全部中斷。 但是,在Linux中,中斷處理程序不是在進程上下文中運行,而是在不與任何進程相關聯的中斷上下文中運行,這種特殊的中斷上下文僅是為了讓中斷處理程序快速響應單個中斷然后最終退出而存在 。
是什么使Linux內核與其他經典Unix內核不同?
Linux內核和經典 Unix內核之間存在顯著差異,如下所示:
- Linux支持內核模塊的動態加載
- Linux內核是搶占式的
- Linux具有對稱的多處理器支持
- Linux具有開放軟件特性,因此是免費的
- Linux忽略了內核開發人員稱為“設計不良”的某些標準Unix功能
- Linux提供了帶有設備類,可熱插拔事件和用戶空間設備文件系統的面向對象的設備模型
- Linux內核無法區分線程和正常進程
Linux內核架構
內核僅僅是資源管理器。 被管理的資源可以是進程,內存或硬件設備。 它管理和仲裁多個競爭用戶之間對資源的訪問。 Linux內核存在于用戶空間下方的內核空間中,該空間是執行用戶應用程序的位置。 為了使用戶空間與內核空間進行通信,已合并了一個GNU C庫,該庫為系統調用接口提供了一個論壇,以連接到內核空間并允許轉換回用戶空間。
Linux內核可以分為三個主要級別:
系統調用界面:這是最高層,并承擔諸如讀取和寫入之類的基本操作。
內核代碼:它位于系統調用接口下方,這是Linux支持的所有處理器體系結構的共同點,有時也定義為與體系結構無關的內核代碼。
依賴于體系結構的代碼:它在獨立于體系結構的代碼下,形成通常稱為板級支持程序包(BSP)的程序-該程序包包含一個稱為引導加載程序的小程序,它將操作系統和設備驅動程序放入內存。
Linux內核的體系結構主要包括:系統調用接口,進程管理,虛擬文件系統,內存管理,體系結構和設備驅動程序,這些稱為Linux內核的主要子系統。
系統調用界面(System call interface)
簡單來說,系統調用就是用戶程序和硬件設備之間的橋梁。用戶程序在需要的時候,通過系統調用來使用硬件設備。系統調用是一種編程過程,用于承擔從用戶空間到內核的函數調用,其中程序從操作系統內核請求服務。 該接口可能取決于體系結構。它包括各種硬件服務,例如與硬件設備連接以及在內核的各個組成部分之間創建通信接口。 系統調用在操作系統和進程之間創建有效的接口。
進程管理 (Process management)
執行進程,內核負責創建和刪除不同的進程,并監視它們與外部世界的連接。例如輸入和輸出。 它通過信號,進程間通信原語或管道來處理不同方法之間的通信。 除了所有這些之外,它還有一個調度程序,用于控制共享CPU的進程。
內存管理(Memory management)
內存是操作系統的重要組成部分,內存在所謂的頁面中進行管理以提高效率。 Linux包括管理可用內存的方法以及用于物理和虛擬映射的硬件機制,還提供交換空間。內存管理不僅僅管理4KB緩沖區,還遠遠不止于此。 Linux還提供了4kb緩沖區以外的抽象(稱為slab分配器)。 Slab分配器使用4kb緩沖區作為基礎,然后通過監視諸如頁面已滿,為空和部分使用之類的內容從內部分配結構。 這使方案可以動態增長,并可以支持系統的更重要需求。
虛擬文件系統(Virtual file system)
虛擬文件系統(VFS)是內核的重要組成部分,它為文件系統提供了標準的接口抽象。 它提供了系統調用接口和內核支持的文件系統之間的切換層。 VFS在內核支持的文件系統和SCI(系統調用接口)之間創建一個交換層。除了上述內容之外,Linux還支持各種類型的文件系統,這些文件系統需要以不同的方式組織數據以物理格式存儲。 例如,可以使用常用的FAT文件系統,Linux標準ext3文件系統或其他幾種格式來格式化磁盤。
設備驅動(Device drivers)
內核的大部分源代碼存儲在設備驅動程序中,這使特定的硬件設備可用。 Linux提供了一個驅動程序子目錄,該子目錄又分為支持的各種設備,例如I2藍牙,串行等。
體系結構(Architecture-dependent code)
即使大多數Linux在其獨立體系結構上運行,也應考慮某些因素以提高體系結構效率和正常運行。 Linux有許多子目錄,每個體系結構子目錄有許多其他子目錄。 而且,這些子目錄專注于內核的特定任務,例如內存管理,引導,內核等。
接口
系統調用和中斷(System calls and Interrupts)
應用程序通過系統調用將信息傳遞給內核。 庫包含應用程序可以使用的功能。 然后,這些庫通過系統調用界面指示內核執行應用程序所需的任務。
中斷提供了一種通過Linux內核管理系統硬件的方法。 如果硬件必須與系統通信,則可以通過處理器上的中斷來解決問題,并將其傳遞給Linux內核。
Linux內核接口
Linux內核為執行不同任務和具有不同屬性的用戶空間應用程序提供了不同的接口。
它由兩個獨立的應用程序編程接口(API)組成:一個是內核用戶空間,另一個是內核內部。
Linux API是內核用戶空間API, 它使用戶空間中的程序可以訪問內核的系統資源和服務, 它由系統調用接口和GNU C庫中的子例程組成。
Linux ABI
指的是內核用戶空間ABI(Application Binary Interface), 它存在于程序模塊之間,是兩個二進制程序模塊之間的接口:模塊之一是操作系統工具或庫,第二個模塊是用戶運行的程序。
比較API和ABI時,不同之處在于ABI用于訪問已編譯的外部代碼,而API是用于管理軟件的結構。 定義重要的ABI主要是Linux發行版的工作,而不是Linux內核。 應該為每個指令集定義一個特定的ABI,例如x86-64。 Linux產品的最終用戶對ABI而不是API感興趣。
它不過是內核用戶空間ABI(應用程序二進制用戶界面)。 它存在于程序模塊之間。 ABI用于訪問已編譯并準備使用的代碼。 ABI是兩個二進制程序模塊之間的接口:這些模塊之一是操作系統工具或庫,第二個模塊是用戶運行的程序。
模塊化內核
以前版本的Linux內核的方式是將其所有部分靜態固定為一個整體。 但是,現代Linux內核的大部分功能包含在動態放入內核的模塊中。 與單片類型相反,這稱為模塊化內核。 這樣的設置允許用戶加載或替換正在運行的內核中的模塊,而無需重新啟動。
?Linux可加載內核模塊 (The Linux Loadable Kernel Module (LKM) )
如果要向Linux內核添加代碼,則要做的第一件事就是向內核源代碼樹中添加一些源文件。 在某些情況下,您可能需要在運行時向內核添加代碼,此過程稱為可加載內核模塊。
LKM的好處
- LKM節省時間并避免錯誤
- 它有助于快速發現bugs
- LKM可以節省內存,因為它們僅在需要時才加載到內存中
- 它提供了更快的維護和調試時間
總結
以上是生活随笔為你收集整理的一文了解Linux内核的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【WPF】设置TextBox内容为空时的
- 下一篇: linux 内核编程之proc虚拟文件系