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