1. <tt id="5hhch"><source id="5hhch"></source></tt>
    1. <xmp id="5hhch"></xmp>

  2. <xmp id="5hhch"><rt id="5hhch"></rt></xmp>

    <rp id="5hhch"></rp>
        <dfn id="5hhch"></dfn>

      1. Linux概念架構(gòu)解讀

        時間:2023-03-09 02:54:19 Linux認(rèn)證 我要投稿
        • 相關(guān)推薦

        Linux概念架構(gòu)解讀2016

          Linux系統(tǒng)一般有4個主要部分:內(nèi)核、shell、文件系統(tǒng)和應(yīng)用程序。內(nèi)核、shell和文件系統(tǒng)一起形成了基本的操作系統(tǒng)結(jié)構(gòu),它們使得用戶可以運行程序、管理文件并使用系統(tǒng)。下面一起來看看專家對Linux系統(tǒng)架構(gòu)的最新解讀吧!

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

          一、Linux內(nèi)核在整個計算機系統(tǒng)中的位置

          Fig 1 - 計算機系統(tǒng)分層結(jié)構(gòu)

          分層結(jié)構(gòu)的原則: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.

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

          二、內(nèi)核的作用

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

          多任務(wù)處理,實際上是多個任務(wù)在并行使用計算機硬件資源,內(nèi)核的任務(wù)是仲裁對資源的使用,制造每個進程都以為自己是獨占系統(tǒng)的錯覺。

          PS:進程上下文切換就是要換掉程序狀態(tài)字、換掉頁表基地址寄存器的內(nèi)容、換掉current指向的task_struct實例、換掉PC——>也就換掉了進程打開的文件(通過task_struct的files可以找到)、換掉了進程內(nèi)存的執(zhí)行空間(通過task_struct的mem可以找到);

          三、Linux內(nèi)核的整體架構(gòu)

          Linux內(nèi)核的整體架構(gòu)

          中心系統(tǒng)是Process Scheduler(SCHED):所有其余的子系統(tǒng)都依賴于Process Scheduler,因為其余子系統(tǒng)都需要阻塞和恢復(fù)進程。當(dāng)一個進程需要等待一個硬件動作完成時,相應(yīng)子系統(tǒng)會阻塞這個進程;當(dāng)這個硬件動作完成時,子系統(tǒng)會將這個進程恢復(fù):這個阻塞和恢復(fù)動作都要依賴于Processor Scheduler完成。

          Process Scheduler依賴Memory manager:進程恢復(fù)執(zhí)行時,需要依靠Memory Manager分配供它運行的內(nèi)存。

          IPC子系統(tǒng)依賴于Memory manager:共享內(nèi)存機制是進程間通信的一種方法,運行兩個進程利用同一塊共享的內(nèi)存空間進行信息傳遞。

          VFS依賴于Network Interface:支持NFS網(wǎng)絡(luò)文件系統(tǒng);

          VFS依賴于Memory Manager:支持ramdisk 設(shè)備

          memory manager依賴于VFS,因為要支持swapping,可以將暫時不運行的進程換出到磁盤上的swap分區(qū),進入掛起狀態(tài)。

          四、高度模塊化設(shè)計的系統(tǒng),利于分工合作。

          只有極少數(shù)的程序員需要橫跨多個模塊開展工作,這種情況確實會發(fā)生,僅發(fā)生在當(dāng)前系統(tǒng)需要依賴另一個子系統(tǒng)時;

          硬件設(shè)備驅(qū)動(hardware device drivers)、文件系統(tǒng)模塊(logical filesystem

          modules)、網(wǎng)絡(luò)設(shè)備驅(qū)動(network device drivers)和網(wǎng)絡(luò)協(xié)議模塊(network protocol modules)這四個模塊的可擴展性最高。

          五、系統(tǒng)中的數(shù)據(jù)結(jié)構(gòu)

          Task List

          Process Scheduler 針對每個進程維護一個數(shù)據(jù)結(jié)構(gòu)task_struct;所有的進程用鏈表管理,形成task list;process

          scheduler還維護一個current指針指向當(dāng)前正在占用CPU的進程。

          Memory Map

          Memory

          Manager存儲每個進程的虛擬地址到物理地址的映射;并且也提供了如何換出特定的頁,或者是如何進行缺頁處理。這些信息存放在數(shù)據(jù)結(jié)構(gòu)mm_struct中。每個進程都有一個mm_struct結(jié)構(gòu),在進程的task_struct結(jié)構(gòu)中有一個指針mm指向次進程的mm_struct結(jié)構(gòu)。

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

          I-nodes

          VFS通過inodes節(jié)點表示磁盤上的文件鏡像,inodes用于記錄文件的物理屬性。每個進程都有一個files_struct結(jié)構(gòu),用于表示該進程打開的文件,在task_struct中有個files指針。使用inodes節(jié)點可以實現(xiàn)文件共享。文件共享有兩種方式:(1)通過同一個系統(tǒng)打開文件file指向同一個inodes節(jié)點,這種情況發(fā)生于父子進程間;(2)通過不同系統(tǒng)打開文件指向同一個inode節(jié)點,舉例有硬鏈接;或者是兩個不相關(guān)的指針打開同一個文件。

          Data Connection

          內(nèi)核中所有的數(shù)據(jù)結(jié)構(gòu)的根都在Process Scheduler維護的task list鏈表中。系統(tǒng)中每個進程的的數(shù)據(jù)結(jié)構(gòu)task_struct中有一個指針mm指向它的內(nèi)存映射信息;也有一個指針files指向它打開的文件(用戶打開文件表);還有一個指針指向該進程打開的網(wǎng)絡(luò)套接字。

          六、子系統(tǒng)架構(gòu)

          1. Process Scheduler 架構(gòu)

          (1)目標(biāo)

          process scheduler是Linux

          kernel中最重要的子系統(tǒng)。系統(tǒng)通過它來控制對CPU的訪問——不僅僅是用戶進程對CPU的訪問,也包括其余子系統(tǒng)對CPU的訪問。

          (2)模塊

          進程調(diào)度器

          調(diào)度策略模塊(scheduling policy

          module):決定哪個進程獲得對CPU的訪問權(quán);調(diào)度策略應(yīng)該讓所有進程盡可能公平得共享CPU。

          體系結(jié)構(gòu)相關(guān)模塊(architecture-specific

          module)設(shè)計一組統(tǒng)一的抽象接口來屏蔽特定體系接口芯片的硬件細(xì)節(jié)。這個模塊與CPU交互以阻塞和恢復(fù)進程。這些操作包括獲取每個進程需要保存的寄存器和狀態(tài)信息、執(zhí)行匯編代碼來完成阻塞或者恢復(fù)操作。

          體系結(jié)構(gòu)無關(guān)模塊(architecture-independent module)

          與調(diào)度策略模塊交互將決定下一個執(zhí)行的進程,然后調(diào)用體系結(jié)構(gòu)相關(guān)的代碼去恢復(fù)那個進程的執(zhí)行。不僅如此,這個模塊還會調(diào)用memory

          manager的接口來確保被阻塞的進程的內(nèi)存映射信息被正確得保存起來。

          系統(tǒng)調(diào)用接口模塊(system call interface) 允許用戶進程訪問Linux

          Kernel明確暴露給用戶進程的資源。通過一組定義合適的基本上不變的接口(POSIX標(biāo)準(zhǔn)),將用戶應(yīng)用程序和Linux內(nèi)核解耦,使得用戶進程不會受到內(nèi)核變化的影響。

          (3). 數(shù)據(jù)表示

          調(diào)度器維護一個數(shù)據(jù)結(jié)構(gòu)——task list,其中的元素時每個活動的進程task_struct實例;這個數(shù)據(jù)結(jié)構(gòu)不僅僅包含用來阻塞和恢復(fù)進程的信息,也包含額外的計數(shù)和狀態(tài)信息。這個數(shù)據(jù)結(jié)構(gòu)在整個kernel層都可以公共訪問。

          (4). 依賴關(guān)系、數(shù)據(jù)流、控制流

          正如前面提到過的,調(diào)度器需要調(diào)用memory manager提供的功能,去為需要恢復(fù)執(zhí)行的進程選擇合適的物理地址,正因為如此,所以Process Scheuler子系統(tǒng)依賴于內(nèi)存管理子系統(tǒng)。當(dāng)其他內(nèi)核子系統(tǒng)需要等待硬件請求完成時,它們都依賴于進程調(diào)度子系統(tǒng)進行進程的阻塞和恢復(fù)。這種依賴性通過函數(shù)調(diào)用和訪問共享的task list數(shù)據(jù)結(jié)構(gòu)來體現(xiàn)。所有的內(nèi)核子系統(tǒng)都要讀或者寫代表當(dāng)前正在運行進程的數(shù)據(jù)結(jié)構(gòu),因此形成了貫穿整個系統(tǒng)的雙向數(shù)據(jù)流。

          除了內(nèi)核層的數(shù)據(jù)流和控制流,OS服務(wù)層還給用戶進程提供注冊定時器的接口。這形成了由調(diào)度器對用戶進程的控制流。通常喚醒睡眠進程的用例不在正常的控制流范圍,因為用戶進程無法預(yù)知何時被喚醒。最后,調(diào)度器與CPU交互來阻塞和恢復(fù)進程,這又形成它們之間的數(shù)據(jù)流和控制流——CPU負(fù)責(zé)打斷當(dāng)前正在運行的進程,并允許內(nèi)核調(diào)度其他的進程運行。

          2. Memory Manager 架構(gòu)

          (1)目標(biāo)

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

          (2)模塊

          內(nèi)存管理子系統(tǒng)

          架構(gòu)相關(guān)模塊(architecture specific module)提供訪問物理內(nèi)存的虛擬接口;

          架構(gòu)無關(guān)模塊(architecture independent module)負(fù)責(zé)每個進程的地址映射以及虛擬內(nèi)存交換。當(dāng)發(fā)生缺頁錯誤時,由該模塊負(fù)責(zé)決定哪個內(nèi)存頁應(yīng)該被換出內(nèi)存——因為這個內(nèi)存頁換出選擇算法幾乎不需要改動,所以這里沒有建立一個獨立的策略模塊。

          系統(tǒng)調(diào)用接口(system call interface) 為用戶進程提供嚴(yán)格的訪問接口(malloc和free;mmap和ummap)。這個模塊允許用進程分配和釋放內(nèi)存、執(zhí)行內(nèi)存映射文件操作。

          (3)數(shù)據(jù)表示

          內(nèi)存管理存放每個進程的虛擬內(nèi)存到物理內(nèi)存的映射信息。這種映射信息存放在mm_struct結(jié)構(gòu)實例中,這個實例的指針又存放在每個進程的task_struct中。除了存放映射信息,數(shù)據(jù)塊中還應(yīng)該存放關(guān)于內(nèi)存管理器如何獲取和存儲頁的信息。例如:可執(zhí)行代碼能夠?qū)⒖蓤?zhí)行鏡像作為備份存儲;但是動態(tài)申請的數(shù)據(jù)則必須備份到系統(tǒng)頁中。(這個沒看懂,請高手解惑?)

          最后,內(nèi)存管理模塊還應(yīng)該存放訪問和技術(shù)信息,以保證系統(tǒng)的安全。

          (4)依賴關(guān)系、數(shù)據(jù)流和控制流

          內(nèi)存管理器控制物理內(nèi)存,當(dāng)page fault發(fā)生時,接受硬件的通知(缺頁中斷)—— 這意味著在內(nèi)存管理模塊和內(nèi)存管理硬件之間存在雙向的數(shù)據(jù)流和控制流。內(nèi)存管理也依賴文件系統(tǒng)來支持swapping和內(nèi)存映射I/O——這種需求意味著內(nèi)存管理器需要調(diào)用對文件系統(tǒng)提供的函數(shù)接口(procedure calls),往磁盤中存放內(nèi)存頁和從磁盤中取內(nèi)存頁。因為文件系統(tǒng)請求非常慢,所以在等待內(nèi)存頁被換入之前,內(nèi)存管理器要讓進程需要進入休眠——這種需求讓內(nèi)存管理器調(diào)用process scheduler的接口。由于每個進程的內(nèi)存映射存放在進程調(diào)度器的數(shù)據(jù)結(jié)構(gòu)中,所以在內(nèi)存管理器和進程調(diào)度器之間也有雙向的數(shù)據(jù)流和控制流。用戶進程可以建立新的進程地址空間,并且能夠感知缺頁錯誤——這里需要來自內(nèi)存管理器的控制流。一般來說沒有用戶進程到內(nèi)存管理器的數(shù)據(jù)流,但是用戶進程卻可以通過select系統(tǒng)調(diào)用,從內(nèi)存管理器獲取一些信息。

          3. Virtual File System 架構(gòu)

          (1)目標(biāo)

          虛擬文件系統(tǒng)為存儲在硬件設(shè)備上數(shù)據(jù)提供統(tǒng)一的訪問接口?梢约嫒莶煌奈募到y(tǒng)(ext2,ext4,ntf等等)。計算機中幾乎所有的硬件設(shè)備都被表示為一個通用的設(shè)備驅(qū)動接口。邏輯文件系統(tǒng)促進與其他操作系統(tǒng)標(biāo)準(zhǔn)的兼容性,并且允許開發(fā)者以不同的策略實現(xiàn)文件系統(tǒng)。虛擬文件系統(tǒng)更進一步,允許系統(tǒng)管理員在任何設(shè)備上掛載任何邏輯文件系統(tǒng)。虛擬文件系統(tǒng)封裝物理設(shè)備和邏輯文件系統(tǒng)的細(xì)節(jié),并且允許用戶進程使用統(tǒng)一的接口訪問文件。

          除了傳統(tǒng)的文件系統(tǒng)目標(biāo),VFS也負(fù)責(zé)裝載新的可執(zhí)行文件。這個任務(wù)由邏輯文件系統(tǒng)模塊完成,使得Linux可以支持多種可執(zhí)行文件。

          (2)模塊

          虛擬文件系統(tǒng)模塊

          設(shè)備驅(qū)動模塊(device driver module)

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

          邏輯文件系統(tǒng)(logical file system):針對每種支持的文件系統(tǒng)

          系統(tǒng)獨立接口(system independent

          interface)提供硬件資源和邏輯文件系統(tǒng)都無關(guān)的接口,這個模塊通過塊設(shè)備節(jié)點或者字符設(shè)備節(jié)點提供所有的資源。

          系統(tǒng)調(diào)用模塊(system call interface)提供用戶進程對文件系統(tǒng)的統(tǒng)一控制訪問。虛擬文件系統(tǒng)為用戶進程屏蔽了所有特殊的特性。

          (3)數(shù)據(jù)表示

          所有文件使用i-nodes表示。每個inode都記錄一個文件在硬件設(shè)備上的位置信息。不僅如此,inode還存放著指向邏輯文件系統(tǒng)模塊和設(shè)備驅(qū)動的的函數(shù)指針,這些指針能夠執(zhí)行具體的讀寫操作。通過按照這種形式(就是面向?qū)ο笾械奶摵瘮?shù)的思想)存放函數(shù)指針,具體的邏輯文件系統(tǒng)和設(shè)備驅(qū)動可以向內(nèi)核注冊自己而不需要內(nèi)核依賴具體的模塊特性。

          (4)依賴關(guān)系、數(shù)據(jù)流和控制流

          一個特殊的設(shè)備驅(qū)動是ramdisk,這個設(shè)備在主存中開辟一片區(qū)域,并把它當(dāng)成持久性存儲設(shè)備使用。這個設(shè)備驅(qū)動使用內(nèi)存管理模塊完成任務(wù),所以在VFS與對內(nèi)存管理模塊存在依賴關(guān)系(圖中的依賴關(guān)系反了,應(yīng)該是VFS依賴于內(nèi)存管理模塊)、數(shù)據(jù)流和控制流。

          邏輯文件系統(tǒng)支持網(wǎng)絡(luò)文件系統(tǒng)。這個文件系統(tǒng)像訪問本地文件一樣,從另一臺機器上訪問文件。為了實現(xiàn)這個功能,一種邏輯文件系統(tǒng)通過網(wǎng)絡(luò)子系統(tǒng)完成它的任務(wù)——這引入了VFS對網(wǎng)絡(luò)子系統(tǒng)的一個依賴關(guān)系以及它們之間的控制流和數(shù)據(jù)流。

          正如前面提到的,內(nèi)存管理器使用VFS完成內(nèi)存swap功能和內(nèi)存映射I/O。另外,當(dāng)VFS等待硬件請求完成時,VFS需要使用進程調(diào)度器阻塞進程;當(dāng)請求完成時,VFS需要通過進程調(diào)度器喚醒進程。最后,系統(tǒng)調(diào)用接口允許用戶進程調(diào)用來存取數(shù)據(jù)。不像前面的子系統(tǒng),VFS沒有提供給用戶注冊不明確調(diào)用的機制,所以沒有從VFS到用戶進程的控制流。

          4. Network Interface 架構(gòu)

          (1)目標(biāo)

          網(wǎng)絡(luò)子系統(tǒng)讓Linux系統(tǒng)能夠通過網(wǎng)絡(luò)與其他系統(tǒng)相連。這個子系統(tǒng)支持很多硬件設(shè)備,也支持很多網(wǎng)絡(luò)協(xié)議。網(wǎng)絡(luò)子系統(tǒng)將硬件和協(xié)議的實現(xiàn)細(xì)節(jié)都屏蔽掉,并抽象出簡單易用的接口供用戶進程和其他子系統(tǒng)使用——用戶進程和其余子系統(tǒng)不需要知道硬件設(shè)備和協(xié)議的細(xì)節(jié)。

          (2)模塊

          網(wǎng)絡(luò)協(xié)議層模塊圖

          網(wǎng)絡(luò)設(shè)備驅(qū)動模塊(network device drivers)

          設(shè)備獨立接口模塊(device independent interface

          module)提供所有硬件設(shè)備的一致訪問接口,使得高層子系統(tǒng)不需要知道硬件的細(xì)節(jié)信息。

          網(wǎng)絡(luò)協(xié)議模塊(network protocol modules)負(fù)責(zé)實現(xiàn)每一個網(wǎng)絡(luò)傳輸協(xié)議,例如:TCP,UDP,IP,HTTP,ARP等等~

          協(xié)議無關(guān)模塊(protocol independent interface)提供獨立于具體協(xié)議和具體硬件設(shè)備的一致性接口。這使得其余內(nèi)核子系統(tǒng)無需依賴特定的協(xié)議或者設(shè)備就能訪問網(wǎng)絡(luò)。

          系統(tǒng)調(diào)用接口模塊(system calls interface)規(guī)定了用戶進程可以訪問的網(wǎng)絡(luò)編程API

          (3)數(shù)據(jù)表示

          每個網(wǎng)絡(luò)對象都被表示為一個套接字(socket)。套接字與進程關(guān)聯(lián)的方法和i-nodes節(jié)點相同。通過兩個task_struct指向同一個套接字,套接字可以被多個進程共享。

          (4)數(shù)據(jù)流,控制流和依賴關(guān)系

          當(dāng)網(wǎng)絡(luò)子系統(tǒng)需要等待硬件請求完成時,它需要通過進程調(diào)度系統(tǒng)將進程阻塞和喚醒——這形成了網(wǎng)絡(luò)子系統(tǒng)和進程調(diào)度子系統(tǒng)之間的控制流和數(shù)據(jù)流。不僅如此,虛擬文件系統(tǒng)通過網(wǎng)絡(luò)子系統(tǒng)實現(xiàn)網(wǎng)絡(luò)文件系統(tǒng)(NFS)——這形成了VFS和網(wǎng)絡(luò)子系統(tǒng)指甲的數(shù)據(jù)流和控制流。

          七、結(jié)論

          1、Linux內(nèi)核是整個Linux系統(tǒng)中的一層。內(nèi)核從概念上由五個主要的子系統(tǒng)構(gòu)成:進程調(diào)度器模塊、內(nèi)存管理模塊、虛擬文件系統(tǒng)、網(wǎng)絡(luò)接口模塊和進程間通信模塊。這些模塊之間通過函數(shù)調(diào)用和共享數(shù)據(jù)結(jié)構(gòu)進行數(shù)據(jù)交互。、

          2、Linux內(nèi)核架構(gòu)促進了他的成功,這種架構(gòu)使得大量的志愿開發(fā)人員可以合適得分工合作,并且使得各個特定的模塊便于擴展。

          可擴展性一:Linux架構(gòu)通過一項數(shù)據(jù)抽象技術(shù)使得這些子系統(tǒng)成為可擴展的——每個具體的硬件設(shè)備驅(qū)動都實現(xiàn)為單獨的模塊,該模塊支持內(nèi)核提供的統(tǒng)一的接口。通過這種方式,個人開發(fā)者只需要和其他內(nèi)核開發(fā)者做最少的交互,就可以為Linux內(nèi)核添加新的設(shè)備驅(qū)動。

          可擴展性二:Linux內(nèi)核支持多種不同的體系結(jié)構(gòu)。在每個子系統(tǒng)中,都將體系結(jié)構(gòu)相關(guān)的代碼分割出來,形成單獨的模塊。通過這種方法,一些廠家在推出他們自己的芯片時,他們的內(nèi)核開發(fā)小組只需要重新實現(xiàn)內(nèi)核中機器相關(guān)的代碼,就可以講內(nèi)核移植到新的芯片上運行。

        【Linux概念架構(gòu)解讀】相關(guān)文章:

        linux系統(tǒng)集群的架構(gòu)與實現(xiàn)06-19

        Linux中的more命令解讀201603-28

        新概念英語解讀01-22

        Linux主機被入侵后的處理案例解讀12-27

        Linux文件查找工具find全解讀05-24

        Linux認(rèn)證系統(tǒng)管理:linux下搭建ftp03-08

        Linux 考試試題03-04

        Linux認(rèn)證考試科目06-03

        Linux文件權(quán)限詳解05-11

        Linux認(rèn)證賬戶映射01-23

        国产高潮无套免费视频_久久九九兔免费精品6_99精品热6080YY久久_国产91久久久久久无码

        1. <tt id="5hhch"><source id="5hhch"></source></tt>
          1. <xmp id="5hhch"></xmp>

        2. <xmp id="5hhch"><rt id="5hhch"></rt></xmp>

          <rp id="5hhch"></rp>
              <dfn id="5hhch"></dfn>