1. 程式人生 > >一、linux 內核介紹

一、linux 內核介紹

ram soft shell 例子 自己 4.5 哪些 創建 mit

參考文檔:

  linux 內核剖析:https://www.ibm.com/developerworks/cn/linux/l-linux-kernel/

1.1 linux 內核歷史

  在 20 世紀 60 年代,MIT(Massachusetts Institute of Technology)和一些公司為 GE-645 開發了一個名為 Multics(Multiplexed Information and Computing Service)的實驗性的操作系統。這個操作系統的開發者之一 AT&T 後來退出了 Multics,並在 1970 年開發了自己的名為 Unics 的操作系統。與這個操作系統一同誕生的是 C 語言,C 語言就是為此而開發的,然後它們使用 C 語言對操作系統進行了重寫,使操作系統開發具有可移植性。

  二十年後,Andrew Tanenbaum 創建了一個微內核版本的 UNIX?,名為 MINIX(代表 minimal UNIX),它可以在小型的個人計算機上運行。這個開源操作系統在 20 世紀 90 年代激發了 Linus Torvalds 開發 Linux 的靈感。

  linux 主要內核發行版簡史

  技術分享圖片

  Linux 快速從一個個人項目進化成為一個全球數千人參與的開發項目。對於 Linux 來說,最為重要的決策之一是采用 GPL(GNU General Public License)。在 GPL 保護之下,Linux 內核可以防止商業使用,並且它還從 GNU 項目(Richard Stallman 開發,其源代碼要比 Linux 內核大得多)的用戶空間開發受益。這允許使用一些非常有用的應用程序,例如 GCC(GNU Compiler Collection)和各種 shell 支持。

1.2 linux 內核簡介

  GNU/Linux 操作系統的基本體系結構:

  技術分享圖片

  • 用戶空間:用戶應用程序執行的地方
  • 內核空間:存放的是 Linux 內核,從上到下分為三層:
    • 系統調用接口:實現一些基本功能,如 read 和 write
    • 內核:內核代碼,獨立於體系結構的內核代碼,對Linux 支持的所有處理器體系結構來說是通用的
    • 依賴於體系結構的代碼:通常稱為 BSP(Board Support Package),這些代碼用作給定體系結構的處理器和特定於平臺的代碼。  
  • GNU C Library (glibc)也存放在用戶空間
    • GNU C Library 提供了連接內核的系統調用接口,也提供了在用戶空間應用程序和內核之間進行轉換的機制。
  • 每個用戶空間的進程都使用自己的虛擬地址空間,內核占用單獨的地址空間。內核和用戶空間的應用程序使用的是不同的保護地址空間    

1.3 linux 內核屬性

  Linux 內核實現了很多重要的體系結構屬性。在或高或低的層次上,內核被劃分為多個子系統。Linux 也可以看作是一個整體,因為它會將所有這些基本服務都集成到內核中。

  • Linux 內核在內存和CPU使用方面有較高的效率,且非常穩定
  • 具有良好的移植性,Linux 編譯後可在大量處理器和具有不同體系結構約束和需求的平臺上運行。

1.4 linux 內核的主要子系統

  linux 內核的體系結構透視圖例子:

  技術分享圖片

1.4.1 系統調用結口

  SCI 層提供了某些機制執行從用戶空間到內核的函數調用。這個接口依賴於體系結構,甚至在相同的處理器家族內也是如此。SCI 實際上是一個非常有用的函數調用多路復用和多路分解服務。在 ./linux/kernel 中可以找到 SCI 的實現,並在 ./linux/arch 中找到依賴於體系結構的部分。

1.4.2 進程管理

  進程管理的重點是進程的執行。在內核中,這些進程稱為線程,代表了單獨的處理器虛擬化(線程代碼、數據、堆棧和 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 中可以找到依賴於體系結構的源代碼。

1.4.3 內存管理

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

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

為了支持多個用戶使用內存,有時會出現可用內存被消耗光的情況。由於這個原因,頁面可以移出內存並放入磁盤中。這個過程稱為交換,因為頁面會被從內存交換到硬盤上。內存管理的源代碼可以在 ./linux/mm 中找到。

1.4.4 虛擬文件系統

  虛擬文件系統(VFS)是 Linux 內核中非常有用的一個方面,因為它為文件系統提供了一個通用的接口抽象。VFS 在 SCI 和內核所支持的文件系統之間提供了一個交換層。

  VFS 在用戶和文件系統之間的交換層圖

  技術分享圖片

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

  文件系統層之下是緩沖區緩存,它為文件系統層提供了一個通用函數集(與具體文件系統無關)。這個緩存層通過將數據保留一段時間(或者隨即預先讀取數據以便在需要是就可用)優化了對物理設備的訪問。緩沖區緩存之下是設備驅動程序,它實現了特定物理設備的接口。

1.4.5 網絡堆棧

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

  socket 層是網絡子系統的標準 API,它為各種網絡協議提供了一個用戶接口。從原始幀訪問到 IP 協議數據單元(PDU),再到 TCP 和 User Datagram Protocol (UDP),socket 層提供了一種標準化的方法來管理連接,並在各個終點之間移動數據。內核中網絡源代碼可以在 ./linux/net 中找到。

1.4.6 設備驅動程序

  Linux 內核中有大量代碼都在設備驅動程序中,它們能夠運轉特定的硬件設備。Linux 源碼樹提供了一個驅動程序子目錄,這個目錄又進一步劃分為各種支持設備,例如 Bluetooth、I2C、serial 等。設備驅動程序的代碼可以在 ./linux/drivers 中找到。

1.4.7 依賴體系結構的代碼

  盡管 Linux 很大程度上獨立於所運行的體系結構,但是有些元素則必須考慮體系結構才能正常操作並實現更高效率。./linux/arch 子目錄定義了內核源代碼中依賴於體系結構的部分,其中包含了各種特定於體系結構的子目錄(共同組成了 BSP)。對於一個典型的桌面系統來說,使用的是 i386 目錄。每個體系結構子目錄都包含了很多其他子目錄,每個子目錄都關註內核中的一個特定方面,例如引導、內核、內存管理等。這些依賴體系結構的代碼可以在 ./linux/arch 中找到。

1.5 linux 內核的其他特性

  作為一個生產操作系統和開源軟件,Linux 是測試新協議及其增強的良好平臺。Linux 支持大量網絡協議,包括典型的 TCP/IP,以及高速網絡的擴展(大於 1 Gigabit Ethernet [GbE] 和 10 GbE)。Linux 也可以支持諸如流控制傳輸協議(SCTP)之類的協議,它提供了很多比 TCP 更高級的特性(是傳輸層協議的接替者)。

  Linux 還是一個動態內核,支持動態添加或刪除軟件組件。被稱為動態可加載內核模塊,它們可以在引導時根據需要(當前特定設備需要這個模塊)或在任何時候由用戶插入。

  Linux 的另一個增強是可以用作其他操作系統的操作系統(稱為系統管理程序)。2.6.30 後對內核進行了修改,稱為基於內核的虛擬機(KVM)。這個修改為用戶空間啟用了一個新的接口,它可以允許其他操作系統在啟用了 KVM 的內核之上運行。除了運行 Linux 的其他實例之外, Microsoft? Windows? 也可以進行虛擬化。惟一的限制是底層處理器必須支持新的虛擬化指令。

    

一、linux 內核介紹