你們都曉得源理君好多期的文章都是關於Linux核心的功能,本著公眾號的原則,只講原理,將複雜的程式碼轉換為淺顯易懂的文字,圖片。最後呈現給你們。可以源理君始終沒有從大框架上系統的給諸位梳理Linux核心體系結構。那本文就一個目的,站在山頂往上看。
Linux系統的層次框架
#從圖中我們可以分成兩個層次:
使用者空間核心空間
在最下層是用戶空間,也就是運行應用程式。使用者空間的上層就是常常使用的gblic函式庫linux記憶體管理,它的作用就是封裝系統呼叫插口。不使用gblic函式庫,而大量的直接使用系統呼叫插口是十分不明智的選擇。使用者空間運作的進程,她們各自擁有獨立的虛擬位址空間,而核心則有單獨的位址空間。
上層就是核心空間了。 Linux核心空間又分為了三層:
系統呼叫層;它是屬於最下層,它提供了使用者空間和核心空間通訊的形式。 Linux核心:應當愈發準確的說是獨立於體系結構的核心程式碼,這種通用的程式碼適用於任何體系結構。依賴體系結構的程式碼:這份我們一般稱為BSP,這種程式碼主要是為了相容不同平台或則處理器而引進的。
Linux核心實作了很多重要的體系結構屬性。在或高或低的層次上,內核被界定為多個子系統。 Linux也可以看作是一個整體,由於它會將所有那些基本服務整合到核心中。這與微核心的體系結構不同,前者會提供一些基本的服務,例如通訊、I/O、記憶體和行程管理,更具體的服務都是插入到微核心層中的。每種核心都有自己的優點linux命令列,不過這兒並不對此進行討論。
隨著時間的流逝,Linux核心在顯存和CPU使用方面具有較高的效率,而且十分穩定。並且對於Linux來說,最有趣的是在這些大小和複雜性的前提下,仍然具有良好的可移植性。 Linux編譯後可在大量處理器和具有不同體系結構約束和需求的平台上運作。一個反例是Linux可以在一個具有顯存管理單元(MMU)的處理器上運行,也可以在這些不提供MMU的處理器上運行。 Linux核心的uClinux移植提供了對非MMU的支援。
Linux核心體系結構
##Linux核心的主要元件有:
系統呼叫插口程序管理記憶體管理虛擬檔案系統網路堆疊裝置驅動程式、硬體架構的相關程式碼。
(1)系統呼叫插口
系統呼叫層提供了個別機制執行從使用者空間到核心的函數呼叫。它是依賴真個體系結構的。在這一層提供多路復用和多路分解服務。
(2)進程管理
#進程管理的核心就是行程的調度。在Linux核心中,進程調度的單元是進程,執行緒對與調度來說相當於進程概念。核心透過系統呼叫提供了應用程式編程插口。諸如:創建新進程(fork,exec),結束進程(kill,exit),而且提供了控制進程linux核心移植步驟,同步進程和進程間通訊的插口。
進程管理還包括處理活躍進程之間共享CPU的需求。核心使用的是CFS完全公正調度器,在我之前文章《Linux完全公正調度器CFS》有詳盡闡釋。
(3)顯存管理
核心所管理的另一個重要資源是顯存。源理君的另一篇文章《搞懂Linux顯存管理,僅此一篇》有詳盡說明Linux顯存管理。為了提升效率,引入了虛擬顯存的概念,顯存是根據所謂的顯存頁形式進行管理的(通常一個顯存頁大小4KB和8KB,絕大部份為4KB)。 Linux除了管理可用顯存的方法,以及數學和虛擬映射所使用的硬體機制。不過顯存管理要管理的可不只4KB緩衝區。 Linux提供了對4KB緩衝區的具象,例如slab分配器。這些顯存管理模式使用4KB緩衝區為基數,之後從中分配結構,並追蹤顯存頁使用情況,例如什麼顯存頁是滿的,什麼頁面沒有完全使用,什麼頁為空。這樣就容許該模式依據系統須要來動態調整顯存使用。為了支援多個使用者使用顯存,有時會出現可用顯存被消耗光的情況。因為這個緣由,頁面可以移出顯存並放入c盤中。這個過程稱為交換,由於頁面會被從顯存交換到硬盤。顯示記憶體管理的原始程式碼可以在./linux/mm中找到。
(4)虛擬檔案系統
虛擬檔案系統(VFS)是Linux核心中十分有用的一個面向,由於它為檔案系統提供了一個通用的插口具象。 VFS在系統呼叫和核心所支援的檔案系統之間提供了一個屏蔽層。如右圖所示:
#在VFS裡面,是對諸如open、close、read和write之類的函數的一個通用API具象。在VFS下邊是檔案系統具象,它定義了下層函數的實作方法。它們是給定檔案系統(超過50個)的插件。檔案系統的源代碼可以在./linux/fs中找到。檔案系統層之下是緩衝區緩存,它為檔案系統層提供了一個通用函數集(與特定檔案系統無關)。這個快取層透過將資料保留一段時間(或則隨後預先讀取資料便於在須要是就可用)優化了對化學設備的存取。緩衝區快取之下是設備驅動程序,它實現了特定化學設備的插口。
(5)網路合約堆疊
網路合約堆疊在設計上依循模擬合約本身的分層體系結構。回想一下linux核心移植步驟,InternetProtocol(IP)是傳輸合約(一般稱為傳輸控制合約或TCP)下邊的核心網路層合約。 TCP裡面是socket層,它是透過系統呼叫層來呼叫的。 socket層是網路子系統的標準API,它為各類網路合約提供了一個使用者插口。從原始幀存取到IP合約資料單元(PDU),再到TCP和UserDatagramProtocol(UDP),socket層提供了一種標準化的方式來管理聯接,並在各個終點之間聯通資料。核心中網路原始碼可以在./linux/net中找到。
(6)裝置驅動程式
Linux核心中有大量程式碼都在裝置驅動程式中,它們就能運作特定的硬體裝置。 Linux原始碼樹提供了一個驅動程式子目錄,這個目錄又進一步界定為各類支援設備,例如Bluetooth、I2C、serial等。裝置驅動程式的程式碼可以在./linux/drivers中找到。
(7)依賴體系結構的程式碼
雖然Linux很大程度上獨立於所運作的體系結構,有些元素則必須考慮體系結構能夠正常運作並實現更高效率。 ./linux/arch子目錄定義了核心原始碼中依賴體系結構的部份,其中包含了各類別特定於體系結構的子目錄(共同組成了BSP)。對於一個典型的桌上型系統來說,使用的是x86目錄。每個體系結構子目錄都包含了很多其他子目錄,每個子目錄都專注於核心中的一個特定方面,例如引導、核心、記憶體管理等。這種依賴體系結構的程式碼可以在./linux/arch中找到。
Linux還是動態內核,支援動態新增或刪掉軟體元件。被稱為動態可載入核心模組,它們可以在引導時按照須要(當前特定設備須要這個模組)或在任何時侯由使用者插入。
參考
源理君參考了這篇文章
以上是透視Linux內核層級:從山頂遠眺的詳細內容。更多資訊請關注PHP中文網其他相關文章!