大家都知道源理君很多期的文章都是關于linux內核的功能,本著公眾號的原則,只講原理,將復雜的代碼轉換為通俗易懂的文字,圖片。最后呈現給大家。可以源理君一直沒有從大框架上系統的給各位梳理Linux內核體系結構。那本文就一個目的,站在山頂向下看。
Linux系統的層次框架
從圖中我們可以分為兩個層次:
- 用戶空間
- 內核空間
在最上層是用戶空間,也就是運行應用程序。用戶空間的下層就是經常使用的gblic庫,它的作用就是封裝系統調用接口。不使用gblic庫,而大量的直接使用系統調用接口是非常不明智的選擇。用戶空間運行的進程,他們各自擁有獨立的虛擬地址空間,而內核則有單獨的地址空間。
下層就是內核空間了。Linux內核空間又分為了三層:
- 系統調用層;它是屬于最上層,它提供了用戶空間和內核空間通信的方式。
- Linux內核:應該更加確切的說是獨立于體系結構的內核代碼,這些通用的代碼適用于任何體系結構。
- 依賴體系結構的代碼:這部分我們通常稱之為BSP,這些代碼主要是為了兼容不同平臺或者處理器而引入的。
Linux 內核實現了很多重要的體系結構屬性。在或高或低的層次上,內核被劃分為多個子系統。Linux 也可以看作是一個整體,因為它會將所有這些基本服務都集成到內核中。這與微內核的體系結構不同,后者會提供一些基本的服務,例如通信、I/O、內存和進程管理,更具體的服務都是插入到微內核層中的。每種內核都有自己的優點,不過這里并不對此進行討論。
隨著時間的流逝,Linux 內核在內存和 CPU 使用方面具有較高的效率,并且非常穩定。但是對于 Linux 來說,最為有趣的是在這種大小和復雜性的前提下,依然具有良好的可移植性。Linux 編譯后可在大量處理器和具有不同體系結構約束和需求的平臺上運行。一個例子是 Linux 可以在一個具有內存管理單元(MMU)的處理器上運行,也可以在那些不提供 MMU 的處理器上運行。Linux 內核的 uClinux 移植提供了對非 MMU 的支持。
Linux內核體系結構
Linux內核的主要組件有:
- 系統調用接口
- 進程管理
- 內存管理
- 虛擬文件系統
- 網絡堆棧
- 設備驅動程序、硬件架構的相關代碼。
(1)系統調用接口
系統調用層提供了某些機制執行從用戶空間到內核的函數調用。它是依賴真個體系結構的。在這一層提供多路復用和多路分解服務。
(2)進程管理
進程管理的核心就是進程的調度。在Linux內核中,進程調度的單元是進程,線程對與調度來說相當于進程概念。內核通過系統調用提供了應用程序編程接口。例如:創建新進程(fork,exec),結束進程(kill, exit),并且提供了控制進程,同步進程和進程間通信的接口。
進程管理還包括處理活躍進程之間共享CPU的需求。內核使用的是CFS完全公平調度器,在我之前文章《Linux完全公平調度器CFS》有詳細闡述。
(3)內存管理
內核所管理的另外一個重要資源是內存。源理君的另一篇文章《搞懂Linux內存管理,僅此一篇》有詳細講解Linux內存管理。為了提高效率,引入了虛擬內存的概念,內存是按照所謂的內存頁 方式進行管理的(一般一個內存頁大小 4KB和8KB,絕大部分為4KB)。Linux 不僅管理可用內存的方式,以及物理和虛擬映射所使用的硬件機制。不過內存管理要管理的可不止 4KB 緩沖區。Linux 提供了對 4KB 緩沖區的抽象,例如 slab 分配器。這種內存管理模式使用 4KB 緩沖區為基數,然后從中分配結構,并跟蹤內存頁使用情況,比如哪些內存頁是滿的,哪些頁面沒有完全使用,哪些頁面為空。這樣就允許該模式根據系統需要來動態調整內存使用。為了支持多個用戶使用內存,有時會出現可用內存被消耗光的情況。由于這個原因,頁面可以移出內存并放入磁盤中。這個過程稱為交換,因為頁面會被從內存交換到硬盤上。內存管理的源代碼可以在 ./linux/mm 中找到。
(4)虛擬文件系統
虛擬文件系統(VFS)是 Linux 內核中非常有用的一個方面,因為它為文件系統提供了一個通用的接口抽象。VFS 在 系統調用 和內核所支持的文件系統之間提供了一個屏蔽層。如下圖所示:
在 VFS 上面,是對比如open、close、read 和 write 之類的函數的一個通用 API 抽象。在 VFS 下面是文件系統抽象,它定義了上層函數的實現方式。它們是給定文件系統(超過 50 個)的插件。文件系統的源代碼可以在 ./linux/fs 中找到。文件系統層之下是緩沖區緩存,它為文件系統層提供了一個通用函數集(與具體文件系統無關)。這個緩存層通過將數據保留一段時間(或者隨即預先讀取數據以便在需要是就可用)優化了對物理設備的訪問。緩沖區緩存之下是設備驅動程序,它實現了特定物理設備的接口。
(5)網絡協議棧
網絡協議棧在設計上遵循模擬協議本身的分層體系結構。回想一下,Internet Protocol (IP) 是傳輸協議(通常稱為傳輸控制協議或 TCP)下面的核心網絡層協議。TCP 上面是 socket 層,它是通過系統調用層進行調用的。socket 層是網絡子系統的標準 API,它為各種網絡協議提供了一個用戶接口。從原始幀訪問到 IP 協議數據單元(PDU),再到 TCP 和 User Datagram Protocol (UDP),socket 層提供了一種標準化的方法來管理連接,并在各個終點之間移動數據。內核中網絡源代碼可以在 ./linux/net 中找到。
(6)設備驅動程序
Linux 內核中有大量代碼都在設備驅動程序中,它們能夠運轉特定的硬件設備。Linux 源碼樹提供了一個驅動程序子目錄,這個目錄又進一步劃分為各種支持設備,例如 Bluetooth、I2C、serial 等。設備驅動程序的代碼可以在 ./linux/drivers 中找到。
(7)依賴體系結構的代碼
盡管 Linux 很大程度上獨立于所運行的體系結構,但是有些元素則必須考慮體系結構才能正常操作并實現更高效率。./linux/arch 子目錄定義了內核源代碼中依賴于體系結構的部分,其中包含了各種特定于體系結構的子目錄(共同組成了 BSP)。對于一個典型的桌面系統來說,使用的是 x86 目錄。每個體系結構子目錄都包含了很多其他子目錄,每個子目錄都關注內核中的一個特定方面,例如引導、內核、內存管理等。這些依賴體系結構的代碼可以在 ./linux/arch 中找到。
Linux 還是一個動態內核,支持動態添加或刪除軟件組件。被稱為動態可加載內核模塊,它們可以在引導時根據需要(當前特定設備需要這個模塊)或在任何時候由用戶插入。
參考
源理君參考了這篇文章 https://blog.csdn.net/zhoudaxia/article/details/7172192