當前位置:學問君>人在職場>IT認證>

Linux概念架構解讀2016

學問君 人氣:1.59W

Linux系統一般有4個主要部分:內核、shell、檔案系統和應用程序。內核、shell和檔案系統一起形成了基本的操作系統結構,它們使得用戶可以執行程序、管理檔案並使用系統。下面一起來看看專家對Linux系統架構的最新解讀吧!

Linuxkernel成功的兩個原因:(1)靈活的架構設計使得大量的志願開發者能夠很容易加入到開發過程中;(2)每個子系統(尤其是那些需要改進的)都具備良好的可擴展性。正是這兩個原因使得Linux kernel可以不斷進化和改進。

一、Linux內核在整個計算機系統中的位置

Fig 1 - 計算機系統分層結構

分層結構的原則:the dependencies between subsystems are from the top down: layers pictured near the top depend on lower layers, but subsystems nearer the bottom do not depend on higher layers.

這種子系統之間的依賴性只能是從上到下,也就是在上圖中位於頂層的子系統依賴位於底層的子系統,反之則不行。

二、內核的作用

虛擬化(抽象),將計算機硬件抽象爲一臺虛擬機,供用戶進程(process)使用;進程執行時完全不需要知道硬件是如何工作的,只要調用Linux kernel提供的虛擬接口(virtual interface)即可。

多任務處理,實際上是多個任務在並行使用計算機硬件資源,內核的任務是仲裁對資源的使用,製造每個進程都以爲自己是獨佔系統的錯覺。

PS:進程上下文切換就是要換掉程序狀態字、換掉頁表基地址寄存器的內容、換掉current指向的task_struct實例、換掉PC——>也就換掉了進程開啟的檔案(透過task_struct的files可以找到)、換掉了進程內存的執行空間(透過task_struct的mem可以找到);

三、Linux內核的整體架構

Linux內核的整體架構

中心繫統是Process Scheduler(SCHED):所有其餘的子系統都依賴於Process Scheduler,因爲其餘子系統都需要阻塞和恢復進程。當一個進程需要等待一個硬件動作完成時,相應子系統會阻塞這個進程;當這個硬件動作完成時,子系統會將這個進程恢復:這個阻塞和恢復動作都要依賴於Processor Scheduler完成。

Process Scheduler依賴Memory manager:進程恢復執行時,需要依靠Memory Manager分配供它執行的內存。

IPC子系統依賴於Memory manager:共享內存機制是進程間通信的一種方法,執行兩個進程利用同一塊共享的內存空間進行資訊傳遞。

VFS依賴於Network Interface:支援NFS網絡檔案系統;

VFS依賴於Memory Manager:支援ramdisk 設備

memory manager依賴於VFS,因爲要支援swapping,可以將暫時不執行的進程換出到磁盤上的swap分區,進入掛起狀態。

四、高度模組化設計的系統,利於分工合作。

只有極少數的程序員需要橫跨多個模組開展工作,這種情況確實會發生,僅發生在當前系統需要依賴另一個子系統時;

硬件設備驅動(hardware device drivers)、檔案系統模組(logical filesystem

modules)、網絡設備驅動(network device drivers)和網絡協議模組(network protocol modules)這四個模組的可擴展性最高。

五、系統中的數據結構

Task List

Process Scheduler 針對每個進程維護一個數據結構task_struct;所有的進程用鏈表管理,形成task list;process

scheduler還維護一個current指針指向當前正在佔用CPU的進程。

Memory Map

Memory

Manager存儲每個進程的虛擬地址到物理地址的映射;並且也提供瞭如何換出特定的頁,或者是如何進行缺頁處理。這些資訊存放在數據結構mm_struct中。每個進程都有一個mm_struct結構,在進程的task_struct結構中有一個指針mm指向次進程的mm_struct結構。

在mm_struct中有一個指針pgd,指向該進程的頁目錄表(即存放頁目錄首地址)——>當該進程被調度時,此指針被換成物理地址,寫入控制寄存器CR3(x86體系結構下的頁基址寄存器)

I-nodes

VFS透過inodes節點表示磁盤上的檔案鏡像,inodes用於記錄檔案的物理屬性。每個進程都有一個files_struct結構,用於表示該進程開啟的檔案,在task_struct中有個files指針。使用inodes節點可以實現檔案共享。檔案共享有兩種方式:(1)透過同一個系統開啟檔案file指向同一個inodes節點,這種情況發生於父子進程間;(2)透過不同系統開啟檔案指向同一個inode節點,舉例有硬連結;或者是兩個不相關的指針開啟同一個檔案。

Data Connection

內核中所有的數據結構的根都在Process Scheduler維護的task list鏈表中。系統中每個進程的的數據結構task_struct中有一個指針mm指向它的內存映射資訊;也有一個指針files指向它開啟的檔案(用戶開啟檔案表);還有一個指針指向該進程開啟的網絡套接字。

六、子系統架構

1. Process Scheduler 架構

(1)目標

process scheduler是Linux

kernel中最重要的子系統。系統透過它來控制對CPU的訪問——不僅僅是用戶進程對CPU的訪問,也包括其餘子系統對CPU的訪問。

(2)模組

進程調度器

調度策略模組(scheduling policy

module):決定哪個進程獲得對CPU的訪問權;調度策略應該讓所有進程儘可能公平得共享CPU。

體系結構相關模組(architecture-specific

module)設計一組統一的抽象接口來屏蔽特定體系接口芯片的硬件細節。這個模組與CPU交互以阻塞和恢復進程。這些操作包括獲取每個進程需要儲存的寄存器和狀態資訊、執行彙編代碼來完成阻塞或者恢復操作。

體系結構無關模組(architecture-independent module)

與調度策略模組交互將決定下一個執行的進程,然後調用體系結構相關的代碼去恢復那個進程的執行。不僅如此,這個模組還會調用memory

manager的接口來確保被阻塞的進程的內存映射資訊被正確得儲存起來。

系統調用接口模組(system call interface) 允許用戶進程訪問Linux

Kernel明確暴露給用戶進程的資源。透過一組定義合適的基本上不變的接口(POSIX標準),將用戶應用程序和Linux內核解耦,使得用戶進程不會受到內核變化的影響。

(3). 數據表示

調度器維護一個數據結構——task list,其中的元素時每個活動的進程task_struct實例;這個數據結構不僅僅包含用來阻塞和恢復進程的資訊,也包含額外的計數和狀態資訊。這個數據結構在整個kernel層都可以公共訪問。

(4). 依賴關係、數據流、控制流

正如前面提到過的,調度器需要調用memory manager提供的功能,去爲需要恢復執行的進程選擇合適的`物理地址,正因爲如此,所以Process Scheuler子系統依賴於內存管理子系統。當其他內核子系統需要等待硬件請求完成時,它們都依賴於進程調度子系統進行進程的阻塞和恢復。這種依賴性透過函數調用和訪問共享的task list數據結構來體現。所有的內核子系統都要讀或者寫代表當前正在執行進程的數據結構,因此形成了貫穿整個系統的雙向數據流。

除了內核層的數據流和控制流,OS服務層還給用戶進程提供註冊定時器的接口。這形成了由調度器對用戶進程的控制流。通常喚醒睡眠進程的用例不在正常的控制流範圍,因爲用戶進程無法預知何時被喚醒。最後,調度器與CPU交互來阻塞和恢復進程,這又形成它們之間的數據流和控制流——CPU負責打斷當前正在執行的進程,並允許內核調度其他的進程執行。

2. Memory Manager 架構

(1)目標

內存管理模組負責控制進程如何訪問物理內存資源。透過硬件內存管理系統(MMU)管理進程虛擬內存和機器物理內存之間的映射。每一個進程都有自己獨立的虛擬內存空間,所以兩個進程可能有相同的虛擬地址,但是它們實際上在不同的物理內存區域執行。MMU提供內存保護,讓兩個進程的物理內存空間不互相干擾。內存管理模組還支援swap——將暫時不用的內存頁換出到磁盤上的swap分區,這種技術讓進程的虛擬地址空間大於物理內存的大小。虛擬地址空間的大小由機器字長決定。

(2)模組

內存管理子系統

架構相關模組(architecture specific module)提供訪問物理內存的虛擬接口;

架構無關模組(architecture independent module)負責每個進程的地址映射以及虛擬內存交換。當發生缺頁錯誤時,由該模組負責決定哪個內存頁應該被換出內存——因爲這個內存頁換出選擇算法幾乎不需要改動,所以這裏沒有建立一個獨立的策略模組。

系統調用接口(system call interface) 爲用戶進程提供嚴格的訪問接口(malloc和free;mmap和ummap)。這個模組允許用進程分配和釋放內存、執行內存映射檔案操作。

(3)數據表示

內存管理存放每個進程的虛擬內存到物理內存的映射資訊。這種映射資訊存放在mm_struct結構實例中,這個實例的指針又存放在每個進程的task_struct中。除了存放映射資訊,數據塊中還應該存放關於內存管理器如何獲取和存儲頁的資訊。例如:可執行代碼能夠將可執行鏡像作爲備份存儲;但是動態申請的數據則必須備份到系統頁中。(這個沒看懂,請高手解惑?)

最後,內存管理模組還應該存放訪問和技術資訊,以保證系統的安全。

(4)依賴關係、數據流和控制流

內存管理器控制物理內存,當page fault發生時,接受硬件的通知(缺頁中斷)—— 這意味着在內存管理模組和內存管理硬件之間存在雙向的數據流和控制流。內存管理也依賴檔案系統來支援swapping和內存映射I/O——這種需求意味着內存管理器需要調用對檔案系統提供的函數接口(procedure calls),往磁盤中存放內存頁和從磁盤中取內存頁。因爲檔案系統請求非常慢,所以在等待內存頁被換入之前,內存管理器要讓進程需要進入休眠——這種需求讓內存管理器調用process scheduler的接口。由於每個進程的內存映射存放在進程調度器的數據結構中,所以在內存管理器和進程調度器之間也有雙向的數據流和控制流。用戶進程可以建立新的進程地址空間,並且能夠感知缺頁錯誤——這裏需要來自內存管理器的控制流。一般來說沒有用戶進程到內存管理器的數據流,但是用戶進程卻可以透過select系統調用,從內存管理器獲取一些資訊。

3. Virtual File System 架構

(1)目標

虛擬檔案系統爲存儲在硬件設備上數據提供統一的訪問接口。可以相容不同的檔案系統(ext2,ext4,ntf等等)。計算機中幾乎所有的硬件設備都被表示爲一個通用的設備驅動接口。邏輯檔案系統促進與其他操作系統標準的相容性,並且允許開發者以不同的策略實現檔案系統。虛擬檔案系統更進一步,允許系統管理員在任何設備上掛載任何邏輯檔案系統。虛擬檔案系統封裝物理設備和邏輯檔案系統的細節,並且允許用戶進程使用統一的接口訪問檔案。

除了傳統的檔案系統目標,VFS也負責裝載新的可執行檔案。這個任務由邏輯檔案系統模組完成,使得Linux可以支援多種可執行檔案。

(2)模組

虛擬檔案系統模組

設備驅動模組(device driver module)

設備獨立接口模組(Device Independent Interface):提供所有設備的同一視圖

邏輯檔案系統(logical file system):針對每種支援的檔案系統

系統獨立接口(system independent

interface)提供硬件資源和邏輯檔案系統都無關的接口,這個模組透過塊設備節點或者字元設備節點提供所有的資源。

系統調用模組(system call interface)提供用戶進程對檔案系統的統一控制訪問。虛擬檔案系統爲用戶進程屏蔽了所有特殊的特性。

(3)數據表示

所有檔案使用i-nodes表示。每個inode都記錄一個檔案在硬件設備上的位置資訊。不僅如此,inode還存放着指向邏輯檔案系統模組和設備驅動的的函數指針,這些指針能夠執行具體的讀寫操作。透過按照這種形式(就是面向對象中的虛函數的思想)存放函數指針,具體的邏輯檔案系統和設備驅動可以向內核註冊自己而不需要內核依賴具體的模組特性。

(4)依賴關係、數據流和控制流

一個特殊的設備驅動是ramdisk,這個設備在主存中開闢一片區域,並把它當成持久性存儲設備使用。這個設備驅動使用內存管理模組完成任務,所以在VFS與對內存管理模組存在依賴關係(圖中的依賴關係反了,應該是VFS依賴於內存管理模組)、數據流和控制流。

邏輯檔案系統支援網絡檔案系統。這個檔案系統像訪問本地檔案一樣,從另一臺機器上訪問檔案。爲了實現這個功能,一種邏輯檔案系統透過網絡子系統完成它的任務——這引入了VFS對網絡子系統的一個依賴關係以及它們之間的控制流和數據流。

正如前面提到的,內存管理器使用VFS完成內存swap功能和內存映射I/O。另外,當VFS等待硬件請求完成時,VFS需要使用進程調度器阻塞進程;當請求完成時,VFS需要透過進程調度器喚醒進程。最後,系統調用接口允許用戶進程調用來存取數據。不像前面的子系統,VFS沒有提供給用戶註冊不明確調用的機制,所以沒有從VFS到用戶進程的控制流。

4. Network Interface 架構

(1)目標

網絡子系統讓Linux系統能夠透過網絡與其他系統相連。這個子系統支援很多硬件設備,也支援很多網絡協議。網絡子系統將硬件和協議的實現細節都屏蔽掉,並抽象出簡單易用的接口供用戶進程和其他子系統使用——用戶進程和其餘子系統不需要知道硬件設備和協議的細節。

(2)模組

網絡協議層模組圖

網絡設備驅動模組(network device drivers)

設備獨立接口模組(device independent interface

module)提供所有硬件設備的一致訪問接口,使得高層子系統不需要知道硬件的細節資訊。

網絡協議模組(network protocol modules)負責實現每一個網絡傳輸協議,例如:TCP,UDP,IP,HTTP,ARP等等~

協議無關模組(protocol independent interface)提供獨立於具體協議和具體硬件設備的一致性接口。這使得其餘內核子系統無需依賴特定的協議或者設備就能訪問網絡。

系統調用接口模組(system calls interface)規定了用戶進程可以訪問的網絡編程API

(3)數據表示

每個網絡對象都被表示爲一個套接字(socket)。套接字與進程關聯的方法和i-nodes節點相同。透過兩個task_struct指向同一個套接字,套接字可以被多個進程共享。

(4)數據流,控制流和依賴關係

當網絡子系統需要等待硬件請求完成時,它需要透過進程調度系統將進程阻塞和喚醒——這形成了網絡子系統和進程調度子系統之間的控制流和數據流。不僅如此,虛擬檔案系統透過網絡子系統實現網絡檔案系統(NFS)——這形成了VFS和網絡子系統指甲的數據流和控制流。

七、結論

1、Linux內核是整個Linux系統中的一層。內核從概念上由五個主要的子系統構成:進程調度器模組、內存管理模組、虛擬檔案系統、網絡接口模組和進程間通信模組。這些模組之間透過函數調用和共享數據結構進行數據交互。、

2、Linux內核架構促進了他的成功,這種架構使得大量的志願開發人員可以合適得分工合作,並且使得各個特定的模組便於擴展。

可擴展性一:Linux架構透過一項數據抽象技術使得這些子系統成爲可擴展的——每個具體的硬件設備驅動都實現爲單獨的模組,該模組支援內核提供的統一的接口。透過這種方式,個人開發者只需要和其他內核開發者做最少的交互,就可以爲Linux內核添加新的設備驅動。

可擴展性二:Linux內核支援多種不同的體系結構。在每個子系統中,都將體系結構相關的代碼分割出來,形成單獨的模組。透過這種方法,一些廠家在推出他們自己的芯片時,他們的內核開發小組只需要重新實現內核中機器相關的代碼,就可以講內核移植到新的芯片上執行。