日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

Linux 內(nèi)核剖析

系統(tǒng) 2304 0

http://www.ibm.com/developerworks/cn/linux/l-linux-kernel/

Linux 內(nèi)核剖析

歷史和體系結(jié)構(gòu)分析

M. Tim Jones , 顧問工程師, Emulex

?

簡介: ?Linux? 內(nèi)核是一個龐大而復(fù)雜的操作系統(tǒng)的核心,不過盡管龐大,但是卻采用子系統(tǒng)和分層的概念很好地進行了組織。在本文中,您將探索 Linux 內(nèi)核的總體結(jié)構(gòu),并學(xué)習(xí)一些主要的子系統(tǒng)和核心接口。您還可以通過其他 IBM 文章的鏈接更深入地進行學(xué)習(xí)。

由于本文的目標(biāo)是對 Linux 內(nèi)核進行介紹并探索其體系結(jié)構(gòu)和主要組件,因此首先回顧一下 Linux 的簡短歷史,然后從較高的層次審視 Linux 內(nèi)核的體系結(jié)構(gòu),最后介紹它的主要子系統(tǒng)。Linux 內(nèi)核具有超過 600 萬行的代碼,因此本文不可能進行完整的介紹。請使用指向其他內(nèi)容的鏈接進一步學(xué)習(xí)。

Linux 的簡短歷史

盡管 Linux 絕對是最流行的開源操作系統(tǒng),但是相對于其他操作系統(tǒng)的漫長歷史來說,Linux 的歷史非常短暫。在計算機出現(xiàn)早期,程序員是使用硬件語言在裸硬件上進行開發(fā)的。缺少操作系統(tǒng)就意味著在某個時間只有一個應(yīng)用程序(和一個用戶)可以使用這些龐大而又昂貴的設(shè)備。早期的操作系統(tǒng)是在 20 世紀(jì) 50 年代開發(fā)的,用來提供簡單的開發(fā)體驗。包括為 IBM 701 開發(fā)的 General Motors Operating System(GMOS)和 North American Aviation 為 IBM 709 開發(fā)的 FORTRAN Monitor System(FMS)。

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

二十年后,Andrew Tanenbaum 創(chuàng)建了一個微內(nèi)核版本的 UNIX?,名為 MINIX(代表 minimal UNIX),它可以在小型的個人計算機上運行。這個開源操作系統(tǒng)在 20 世紀(jì) 90 年代激發(fā)了 Linus Torvalds 開發(fā) Linux 的靈感(請參看圖 1 所示)。


圖 1. 主要 Linux 內(nèi)核發(fā)行版簡史
主要 Linux 內(nèi)核發(fā)行版簡史 ?

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

?

Linux 內(nèi)核簡介

現(xiàn)在讓我們從一個比較高的高度來審視一下 GNU/Linux 操作系統(tǒng)的體系結(jié)構(gòu)。您可以從兩個層次上來考慮操作系統(tǒng),如圖 2 所示。


圖 2. GNU/Linux 操作系統(tǒng)的基本體系結(jié)構(gòu)
 GNU/Linux 操作系統(tǒng)的基本體系結(jié)構(gòu) ?

最上面是用戶(或應(yīng)用程序)空間。這是用戶應(yīng)用程序執(zhí)行的地方。用戶空間之下是內(nèi)核空間,Linux 內(nèi)核正是位于這里。

GNU C Library (glibc)也在這里。它提供了連接內(nèi)核的系統(tǒng)調(diào)用接口,還提供了在用戶空間應(yīng)用程序和內(nèi)核之間進行轉(zhuǎn)換的機制。這點非常重要,因為內(nèi)核和用戶空間的應(yīng)用程序使用的是不同的保護地址空間。每個用戶空間的進程都使用自己的虛擬地址空間,而內(nèi)核則占用單獨的地址空間。 更多信息,請參看? 參考資料 ?一節(jié)中的鏈接。

Linux 內(nèi)核可以進一步劃分成 3 層。最上面是系統(tǒng)調(diào)用接口,它實現(xiàn)了一些基本的功能,例如? read ?和? write 。系統(tǒng)調(diào)用接口之下是內(nèi)核代碼,可以更精確地定義為獨立于體系結(jié)構(gòu)的內(nèi)核代碼。這些代碼是 Linux 所支持的所有處理器體系結(jié)構(gòu)所通用的。在這些代碼之下是依賴于體系結(jié)構(gòu)的代碼,構(gòu)成了通常稱為 BSP(Board Support Package)的部分。這些代碼用作給定體系結(jié)構(gòu)的處理器和特定于平臺的代碼。

?

Linux 內(nèi)核的屬性

在討論大型而復(fù)雜的系統(tǒng)的體系結(jié)構(gòu)時,可以從很多角度來審視系統(tǒng)。體系結(jié)構(gòu)分析的一個目標(biāo)是提供一種方法更好地理解源代碼,這正是本文的目的。

Linux 內(nèi)核實現(xiàn)了很多重要的體系結(jié)構(gòu)屬性。在或高或低的層次上,內(nèi)核被劃分為多個子系統(tǒng)。Linux 也可以看作是一個整體,因為它會將所有這些基本服務(wù)都集成到內(nèi)核中。這與微內(nèi)核的體系結(jié)構(gòu)不同,后者會提供一些基本的服務(wù),例如通信、I/O、內(nèi)存和進程管理,更具體的服務(wù)都是插入到微內(nèi)核層中的。每種內(nèi)核都有自己的優(yōu)點,不過這里并不對此進行討論。

隨著時間的流逝,Linux 內(nèi)核在內(nèi)存和 CPU 使用方面具有較高的效率,并且非常穩(wěn)定。但是對于 Linux 來說,最為有趣的是在這種大小和復(fù)雜性的前提下,依然具有良好的可移植性。Linux 編譯后可在大量處理器和具有不同體系結(jié)構(gòu)約束和需求的平臺上運行。一個例子是 Linux 可以在一個具有內(nèi)存管理單元(MMU)的處理器上運行,也可以在那些不提供 MMU 的處理器上運行。Linux 內(nèi)核的 uClinux 移植提供了對非 MMU 的支持。更詳細信息請參看? 參考資料 ?一節(jié)的內(nèi)容。

?

Linux 內(nèi)核的主要子系統(tǒng)

現(xiàn)在使用圖 3 中的分類說明 Linux 內(nèi)核的主要組件。


圖 3. Linux 內(nèi)核的一個體系結(jié)構(gòu)透視圖
Linux 內(nèi)核的一個體系結(jié)構(gòu)透視圖 ?

系統(tǒng)調(diào)用接口

SCI 層提供了某些機制執(zhí)行從用戶空間到內(nèi)核的函數(shù)調(diào)用。正如前面討論的一樣,這個接口依賴于體系結(jié)構(gòu),甚至在相同的處理器家族內(nèi)也是如此。SCI 實際上是一個非常有用的函數(shù)調(diào)用多路復(fù)用和多路分解服務(wù)。在 ./linux/kernel 中您可以找到 SCI 的實現(xiàn),并在 ./linux/arch 中找到依賴于體系結(jié)構(gòu)的部分。有關(guān)這個組件的更詳細信息可以在? 參考資料 ?一節(jié)中找到。

進程管理

進程管理的重點是進程的執(zhí)行。在內(nèi)核中,這些進程稱為 線程 ,代表了單獨的處理器虛擬化(線程代碼、數(shù)據(jù)、堆棧和 CPU 寄存器)。在用戶空間,通常使用 進程 ?這個術(shù)語,不過 Linux 實現(xiàn)并沒有區(qū)分這兩個概念(進程和線程)。內(nèi)核通過 SCI 提供了一個應(yīng)用程序編程接口(API)來創(chuàng)建一個新進程(fork、exec 或 Portable Operating System Interface [POSIX] 函數(shù)),停止進程(kill、exit),并在它們之間進行通信和同步(signal 或者 POSIX 機制)。

進程管理還包括處理活動進程之間共享 CPU 的需求。內(nèi)核實現(xiàn)了一種新型的調(diào)度算法,不管有多少個線程在競爭 CPU,這種算法都可以在固定時間內(nèi)進行操作。這種算法就稱為 O(1) 調(diào)度程序,這個名字就表示它調(diào)度多個線程所使用的時間和調(diào)度一個線程所使用的時間是相同的。 O(1) 調(diào)度程序也可以支持多處理器(稱為對稱多處理器或 SMP)。您可以在 ./linux/kernel 中找到進程管理的源代碼,在 ./linux/arch 中可以找到依賴于體系結(jié)構(gòu)的源代碼。在? 參考資料 ?一節(jié)中可以了解有關(guān)這個算法的更多內(nèi)容。

內(nèi)存管理

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

不過內(nèi)存管理要管理的可不止 4KB 緩沖區(qū)。Linux 提供了對 4KB 緩沖區(qū)的抽象,例如 slab 分配器。這種內(nèi)存管理模式使用 4KB 緩沖區(qū)為基數(shù),然后從中分配結(jié)構(gòu),并跟蹤內(nèi)存頁使用情況,比如哪些內(nèi)存頁是滿的,哪些頁面沒有完全使用,哪些頁面為空。這樣就允許該模式根據(jù)系統(tǒng)需要來動態(tài)調(diào)整內(nèi)存使用。

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

虛擬文件系統(tǒng)

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


圖 4. VFS 在用戶和文件系統(tǒng)之間提供了一個交換層
VFS 在用戶和文件系統(tǒng)之間提供了一個交換層 ?

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

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

網(wǎng)絡(luò)堆棧

網(wǎng)絡(luò)堆棧在設(shè)計上遵循模擬協(xié)議本身的分層體系結(jié)構(gòu)。回想一下,Internet Protocol (IP) 是傳輸協(xié)議(通常稱為傳輸控制協(xié)議或 TCP)下面的核心網(wǎng)絡(luò)層協(xié)議。TCP 上面是 socket 層,它是通過 SCI 進行調(diào)用的。

socket 層是網(wǎng)絡(luò)子系統(tǒng)的標(biāo)準(zhǔn) API,它為各種網(wǎng)絡(luò)協(xié)議提供了一個用戶接口。從原始幀訪問到 IP 協(xié)議數(shù)據(jù)單元(PDU),再到 TCP 和 User Datagram Protocol (UDP),socket 層提供了一種標(biāo)準(zhǔn)化的方法來管理連接,并在各個終點之間移動數(shù)據(jù)。內(nèi)核中網(wǎng)絡(luò)源代碼可以在 ./linux/net 中找到。

設(shè)備驅(qū)動程序

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

依賴體系結(jié)構(gòu)的代碼

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

?

Linux 內(nèi)核的一些有用特性

如果 Linux 內(nèi)核的可移植性和效率還不夠好,Linux 還提供了其他一些特性,它們無法劃分到上面的分類中。

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

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

Linux 最新的一個增強是可以用作其他操作系統(tǒng)的操作系統(tǒng)(稱為系統(tǒng)管理程序)。最近,對內(nèi)核進行了修改,稱為基于內(nèi)核的虛擬機(KVM)。這個修改為用戶空間啟用了一個新的接口,它可以允許其他操作系統(tǒng)在啟用了 KVM 的內(nèi)核之上運行。除了運行 Linux 的其他實例之外, Microsoft? Windows? 也可以進行虛擬化。惟一的限制是底層處理器必須支持新的虛擬化指令。更多信息請參看 參考資料 ?一節(jié)的內(nèi)容。

?

結(jié)束語

本文對 Linux 內(nèi)核體系結(jié)構(gòu)及其特性和功能進行了簡要介紹。有關(guān)內(nèi)核的詳細內(nèi)容,可以參考每個 Linux 發(fā)行版中附帶的 Documentation 目錄。請一定查看本文末尾的? 參考資料 ?一節(jié),了解有關(guān)本文中所討論主題的更詳細信息。

?

參考資料

學(xué)習(xí)

  • 您可以參閱本文在 developerWorks 全球站點上的? 英文原文 ?。

  • GNU 站點 ?介紹了 GNU GPL,它涵蓋了 Linux 內(nèi)核及其附帶的大量有用的應(yīng)用程序。另外還介紹了一個比 GPL 限制更少的許可 Lesser GPL (LGPL)。

  • UNIX 、? MINIX ?和? Linux ?在 Wikipedia 上都有介紹,另外還詳細介紹了操作系統(tǒng)系列。

  • GNU C Library ,即 glibc,是標(biāo)準(zhǔn) C 庫的實現(xiàn)。它用于 GNU/Linux 操作系統(tǒng),也可用于? GNU/Hurd ?微內(nèi)核操作系統(tǒng)。?

  • uClinux ?是 Linux 內(nèi)核的一個移植,它可以在一些缺少 MMU 的系統(tǒng)上執(zhí)行。這允許 Linux 內(nèi)核在很小的嵌入式平臺上運行,例如 PalmPilot PalmPilot Personal Digital Assistants (PDAs) 上使用的 Motorola DragonBall 處理器。?

  • 使用 Linux 系統(tǒng)調(diào)用的內(nèi)核命令 ”(developerWorks,2007 年 3 月)對 SCI 進行了介紹,這是 Linux 內(nèi)核中非常重要的一層,具有 glibc 的用戶空間支持,可以在用戶空間和內(nèi)核之間啟用函數(shù)調(diào)用。?

  • Linux 調(diào)度器內(nèi)幕 ”(developerWorks,2006 年 6 月)介紹了 Linux 2.6 中引入的新 O(1) 調(diào)度程序,這是一個非常高效的算法,可以擴展到很大數(shù)量的進程(線程),并且可以利用 SMP 系統(tǒng)。?

  • 使用 /proc 文件系統(tǒng)來訪問 Linux 內(nèi)核的內(nèi)容 ”(developerWorks,2006 年 3 月)介紹了 /proc 文件系統(tǒng),這是一個虛擬文件系統(tǒng),為用戶空間的應(yīng)用程序提供了一種全新的方法與內(nèi)核進行通信。這篇文章展示了 /proc 以及可加載內(nèi)核模塊。

  • 服務(wù)器診所: 使虛擬文件系統(tǒng)工作 ”(developerWorks,2003 年 4 月)深入介紹了 VFS 層,它允許 Linux 通過一個通用接口支持各種不同的文件系統(tǒng)。這個相同的接口也可以用于其他類型的設(shè)備,例如 socket。

  • Linux 引導(dǎo)過程內(nèi)幕 ”(developerWorks,2006 年 5 月)介紹了 Linux 的引導(dǎo)過程,該過程將啟動一個 Linux 系統(tǒng),并且不管是從硬盤、軟盤、USB 內(nèi)存條還是通過網(wǎng)絡(luò)引導(dǎo)系統(tǒng),該過程是相同的。

  • Linux 初始 RAM 磁盤(initrd)概述 ”(developerWorks,2006 年 7 月)介紹了初始 RAM 磁盤,它將引導(dǎo)過程與所引導(dǎo)的物理介質(zhì)隔離開來。

  • 使用 SCTP 優(yōu)化網(wǎng)絡(luò) ”(developerWorks,2006 年 2 月)介紹了一種非常有用的網(wǎng)絡(luò)協(xié)議:流控制傳輸協(xié)議,它的操作與 TCP 類似,但是增加了很多有用的特性,例如消息傳遞、 多宿主和多流。如果您對網(wǎng)絡(luò)協(xié)議感興趣,那么 Linux 與 BSD 一樣,都是一種非常好的操作系統(tǒng)。

  • Linux slab 分配器詳解 ” (developerWorks,2007 年 5 月)介紹了 Linux 內(nèi)存管理中最有用的一個工具:slab 分配器。這種機制源自于 SunOS,不過它在 Linux 內(nèi)核中找到了合適的位置。

  • 虛擬 Linux ”(developerWorks,2006 年 12 月)介紹了 Linux 是如何充分利用具有虛擬化能力的處理器。

  • Linux 和對稱多處理 ”(developerWorks,2007 年 3 月)討論了 Linux 怎樣利用提供芯片級多處理能力的芯片。

  • 探索 Linux 內(nèi)核虛擬機 ”(developerWorks,2007 年 4 月)介紹了最近引入內(nèi)核的虛擬化技術(shù),它可以將 Linux 內(nèi)核轉(zhuǎn)換成其他虛擬化的操作系統(tǒng)的系統(tǒng)管理程序。

  • 有關(guān)在用戶空間對 Linux 進行編程的更多信息,請參考 Tim 撰寫的? GNU/Linux Application Programming ? 一書。

  • 在? developerWorks Linux 專區(qū) ?中可找到適合 Linux 開發(fā)人員的更多資源,包括? Linux 教程 ?以及上月? 讀者最喜歡的 Linux 文章和教程 。?

  • 隨時關(guān)注? developerWorks 技術(shù)活動和網(wǎng)絡(luò)廣播

獲得產(chǎn)品和技術(shù)

  • 利用可直接從 developerWorks 下載的? IBM 試用軟件 ?在 Linux 上構(gòu)建您的下一個開發(fā)項目。?

討論

關(guān)于作者

M. Tim Jones

M. Tim Jones 是一名嵌入式軟件工程師,他是? GNU/Linux Application Programming AI Application Programming 以及? BSD Sockets Programming from a Multilanguage Perspective ?等書的作者。他的工程背景非常廣泛,從同步宇宙飛船的內(nèi)核開發(fā)到嵌入式架構(gòu)設(shè)計,再到網(wǎng)絡(luò)協(xié)議的開發(fā)。Tim 是位于科羅拉多州 Longmont 的 Emulex Corp. 的一名顧問工程師。

Linux 內(nèi)核剖析


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 鄯善县| 西城区| 上高县| 邯郸市| 三明市| 龙川县| 灵武市| 阳东县| 普定县| 二连浩特市| 冕宁县| 伊春市| 和静县| 沂水县| 盐城市| 扎鲁特旗| 姜堰市| 美姑县| 浦江县| 巴塘县| 白银市| 罗江县| 辛集市| 上林县| 蓬安县| 黄浦区| 定结县| 富蕴县| 祥云县| 嘉黎县| 清远市| 浮梁县| 新泰市| 丁青县| 临清市| 黄陵县| 万安县| 博客| 调兵山市| 泰来县| 广东省|