天天看點

linux之核心剖析

Linux 核心簡介

現在讓我們從一個比較高的高度來審視一下 GNU/Linux 作業系統的體系結構。您可以從兩個層次上來考慮作業系統,如圖 2 所示。

圖 2. GNU/Linux 作業系統的基本體系結構
linux之核心剖析

上面是使用者(或應用程式)空間。這是使用者應用程式執行的地方。使用者空間之下是核心空間,Linux 核心正是位于這裡。

GNU C Library (glibc)也在這裡。它提供了連接配接核心的系統調用接口,還提供了在使用者空間應用程式和核心之間進行轉換的機制。這點非常重要,因為核心和使用者空間的應用程式使用的是不同的保護位址空間。每個使用者空間的程序都使用自己的虛拟位址空間,而核心則占用單獨的位址空間。 更多資訊,請參看參考資料 一節中的連結。

Linux 核心可以進一步劃分成 3 層。最上面是系統調用接口,它實作了一些基本的功能,例如

read

write

。系統調用接口之下是核心代碼,可以更精确地定義為獨立于體系結構的核心代碼。這些代碼是 Linux 所支援的所有處理器體系結構所通用的。在這些代碼之下是依賴于體系結構的代碼,構成了通常稱為 BSP(Board Support Package)的部分。這些代碼用作給定體系結構的處理器和特定于平台的代碼。

Linux 核心的屬性

在讨論大型而複雜的系統的體系結構時,可以從很多角度來審視系統。體系結構分析的一個目标是提供一種方法更好地了解源代碼,這正是本文的目的。

Linux 核心實作了很多重要的體系結構屬性。在或高或低的層次上,核心被劃分為多個子系統。Linux 也可以看作是一個整體,因為它會将所有這些基本服務都內建到核心中。這與微核心的體系結構不同,後者會提供一些基本的服務,例如通信、I/O、記憶體和程序管理,更具體的服務都是插入到微核心層中的。每種核心都有自己的優點,不過這裡并不對此進行讨論。

随着時間的流逝,Linux 核心在記憶體和 CPU 使用方面具有較高的效率,并且非常穩定。但是對于 Linux 來說,最為有趣的是在這種大小和複雜性的前提下,依然具有良好的可移植性。Linux 編譯後可在大量處理器和具有不同體系結構限制和需求的平台上運作。一個例子是 Linux 可以在一個具有記憶體管理單元(MMU)的處理器上運作,也可以在那些不提供 MMU 的處理器上運作。Linux 核心的 uClinux 移植提供了對非 MMU 的支援。更詳細資訊請參看參考資料 一節的内容。

Linux 核心的主要子系統

現在使用圖 3 中的分類說明 Linux 核心的主要元件。

linux之核心剖析

系統調用接口

SCI 層提供了某些機制執行從使用者空間到核心的函數調用。正如前面讨論的一樣,這個接口依賴于體系結構,甚至在相同的處理器家族内也是如此。SCI 實際上是一個非常有用的函數調用多路複用和多路分解服務。在 ./linux/kernel 中您可以找到 SCI 的實作,并在 ./linux/arch 中找到依賴于體系結構的部分。有關這個元件的更詳細資訊可以在參考資料 一節中找到。

程序管理

程序管理的重點是程序的執行。在核心中,這些程序稱為線程,代表了單獨的處理器虛拟化(線程代碼、資料、堆棧和 CPU 寄存器)。在使用者空間,通常使用程序 這個術語,不過 Linux 實作并沒有區分這兩個概念(程序和線程)。核心通過 SCI 提供了一個應用程式程式設計接口(API)來建立一個新程序(fork、exec 或 Portable Operating System Interface [POSIX] 函數),停止程序(kill、exit),并在它們之間進行通信和同步(signal 或者 POSIX 機制)。

程序管理還包括處理活動程序之間共享 CPU 的需求。核心實作了一種新型的排程算法,不管有多少個線程在競争 CPU,這種算法都可以在固定時間内進行操作。這種算法就稱為 O(1) 排程程式,這個名字就表示它排程多個線程所使用的時間和排程一個線程所使用的時間是相同的。 O(1) 排程程式也可以支援多處理器(稱為對稱多處理器或 SMP)。您可以在 ./linux/kernel 中找到程序管理的源代碼,在 ./linux/arch 中可以找到依賴于體系結構的源代碼。在參考資料 一節中可以了解有關這個算法的更多内容。

記憶體管理

核心所管理的另外一個重要資源是記憶體。為了提高效率,如果由硬體管理虛拟記憶體,記憶體是按照所謂的記憶體頁 方式進行管理的(對于大部分體系結構來說都是 4KB)。Linux 包括了管理可用記憶體的方式,以及實體和虛拟映射所使用的硬體機制。

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

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

虛拟檔案系統

虛拟檔案系統(VFS)是 Linux 核心中非常有用的一個方面,因為它為檔案系統提供了一個通用的接口抽象。VFS 在 SCI 和核心所支援的檔案系統之間提供了一個交換層(請參看圖 4)。

圖 4. VFS 在使用者和檔案系統之間提供了一個交換層
linux之核心剖析

在 VFS 上面,是對諸如 open、close、read 和 write 之類的函數的一個通用 API 抽象。在 VFS 下面是檔案系統抽象,它定義了上層函數的實作方式。它們是給定檔案系統(超過 50 個)的插件。檔案系統的源代碼可以在 ./linux/fs 中找到。

檔案系統層之下是緩沖區緩存,它為檔案系統層提供了一個通用函數集(與具體檔案系統無關)。這個緩存層通過将資料保留一段時間(或者随即預先讀取資料以便在需要是就可用)優化了對實體裝置的通路。緩沖區緩存之下是裝置驅動程式,它實作了特定實體裝置的接口。

網絡堆棧

網絡堆棧在設計上遵循模拟協定本身的分層體系結構。回想一下,Internet Protocol (IP) 是傳輸協定(通常稱為傳輸控制協定或 TCP)下面的核心網絡層協定。TCP 上面是 socket 層,它是通過 SCI 進行調用的。

裝置驅動程式

依賴體系結構的代碼

繼續閱讀