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