一起鑽進 Linux 核心看個究竟

安全劍客發表於2020-06-23
 核心看不見摸不著,而對於這類東西,我們經常無從下手。本文就以淺顯易懂的語言,帶你鑽進 Linux 核心,看它到底長啥樣。

Linux 核心,這個經常聽見,卻不不知道它具體是幹嘛的東西,是不是覺得非常神秘?

Linux 核心看不見摸不著,而對於這類東西,我們經常無從下手。本文就以淺顯易懂的語言,帶你鑽進 Linux 核心,看它到底長啥樣。

核心是 Linux 作業系統的核心元件,它向上連線應用程式,向下直接與硬體打交道。其程式碼主要由 C 語言及少量組合語言寫成,並且它可以適配多種多樣不同的硬體架構。

核心併發執行著一系列的程式,並管理著硬體的各種資源。具體來講,因為系統的資源有限,核心就為各個程式分配著諸如 CPU 時間、記憶體空間、網路連線等各方面的資源。

Linux 作業系統架構

下圖是一個典型的 Linux 作業系統架構圖。

一起鑽進 Linux 核心看個究竟一起鑽進 Linux 核心看個究竟

Linux 作業系統主要分成兩部分:

  • 使用者空間
  • 核心空間

1. 使用者空間

所有的使用者應用程式都是在使用者空間執行,它們不能直接訪問記憶體等硬體資源,而是間接透過核心來訪問。GNU C 庫(glibc)提供了從使用者空間切換至核心空間的機制。

2. 核心空間

核心直接管理著系統的 CPU、記憶體、輸入輸出裝置、網路裝置和其它的外圍裝置,它被分為不同模組來管理系統的不同操作,比如:檔案管理,記憶體管理,程式管理等等。

使用者空間的應用程式可以透過呼叫核心提供的 API 來訪問硬體資源。比如,對於檔案操作,我們可以呼叫 open() ,read() ,write() 等介面。

核心直接管理著硬體,又與硬體相互獨立,它可以透過簡單配置然後執行在 Intel,ARM ,Atemel 等晶片架構上。

Linux 核心主要子系統

根據核心的核心功能,Linux 核心提出了 5 個子系統,分別為:系統呼叫、程式管理、記憶體管理、檔案系統、網路管理,如下圖示:

一起鑽進 Linux 核心看個究竟一起鑽進 Linux 核心看個究竟

1. 系統呼叫(System Call Interface)

系統呼叫介面。程式排程子系統透過系統呼叫介面,將需要提供給使用者空間的介面開放出去,同時遮蔽掉不需要使用者空間程式關心的細節。

SCI 實際上是一個非常有用的函式呼叫多路複用和多路分解服務。在 ./linux/kernel 中您可以找到 SCI 的實現,並在 ./linux/arch 中找到依賴於體系結構的部分。

2. 程式管理(Process Management)

使用者空間有那麼多程式,如何讓他們有條不紊地進行著正是程式管理所要做的事。每個程式都要使用到 CPU 資源(如 CPU ,記憶體),但 CPU 資源畢竟有限,不可能讓某個程式一進獨佔著資源。

因此,程式管理就充當著管理員的角色,它排程著所有的程式,當需要選擇下一程式執行時,會由排程演算法來選擇最需要執行的程式。如果某個程式在等待其它硬體資源,則它就會被掛起。

因此,透過一系列的排程演算法,核心儘可能地公平地讓各個程式使用到 CPU 資源。

3. 記憶體管理(Memory Management)

記憶體管理主要提供對記憶體資源的訪問控制,以便讓各個程式可以安全地共享機器的記憶體資源。它提供了實體記憶體與虛擬記憶體的一種對映關係,因而不同的程式可以使用相同的虛擬記憶體,而這些相同的虛擬記憶體,可以對映到不同的實體記憶體上。這個對映關係主要由 MMU 來完成。

另外,記憶體管理會提供虛擬記憶體的機制,該機制可以讓程式使用多於系統可用的記憶體,不用的記憶體會透過檔案系統儲存在外部非易失儲存器中,需要使用的時候,再取回到記憶體中。

4. 虛擬檔案系統(Virtual File System)

核心隱藏了不同功能的外部裝置,例如硬碟、輸入輸出裝置、顯示裝置等等的具體細節,將它們抽象為可以透過統一的檔案操作介面(open、close、read、write等)來訪問,也就是我們所熟知的「一切皆檔案」。

隨著計算機技術的發展,歷史上出現了多種檔案系統,比如:FAT、FAT32、NTFS、EXT2、EXT3 等等。為了相容這些檔案系統,核心將它們抽象為統一的表現形式,這就是虛擬檔案系統的概念。

虛擬檔案系統可分為邏輯檔案系統和裝置驅動程式。邏輯檔案系統指 Linux 所支援的檔案系統,如ext2, fat等,裝置驅動程式指為每一種硬體控制器所編寫的裝置驅動程式模組。

5. 網路管理(Network Stack)

網路子系統在 Linux 核心中主要負責管理各種網路裝置,並實現各種網路協議棧,最終實現透過網路連線其它系統的功能。

網路介面提供了對各種網路標準協議的存取和各種網路硬體的支援。網路介面可分為網路協議和網路驅動程式兩部分。網路協議部分負責實現每一種可能的網路傳輸協議,網路裝置驅動程式負責與硬體裝置進行通訊,每一種可能的硬體裝置都有相應的裝置驅動程式。

小結

以上就是 Linux 核心的一些很基礎的知識,對於核心的學習還有非常多的內容,決不是一篇文章能夠寫完的。所以,對於核心的學習,需要多看書,多看影片,並自己動手去實踐,才能真正掌握。

原文地址:

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31559985/viewspace-2700249/,如需轉載,請註明出處,否則將追究法律責任。

相關文章