日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產(chǎn)品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Linux概念架構的理解

摘要

創(chuàng)新互聯(lián)公司專注于企業(yè)成都全網(wǎng)營銷、網(wǎng)站重做改版、南岸網(wǎng)站定制設計、自適應品牌網(wǎng)站建設、html5商城建設、集團公司官網(wǎng)建設、外貿(mào)網(wǎng)站建設、高端網(wǎng)站制作、響應式網(wǎng)頁設計等建站業(yè)務,價格優(yōu)惠性價比高,為南岸等各大城市提供網(wǎng)站開發(fā)制作服務。

Linux kernel 成功的兩個原因:

  1. 架構設計支持大量的志愿開發(fā)者加入到開發(fā)過程中;

  2. 每個子系統(tǒng),尤其是那些需要改進的,都支持很好的擴展性。

正是這兩個原因使得 Linux kernel 可以不斷進化。

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

Fig 1 – 計算機系統(tǒng)分層結構

分層結構的原則:

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),反之則不行。

二、內核的作用

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

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

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

三、Linux內核的整體架構


Linux內核的整體架構

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

上圖中的每一個依賴箭頭都有原因:

  • 進程調度器依賴內存管理器(Memory manager):進程恢復執(zhí)行時,需要依靠內存管理器分配供它運行的內存。

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

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

  • VFS 依賴于內存管理器:支持 ramdisk 設備

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

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

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

  2. 硬件設備驅動(hardware device drivers)、文件系統(tǒng)模塊(logical filesystem modules)、網(wǎng)絡設備驅動(network device drivers)和網(wǎng)絡協(xié)議模塊(network protocol modules)這四個模塊的可擴展性***。

五、系統(tǒng)中的數(shù)據(jù)結構

  1. 任務列表(Task List)
    進程調度器針對每個進程維護一個數(shù)據(jù)結構 task_struct;所有的進程用鏈表管理,形成 task list;進程調度器還維護一個 current 指針指向當前正在占用 CPU 的進程。

  2. 內存映射(Memory Map)
    內存管理器存儲每個進程的虛擬地址到物理地址的映射;并且也提供了如何換出特定的頁,或者是如何進行缺頁處理。這些信息存放在數(shù)據(jù)結構 mm_struct 中。每個進程都有一個 mm_struct 結構,在進程的 task_struct 結構中有一個指針 mm 指向次進程的 mm_struct 結構。
    在 mm_struct 中有一個指針 pgd,指向該進程的頁目錄表(即存放頁目錄首地址)——>當該進程被調度時,此指針被換成物理地址,寫入控制寄存器 CR3(x86體系結構下的頁基址寄存器)

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

  4. 數(shù)據(jù)連接(Data Connection)
    內核中所有的數(shù)據(jù)結構的根都在進程調度器維護的任務列表鏈表中。系統(tǒng)中每個進程的的數(shù)據(jù)結構 task_struct 中有一個指針 mm 指向它的內存映射信息;也有一個指針 files 指向它打開的文件(用戶打開文件表);還有一個指針指向該進程打開的網(wǎng)絡套接字。

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

1.進程調度器(Process Scheduler)架構

(1)目標

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

(2)模塊

進程調度器

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

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

  • 體系結構無關模塊(architecture-independent module)與調度策略模塊交互將決定下一個執(zhí)行的進程,然后調用體系結構相關的代碼去恢復那個進程的執(zhí)行。不僅如此,這個模塊還會調用內存管理器的 接口來確保被阻塞的進程的內存映射信息被正確得保存起來。

  • 系統(tǒng)調用接口模塊(system call interface)允許用戶進程訪問 Linux Kernel 明確暴露給用戶進程的資源。通過一組定義合適的基本上不變的接口(POSIX 標準),將用戶應用程序和 Linux 內核解耦,使得用戶進程不會受到內核變化的影響。

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

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

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

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

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

2.內存管理器(Memory Manager)架構

(1)目標

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

(2)模塊

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

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

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

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

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

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

***,內存管理模塊還應該存放訪問和技術信息,以保證系統(tǒng)的安全。

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

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

3.虛擬文件系統(tǒng)(Virtual File System)架構

(1)目標

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

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

(2)模塊

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

  • 設備驅動模塊(device driver module)

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

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

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

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

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

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

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

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

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

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

4.網(wǎng)絡接口(Network Interface)架構

(1)目標

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

(2)模塊


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

  • 網(wǎng)絡設備驅動模塊(network device drivers)

  • 設備獨立接口模塊(device independent interface module)提供所有硬件設備的一致訪問接口,使得高層子系統(tǒng)不需要知道硬件的細節(jié)信息。

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

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

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

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

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

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

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

七、結論

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

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

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

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

參考文章:

  1. http://oss.org.cn/ossdocs/linux/kernel/a1/index.html

  2. http://www.cs.cmu.edu/afs/cs/project/able/www/paper_abstracts/intro_softarch.html

  3. http://www.cs.cmu.edu/afs/cs/project/able/www/paper_abstracts/intro_softarch.html

  4. http://www.fceia.unr.edu.ar/ingsoft/monroe00.pdf

  5. 內核源碼:http://lxr.oss.org.cn/


本文名稱:Linux概念架構的理解
標題來源:http://www.dlmjj.cn/article/dpjepii.html