概述
通常地,Linux操作系統(tǒng)如下圖所示,由四大子系統(tǒng)組成:
用戶應(yīng)用層: 特定Linux系統(tǒng)上使用的應(yīng)用程序集會有所不同,具體取決于計算機(jī)系統(tǒng)的用途,但典型示例包括文字處理應(yīng)用程序和Web瀏覽器,嵌入式Linux往往會進(jìn)行大量的裁剪,將不需要的應(yīng)用裁剪掉。
O/S 服務(wù)層: O/S服務(wù)通常被認(rèn)為是操作系統(tǒng)的一部分(窗口系統(tǒng),命令外殼等);此外,該子系統(tǒng)還包含內(nèi)核的編程接口(編譯器工具和庫d)
Linux內(nèi)核層:這是本文關(guān)注的主要子系統(tǒng),內(nèi)核抽象并調(diào)控對硬件資源(包括CPU)的訪問。
硬件控制層:該子系統(tǒng)由Linux安裝中的所有可能的物理設(shè)備組成;例如,CPU,內(nèi)存硬件,硬盤和網(wǎng)絡(luò)硬件都是該子系統(tǒng)的成員
2.內(nèi)核架構(gòu)
2.1 內(nèi)核之作用
Linux內(nèi)核為用戶進(jìn)程提供了虛擬機(jī)接口。 進(jìn)程編程無需知道計算機(jī)上安裝了什么物理硬件,Linux內(nèi)核將所有硬件抽象為一致的虛擬接口。
此外,Linux以對用戶進(jìn)程透明的方式支持多任務(wù):每個進(jìn)程都可以像它是計算機(jī)上唯一的進(jìn)程一樣工作,并且專用于占用主內(nèi)存和其他硬件資源。內(nèi)核實(shí)際上同時運(yùn)行多個進(jìn)程,并負(fù)責(zé)中介對硬件資源的訪問,以便在維護(hù)進(jìn)程間安全性的同時,每個進(jìn)程都具有公平的訪問權(quán)限。
2.2 內(nèi)核之結(jié)構(gòu)
內(nèi)核主要由以下五大組成部分:
進(jìn)程調(diào)度器(SCHED)負(fù)責(zé)控制對CPU的進(jìn)程訪問。調(diào)度程序執(zhí)行一項調(diào)度策略,以確保進(jìn)程可以公平地訪問CPU,同時確保內(nèi)核按時執(zhí)行必要的硬件操作。
內(nèi)存管理器(MM)允許多個進(jìn)程安全地共享機(jī)器的主內(nèi)存系統(tǒng)。此外,內(nèi)存管理器還支持虛擬內(nèi)存,該虛擬內(nèi)存允許Linux支持使用的內(nèi)存量超過系統(tǒng)可用內(nèi)存的進(jìn)程。使用文件系統(tǒng)將未使用的內(nèi)存換出到持久性存儲,然后在需要時交換回來。
虛擬文件系統(tǒng)(VFS)通過為所有設(shè)備提供通用文件接口來抽象化各種硬件設(shè)備的詳細(xì)信息。此外,VFS支持幾種與其他操作系統(tǒng)兼容的文件系統(tǒng)格式。
網(wǎng)絡(luò)接口(NET)提供對幾種網(wǎng)絡(luò)標(biāo)準(zhǔn)和各種網(wǎng)絡(luò)硬件的訪問。
進(jìn)程間通信(IPC)子系統(tǒng)實(shí)現(xiàn)在單個Linux系統(tǒng)上進(jìn)行進(jìn)程間通信的多種機(jī)制。
從依賴性的角度分析:
進(jìn)程調(diào)度程序子系統(tǒng)使用內(nèi)存管理器為恢復(fù)特定進(jìn)程的特定進(jìn)程調(diào)整硬件內(nèi)存映射。
進(jìn)程間通信子系統(tǒng)依賴于內(nèi)存管理器來支持共享內(nèi)存通信機(jī)制。此機(jī)制允許兩個進(jìn)程除了訪問其通常的私有內(nèi)存之外,還訪問公共內(nèi)存的區(qū)域。
虛擬文件系統(tǒng)使用網(wǎng)絡(luò)接口來支持網(wǎng)絡(luò)文件系統(tǒng)(NFS),并且還使用內(nèi)存管理器來提供ramdisk設(shè)備。
內(nèi)存管理器使用虛擬文件系統(tǒng)來支持交換;這是內(nèi)存管理器依賴進(jìn)程調(diào)度程序的唯一原因。當(dāng)某個進(jìn)程訪問當(dāng)前已換出的內(nèi)存時,內(nèi)存管理器會向文件系統(tǒng)發(fā)出請求,從持久性存儲中獲取內(nèi)存,并掛起該進(jìn)程。
2.3 內(nèi)核之重要數(shù)據(jù)結(jié)構(gòu)
任務(wù)鏈表(Task List):流程調(diào)度程序?yàn)槊總€活動的流程維護(hù)一個數(shù)據(jù)塊。這些數(shù)據(jù)塊存儲在稱為任務(wù)列表的鏈接列表中。進(jìn)程調(diào)度程序始終維護(hù)一個指示當(dāng)前活動進(jìn)程的當(dāng)前指針。
內(nèi)存映射(memry map):內(nèi)存管理器基于每個進(jìn)程存儲虛擬地址到物理地址的映射,還存儲有關(guān)如何獲取和替換特定頁面的其他信息。此信息存儲在內(nèi)存映射數(shù)據(jù)結(jié)構(gòu)中,該結(jié)構(gòu)存儲在流程調(diào)度程序的任務(wù)列表中。
索引節(jié)點(diǎn)(I-node):虛擬文件系統(tǒng)使用索引節(jié)點(diǎn)(索引節(jié)點(diǎn))表示邏輯文件系統(tǒng)上的文件。索引節(jié)點(diǎn)數(shù)據(jù)結(jié)構(gòu)存儲文件塊號到物理設(shè)備地址的映射。如果兩個進(jìn)程打開了相同的文件,則可以在多個進(jìn)程之間共享I節(jié)點(diǎn)數(shù)據(jù)結(jié)構(gòu)。共享是通過兩個任務(wù)數(shù)據(jù)塊指向相同的i節(jié)點(diǎn)來完成的。
數(shù)據(jù)連接(Data Connection) 所有數(shù)據(jù)結(jié)構(gòu)都植根于流程調(diào)度程序的任務(wù)列表。系統(tǒng)上的每個進(jìn)程都有一個數(shù)據(jù)結(jié)構(gòu),該數(shù)據(jù)結(jié)構(gòu)包含一個指向其內(nèi)存映射信息的指針,以及指向代表所有打開文件的i節(jié)點(diǎn)的指針。最后,任務(wù)數(shù)據(jù)結(jié)構(gòu)還包含指向數(shù)據(jù)結(jié)構(gòu)的指針,該數(shù)據(jù)結(jié)構(gòu)表示與每個任務(wù)關(guān)聯(lián)的所有打開的網(wǎng)絡(luò)連接。
3.各子系統(tǒng)架構(gòu)分析
3.1 進(jìn)程調(diào)度器架構(gòu)
進(jìn)程調(diào)度器是Linux內(nèi)核中最重要的子系統(tǒng)。其目的是控制對計算機(jī)CPU的訪問。這不僅包括用戶進(jìn)程的訪問,還包括其他內(nèi)核子系統(tǒng)的訪問。
由上圖可知,進(jìn)程調(diào)度器可分為四大模塊:
調(diào)度策略模塊負(fù)責(zé)判斷哪個進(jìn)程可以訪問CPU;設(shè)計該策略是為了使進(jìn)程可以公平地訪問CPU。
體系結(jié)構(gòu)相關(guān)模塊特定于體系結(jié)構(gòu)的模塊設(shè)計有一個公共接口,用于抽象任何特定計算機(jī)體系結(jié)構(gòu)的詳細(xì)信息。這些模塊負(fù)責(zé)與CPU通信以掛起和恢復(fù)進(jìn)程。這些操作涉及知道每個進(jìn)程需要保留哪些寄存器和狀態(tài)信息,并執(zhí)行匯編代碼以執(zhí)行掛起或恢復(fù)操作。
體系結(jié)構(gòu)無關(guān)模塊與體系結(jié)構(gòu)無關(guān)的模塊與策略模塊進(jìn)行通信,以確定下一步將執(zhí)行哪個進(jìn)程,然后調(diào)用特定于體系結(jié)構(gòu)的模塊以恢復(fù)適當(dāng)?shù)倪M(jìn)程。此外,此模塊調(diào)用內(nèi)存管理器以確保為恢復(fù)的過程正確還原了內(nèi)存硬件
系統(tǒng)調(diào)用接口模塊允許用戶進(jìn)程僅訪問內(nèi)核顯式導(dǎo)出的那些資源。這將用戶進(jìn)程對內(nèi)核的依賴性限制為一個定義良好的接口,盡管其他內(nèi)核模塊的實(shí)現(xiàn)發(fā)生了變化,該接口很少更改
進(jìn)程調(diào)度器維護(hù)一個數(shù)據(jù)結(jié)構(gòu),即任務(wù)列表,每個活動進(jìn)程具有一個條目。此數(shù)據(jù)結(jié)構(gòu)包含足夠的信息來暫停和恢復(fù)過程,但還包含其他記帳和狀態(tài)信息。該數(shù)據(jù)結(jié)構(gòu)可在整個內(nèi)核層公開使用。
如前所述,進(jìn)程調(diào)度程序?qū)⒄{(diào)用內(nèi)存管理器子系統(tǒng)。因此,進(jìn)程調(diào)度程序子系統(tǒng)依賴于內(nèi)存管理器子系統(tǒng)。此外,所有其他內(nèi)核子系統(tǒng)都依賴進(jìn)程調(diào)度程序來掛起和恢復(fù)進(jìn)程,同時等待硬件請求完成。這些依賴關(guān)系通過函數(shù)調(diào)用和對共享任務(wù)列表數(shù)據(jù)結(jié)構(gòu)的訪問來表示。所有內(nèi)核子系統(tǒng)都讀取和寫入代表當(dāng)前任務(wù)的數(shù)據(jù)結(jié)構(gòu),從而導(dǎo)致整個系統(tǒng)中的雙向數(shù)據(jù)流。
除了內(nèi)核層中的數(shù)據(jù)和控制流之外,O / S服務(wù)層還為用戶進(jìn)程提供了一個接口,用于注冊計時器通知。這對應(yīng)于[Garlan 1994]中描述的隱式執(zhí)行體系結(jié)構(gòu)樣式。這導(dǎo)致控制從調(diào)度程序流向用戶進(jìn)程?;謴?fù)休眠過程的通常情況在正常情況下不視為控制流程,因?yàn)橛脩暨M(jìn)程無法檢測到此操作。最后,調(diào)度程序與CPU通信以掛起和恢復(fù)進(jìn)程。這導(dǎo)致數(shù)據(jù)流和控制流。CPU負(fù)責(zé)中斷當(dāng)前正在執(zhí)行的進(jìn)程,并允許內(nèi)核調(diào)度另一個進(jìn)程。
3.2 內(nèi)存管理器架構(gòu)
內(nèi)存管理器子系統(tǒng)負(fù)責(zé)控制對硬件內(nèi)存資源的進(jìn)程訪問。這是通過硬件內(nèi)存管理系統(tǒng)完成的,該系統(tǒng)提供了進(jìn)程內(nèi)存引用與機(jī)器物理內(nèi)存之間的映射。內(nèi)存管理器子系統(tǒng)在每個進(jìn)程的基礎(chǔ)上維護(hù)此映射,以便兩個進(jìn)程可以訪問相同的虛擬內(nèi)存地址并實(shí)際使用不同的物理內(nèi)存位置。此外,內(nèi)存管理器子系統(tǒng)還支持交換。它將未使用的內(nèi)存頁面移至持久性存儲,以使計算機(jī)支持的虛擬內(nèi)存多于物理內(nèi)存。
3.2.1 模塊結(jié)構(gòu)分析
內(nèi)存管理器主要由以下三個模塊組成:
體系結(jié)構(gòu)相關(guān)模塊為內(nèi)存管理硬件提供了虛擬接口
體系結(jié)構(gòu)無關(guān)模塊執(zhí)行所有的每個進(jìn)程映射和虛擬內(nèi)存交換。此模塊負(fù)責(zé)確定在出現(xiàn)頁面錯誤時將收回哪些內(nèi)存頁面-由于沒有預(yù)期將需要更改此策略,因此沒有單獨(dú)的策略模塊。
系統(tǒng)調(diào)用接口模塊提供對用戶進(jìn)程的受限訪問。該接口允許用戶進(jìn)程分配和釋放存儲,還可以執(zhí)行內(nèi)存映射文件I / O。
3.2.2 從數(shù)據(jù)表征的角度分析:
內(nèi)存管理器存儲物理地址到虛擬地址的每個進(jìn)程的映射。該映射作為參考存儲在流程調(diào)度程序的任務(wù)列表數(shù)據(jù)結(jié)構(gòu)中。除了此映射之外,數(shù)據(jù)塊中的其他詳細(xì)信息還告訴內(nèi)存管理器如何獲取和存儲頁面。例如,可執(zhí)行代碼可以將可執(zhí)行映像用作后備存儲,但是必須將動態(tài)分配的數(shù)據(jù)備份到系統(tǒng)頁面文件中。最后,內(nèi)存管理器在此數(shù)據(jù)結(jié)構(gòu)中存儲權(quán)限和記帳信息,以確保系統(tǒng)安全。
3.2.3 數(shù)據(jù)流,控制流和依賴關(guān)系
內(nèi)存管理器控制內(nèi)存硬件,并在發(fā)生頁面錯誤時從硬件接收通知-這意味著內(nèi)存管理器模塊和內(nèi)存管理器硬件之間存在雙向數(shù)據(jù)和控制流。另外,內(nèi)存管理器使用文件系統(tǒng)來支持交換和內(nèi)存映射的I / O。此要求意味著內(nèi)存管理器需要對文件系統(tǒng)進(jìn)行過程調(diào)用以存儲和從持久性存儲中獲取內(nèi)存頁面。由于無法立即完成文件系統(tǒng)請求,因此內(nèi)存管理器需要暫停一個過程,直到將內(nèi)存換回為止。此要求導(dǎo)致內(nèi)存管理器對過程調(diào)度程序進(jìn)行過程調(diào)用。同樣,由于每個進(jìn)程的內(nèi)存映射都存儲在進(jìn)程調(diào)度程序的數(shù)據(jù)結(jié)構(gòu)中,因此在內(nèi)存管理器和進(jìn)程調(diào)度程序之間存在雙向數(shù)據(jù)流。用戶進(jìn)程可以在進(jìn)程地址空間內(nèi)設(shè)置新的內(nèi)存映射,并可以注冊自己以在新映射的區(qū)域內(nèi)通知頁面錯誤。這引入了從內(nèi)存管理器到系統(tǒng)調(diào)用接口模塊再到用戶進(jìn)程的控制流。從傳統(tǒng)意義上講,沒有來自用戶進(jìn)程的數(shù)據(jù)流,但是用戶進(jìn)程可以使用系統(tǒng)調(diào)用接口模塊中的選擇系統(tǒng)調(diào)用從內(nèi)存管理器中檢索某些信息。
3.3 虛擬文件系統(tǒng)架構(gòu)
虛擬文件系統(tǒng)旨在提供存儲在硬件設(shè)備上的數(shù)據(jù)的一致視圖。計算機(jī)中幾乎所有的硬件設(shè)備都是使用通用設(shè)備驅(qū)動程序接口表示的。虛擬文件系統(tǒng)進(jìn)一步發(fā)展,并允許系統(tǒng)管理員在任何物理設(shè)備上安裝一組邏輯文件系統(tǒng)中的任何一個。邏輯文件系統(tǒng)促進(jìn)與其他操作系統(tǒng)標(biāo)準(zhǔn)的兼容性,并允許開發(fā)人員使用不同的策略來實(shí)現(xiàn)文件系統(tǒng)。虛擬文件系統(tǒng)抽象了物理設(shè)備和邏輯文件系統(tǒng)的詳細(xì)信息,并允許用戶進(jìn)程使用通用接口訪問文件,而不必知道文件駐留在哪個物理或邏輯系統(tǒng)上。
除了傳統(tǒng)的文件系統(tǒng)目標(biāo)之外,虛擬文件系統(tǒng)還負(fù)責(zé)加載新的可執(zhí)行程序。該責(zé)任由邏輯文件系統(tǒng)模塊完成,這使Linux支持多種可執(zhí)行格式。
故簡言之:
抽象物理設(shè)備和邏輯文件系統(tǒng)的詳細(xì)信息,提供公共訪問接口。
提供通用的設(shè)備驅(qū)動程序接口。
加載新的可執(zhí)行程序。
3.3.1 模塊結(jié)構(gòu)分析
可分為四大模塊:
公共驅(qū)動抽象模塊 由于存在大量不兼容的硬件設(shè)備,因此存在大量的設(shè)備驅(qū)動程序。Linux系統(tǒng)最常見的擴(kuò)展是添加了新的設(shè)備驅(qū)動程序。設(shè)備獨(dú)立接口模塊提供了所有設(shè)備的一致視圖。
邏輯文件系統(tǒng)模塊,每個支持的文件系統(tǒng)都有一個邏輯文件系統(tǒng)模塊。
系統(tǒng)獨(dú)立接口層提供了硬件資源與硬件和邏輯文件系統(tǒng)無關(guān)的視圖。該模塊使用面向塊或面向字符的文件接口顯示所有資源。
系統(tǒng)調(diào)用接口層為用戶進(jìn)程提供對文件系統(tǒng)的受控訪問。虛擬文件系統(tǒng)僅將特定功能導(dǎo)出到用戶進(jìn)程。
3.4 網(wǎng)絡(luò)接口層架構(gòu)
網(wǎng)絡(luò)子系統(tǒng)允許Linux系統(tǒng)通過網(wǎng)絡(luò)連接到其他系統(tǒng)。支持許多可能的硬件設(shè)備,以及可以使用的許多網(wǎng)絡(luò)協(xié)議。網(wǎng)絡(luò)子系統(tǒng)抽象了這兩個實(shí)現(xiàn)細(xì)節(jié),因此用戶進(jìn)程和其他內(nèi)核子系統(tǒng)可以訪問網(wǎng)絡(luò)而不必知道正在使用什么物理設(shè)備或協(xié)議。
3.4.1 模塊結(jié)構(gòu)組成
網(wǎng)絡(luò)設(shè)備驅(qū)動程序負(fù)責(zé)與硬件設(shè)備通信。每個可能的硬件設(shè)備都有一個設(shè)備驅(qū)動程序模塊。
設(shè)備無關(guān)的接口模塊提供了所有硬件設(shè)備的一致視圖,因此子系統(tǒng)中的更高級別不需要特定的使用硬件知識。
網(wǎng)絡(luò)協(xié)議模塊負(fù)責(zé)實(shí)現(xiàn)每種可能的網(wǎng)絡(luò)傳輸協(xié)議。
協(xié)議無關(guān)接口模塊提供獨(dú)立于硬件設(shè)備和網(wǎng)絡(luò)協(xié)議的接口。這是接口模塊,其他內(nèi)核子系統(tǒng)使用該接口模塊訪問網(wǎng)絡(luò),而無需依賴特定的協(xié)議或硬件。
簡言之,
網(wǎng)絡(luò)設(shè)備驅(qū)動實(shí)現(xiàn)底層硬件的控制
設(shè)備獨(dú)立接口層為上層提供對底層設(shè)備驅(qū)動層實(shí)現(xiàn)統(tǒng)一訪問接口
網(wǎng)絡(luò)協(xié)議層實(shí)現(xiàn)不同的網(wǎng)絡(luò)協(xié)議
協(xié)議獨(dú)立接口層用以抽象隱藏不同硬件、不同網(wǎng)絡(luò)協(xié)議
評論