1. 程式人生 > 實用技巧 >Linux系統結構

Linux系統結構

Linux系統一般有4個主要部分:核心、shell、檔案系統和應用程式。核心、shell和檔案系統一起形成了基本的作業系統結構,它們使得使用者可以執行程式、管理檔案並使用系統。

在這裡插入圖片描述

一、linux核心

Linux核心由如下幾部分組成:記憶體管理、程序管理、裝置驅動程式、檔案系統和網路管理等,如下圖所示:
在這裡插入圖片描述

1.1 記憶體管理

對任何一臺計算機而言,其記憶體以及其他資源都是有限的。為了讓有限的實體記憶體滿足應用程式對記憶體的大需求量,Linux採用了稱為“虛擬記憶體”的記憶體管理方式。Linux將記憶體劃分為容易處理的“記憶體頁”(對於大部分體系結構來說都是4KB)。Linux包括了管理可用記憶體的方式,以及物理和虛擬機器對映所使用的硬體機制。

不過記憶體管理要管理的可不止4KB緩衝區。Linux提供了對4KB緩衝區的抽象,例如slab 分配器。這種記憶體管理模式使用 4KB 緩衝區為基數,然後從中分配結構,並跟蹤記憶體頁使用情況,比如哪些記憶體頁是滿的,哪些頁面沒有完全使用,哪些頁面為空。這樣就允許該模式根據系統需要來動態調整記憶體使用。

為了支援多個使用者使用記憶體,有時會出現可用記憶體被消耗光的情況。由於這個原因,頁面可以移出記憶體並放入磁碟中。這個過程稱為交換,因為頁面會被從記憶體交換到硬碟上。記憶體管理的原始碼可以在 ./linux/mm 中找到。

1.2 程序管理

通過多工機制,每個程序可認為只有自己獨佔計算機,從而簡化程式的編寫。每個程序有自己單獨的地址空間,並且只能由這一程序訪問,這樣作業系統避免了程序之間的互相干擾以及”壞程式“對系統可能造成的危害。

核心通過SCI提供了一個應用程式程式設計介面(API)來建立一個程序(fork、exec或Portable Operating System Interface [POSIX]函式),停止程序(kill、exit),並在它們之間進行通訊和同步(signal或者POSIX機制)

1.3 檔案系統

和DOS等作業系統不同,Linux作業系統中單獨的檔案系統並不是由驅動器號或驅動器名稱(如A:或C:等)來標識的。相反,和UNIX作業系統一樣,Linux作業系統將獨立的檔案系統組合成了一個層次化的樹形結構,並且由一個單獨的實體代表這一檔案系統。Linux將新的檔案系統通過一個稱為”掛裝“或”掛上“的操作將其掛裝到某個目錄上,從而讓不同的檔案系統結合成為一個整體。Linux作業系統的一個重要特點是它支援許多不同型別的檔案系統。Linux中最普遍使用的檔案系統是Ext2,它也是Linux土生土長的檔案系統。但Linux也能夠支援FAT、VFAT、FAT32,MINIX等不同型別的檔案系統,從而可以方便地和其他作業系統交換資料。由於Linux支援許多不同的檔案系統,並且將它們組織成了一個統一的虛擬檔案系統。

1.3.1 虛擬檔案系統(virtual file system,VFS)

隱藏了各種硬體的具體細節,把檔案系統操作和不同檔案系統的具體實現細節分離了開來,為所有的裝置提供了統一的介面,VFS提供了多達數十種不同的檔案系統。虛擬檔案系統可以分為虛擬邏輯檔案系統和裝置驅動程式。邏輯檔案系統指Linux所支援的檔案系統,如ext2,fat等,裝置驅動程式指為每一種硬體控制器所編寫的裝置驅動程式模組。

虛擬檔案系統(VFS)是Linux核心中非常有用的一個方面,因為它為檔案系統提供了一個通用的介面抽象。VFS在SCI和核心所支援的檔案系統之間提供了一個交換層。即VFS在使用者和檔案系統之間提供了一個叫換層:
在這裡插入圖片描述
在VFS上面,是對諸如open、close、read和write之類的函式的一個通用API抽象。在VFS下面是檔案系統抽象,它定義了上層函式的實現方式。它們是給定檔案系統的外掛。檔案系統的原始碼可以在./linux/fs 中找到。

檔案系統層下面是緩衝區快取,它為檔案系統層提供了一個通用函式集(與具體檔案系統無關)。這個快取層通過將資料保留一段時間(或者隨機預先讀取資料以便在需要時就可用)優化了對物理裝置的訪問。緩衝區快取之下是裝置驅動程式,它實現了特定物理裝置的介面。

因此,使用者和程序不需要知道檔案所在的檔案系統型別,而只需要像使用ext2檔案系統中的檔案一樣使用它們。

1.4 裝置驅動程式

裝置驅動程式是Linux核心的主要部分。和作業系統的其他部分類似,裝置驅動程式執行在高特權級的處理器環境中,從而可以直接對硬體進行操作,但正因為如此,任何一個裝置驅動程式的錯誤都可能導致作業系統的崩潰。裝置驅動程式實際控制作業系統和硬體裝置之間的互動。

裝置驅動程式提供一組作業系統可理解的抽象介面,完成和作業系統之間的互動,而與硬體相關的具體操作細節由裝置驅動程式完成。一般而言,裝置驅動程式和裝置的控制晶片有關,例如,如果計算機硬碟是SCSI硬碟,則需要使用SCSI驅動程式,而不是IDE驅動程式。

1.5 網路介面(NET)

提供了對各種網路標準的存取和各種網路硬體的支援。網路介面可分為網路協議和網路驅動程式。網路協議部分負責實現每一種可能的網路傳輸協議。眾所周知,TCP/IP 協議是 Internet 的標準協議,同時也是事實上的工業標準。

Linux 的網路實現支援 BSD 套接字,支援全部的TCP/IP協議。Linux核心的網路部分由BSD套接字、網路協議層和網路裝置驅動程式組成。網路裝置驅動程式負責與硬體裝置通訊,每一種可能的硬體裝置都有相應的裝置驅動程式。

二、Linux Shell

shell是系統的使用者介面,提供了使用者與核心進行互動操作的一種介面。它接收使用者輸入的命令並把它送入核心去執行,是一個命令直譯器。另外,shell程式語言具有普通程式語言的很多特點,用這種程式語言編寫的shell程式與其他應用程式具有同樣的效果。

目前主要有下列版本的shell:

  1. Bourne Shell:是貝爾實驗室開發的
  2. BASH:是GNU的Bourne Again Shell,是GNU作業系統上預設的shell,大部分的Linux發行套件使用的都是這種shell
  3. Korn Shell:是對Bourne Shell的發展,在大部分內容上與Bourne Shell相容
  4. C Shell:是SUN公司的Shell的BSD版本

三、Linux檔案系統

檔案系統是檔案存放在磁碟等儲存裝置上的組織方法。Linux系統能支援多種目前流行的檔案系統,如EXT2、EXT3、FAT、FAT32、VFAT和ISO9660

3.1 檔案型別

Linux下面的檔案型別主要有:

  1. 普通檔案:C語言元程式碼、Shell指令碼、二進位制的可執行檔案等。分為純文字和二進位制
  2. 目錄檔案:目錄,儲存檔案的唯一地方
  3. 連結檔案:指向同一個檔案或目錄的檔案
  4. 裝置檔案:與裝置外設相關的,通常在/dev下面。分為塊裝置和字元裝置
  5. 管道(FIFO)檔案:提供程序之間通訊的一種方式
  6. 套接字(socket)檔案:該檔案型別與網路通訊有關

可以通過ls –l, file, stat幾個命令來檢視檔案的型別等相關資訊。

3.2 Linux目錄

檔案結構是檔案存放在磁碟等存貯裝置上的組織方法。主要體現在對檔案和目錄的組織上。

目錄提供了管理檔案的一個方便而有效的途徑。

Linux使用標準的目錄結構,在安裝的時候,安裝程式就已經為使用者建立了檔案系統和完整而固定的目錄組成形式,並制定了每個目錄的作用和其中的檔案型別。

完整的目錄樹可劃分為小的部分,這些小部分又可以單獨存放在自己的磁碟或分割槽上。這樣,相對穩定的部分和經常變化的部分可單獨存放在不同的分割槽中,從而方便備份或系統管理。目錄樹的主要部分有root、/usr、/var、/home 等。這樣的佈局可方便在 Linux 計算機之間共享檔案系統的某些部分。
在這裡插入圖片描述
Linux採用的是樹型結構。最上層是根目錄,其他的所有目錄都是從根目錄出發而生成的。

微軟的DOS和windows也是採用樹型結構,但是在DOS和windows中這樣的樹型結構的根是磁碟分割槽的碟符,有幾個分割槽就有幾個樹型結構,他們之間的關係是並列的。最頂部的是不同的磁碟(分割槽),如:C,D,E,F等。

但是在linux中,無論作業系統管理幾個磁碟分割槽,這樣的目錄樹只有一個。從結構上講,各個磁碟分割槽上的樹型目錄不一定是並列的。

https://www.linuxprobe.com/linux-system-structure.html

四、從Linux角度看使用者態和核心態的區別

再看下上面這個圖:
在這裡插入圖片描述
系統呼叫將Linux整個體系分為使用者態和核心態(或者說核心空間和使用者空間)。

  • 核心態本質上就是核心,它擁有較高的特權,能執行一切指令,訪問所有暫存器和儲存區,傳統的OS都在系統態執行。
  • 使用者態就是提供應用程式執行的空間,又稱為目態,它是具有較低特權的執行狀態,僅能執行規定的指令,訪問指定的暫存器和儲存區。一般情況下,應用程式只能在使用者態進行,不能去執行OS指令及訪問OS區域,這樣可以防止應用程式對OS的破壞

再看如下的圖:
在這裡插入圖片描述

可以看出,應用程式通過庫函式和shell來進行系統呼叫。

4.1 系統呼叫

系統呼叫介面(System Call Interface):SCI提供了某些機制,執行從使用者空間到核心的函式呼叫。這個介面依賴於體系結構,甚至在相同的處理器家族內也是如此。SCI實際上是一個非常有用的函式呼叫多路複用和多路分解服務。在./linux/kernel中我們可以找到SCI的實現,並在./linux/arch中找到依賴於體系結構的部分。

系統呼叫是作業系統的最小功能單位。根據不同的應用場景,不同的Linux發行版本提供的系統呼叫數量也不盡相同,大致在240-350之間。這些系統呼叫組成了使用者態跟核心態互動的基本介面,例如:使用者態想要申請一塊20K大小的動態記憶體,就需要brk系統呼叫,將資料段指標向下偏移。

4.2 庫函式

庫函式就是遮蔽這些複雜的底層實現細節,減輕程式設計師的負擔,從而更加關注上層的邏輯實現。它對系統呼叫進行封裝,提供簡單的基本介面給使用者,這樣增強了程式的靈活性,當然對於簡單的介面,也可以直接使用系統呼叫訪問資源,例如:open(),write(),read()等等。庫函式根據不同的標準也有不同的版本,例如:glibc庫,posix庫等。

4.3 使用者態到核心態

從使用者態到核心態切換可以通過三種方式:

  1. 系統呼叫:其實系統呼叫本身是中斷,但是是軟中斷,和硬中斷不同
  2. 異常:如果當前程序執行在使用者態,如果這個時候發生了異常事件,就會觸發切換。例如:缺頁異常
  3. 外設中斷:當外設完成使用者的請求時,會向CPU傳送中斷訊號