[Linux內核設計與實現]Linux內核簡介

1969年,Dennis RitchieKen Thompsond等人發佈Unix系統,它是從貝爾實驗室一個失敗的多用戶操作系統Multics發展而來。1979年起加州大學伯克利分校開始推出Berkeley Software DistributionsBSD),1983ATT推出SystemV。這兩個版本成爲後來許多工作站和服務器廠商推出他們自己Unix版本的基礎,其中包括DigitalTru64HPHP-UnixIBMAIXSequentDYNIX/ptxSGIIRIXSunSolaris


由於最初一流的設計和以後多年的創新和逐步提高,Unix系統成爲了一個強大、健壯和穩定的操作系統。它擁有以下特點:首先,Unix很簡潔。Unix僅僅有幾百個系統調用並且有一個非常明確的設計目的。第二,在Unix中,所有的東西都被當作文件對待。這種抽象使對數據和對設備的操作是通過一套相同的系統調用界面進行:open()read()write()ioctl()close()。第三,Unix的內核和相關的系統工具軟件使用C語言編寫。這個特點使其具有很好的移植能力,並且使廣大的開發人員很容易接受。第四,Unix的進程創建非常迅速,並且有一個非常獨特的fork()系統調用。最後,Unix提供了一套非常簡單但很穩定的進程間通信元語。快速簡潔的進程創建過程使Unix的程序把目標放在一次執行集中完成一個任務上,而簡單穩定的進程間通信機制又可以保證這些獨立的簡單程序可以方便地組合在一起,從而完成複雜的多重任務。


1991年,Linus Torvalds發佈Linux系統。由於其開放性,Linux很快吸引了很多開發者對其代碼進行修改和完善。Linux克隆了Unix,但Linux不是Unix。儘管Linux借鑑了Unix的許多設計並且實現了UnixAPIPosix標準),但Linux沒有像其他Unix變種那樣直接使用Unix的源代碼。必要的時候,Linux的實現甚至與Unix的實現大相徑庭,但它完整的表達了Unix的設計目標,並且保證了應用程序編程界面的一致。Linux系統的基礎是內核、C庫、編譯器、工具集和系統的基本工具。


操作系統是指整個系統中負責完成最基本功能和系統管理的那部分,包括內核、設備驅動程序、啓動引導程序、命令行shell或者其他類似的用戶界面、基本的文件管理工具和系統工具。系統其他部分必須依靠操作系統提供的服務工作,比如管理硬件設備,分配系統資源等。內核有時候被稱爲超級管理者或者操作系統核心。通常一個內核由負責響應中斷的中斷服務程序,負責管理多個進程從而分享處理器時間的調度程序,負責管理進程地址空間的內存管理程序和網絡、進程間通信等系統服務程序共同組成。


對於提供保護機制的現代操作系統來說,內核獨立於普通應用程序,它一般處於系統狀態,擁有受保護的內存空間和訪問硬件設備的所有權限。這種系統態和被保護起來的內存空間,統稱爲內核空間。相對的,應用程序在用戶空間執行。它們只能看到允許它們使用的部分系統資源,並且不能使用某些特定的系統功能,不能直接訪問硬件設備,還有其他一些使用限制。當內核運行的時候,系統以內核態進入內核空間,相反,普通用戶程序以用戶態進入用戶空間。如圖1.1所示。內核還負責管理系統的硬件設備。現在的幾乎所有的體系結構,包括全部的Linux支持的體系結構,都提供了中斷機制。當硬件設備想與系統通信時,它首先發出一個異步的中斷信號去打斷內核正在執行的工作。中斷通常對應着一箇中斷號,內核通過這個中斷號查找相應的中斷服務程序,並調用這個程序響應和處理中斷。


操作系統內核可以分爲兩大設計陣營:單內核和微內核。所謂單內核就是把它從整體上作爲一個單獨的大過程來實現,並同時運行在一個單獨的地址空間。因此,這樣的內核通常以單個靜態二進制文件的形式存放於磁盤。所有內核服務都在這樣的一個大內核空間中運行。內核之間的通信是微不足道的,因爲大家都運行在內核態,並身處同一地址空間:內核可以直接調用函數,這與用戶空間沒有什麼區別。這種模式的支持者認爲單模塊具有簡單和高性能的特點。大多數Unix系統都設計爲單模塊。



另一方面,微內核並不作爲一個單獨的的大過程來實現。相反,微內核的功能被劃分爲獨立的過程,每個過程叫做一個服務器。理想情況下,只有強烈請求特權服務的服務器才運行在特權模式下,其他服務器都運行在用戶空間。不過,所有的服務器都保持獨立並運行在各自的地址空間。服務之間通過進程間通信(IPC)來實現。模塊化的系統允許一個服務器爲了另一個服務器而換出。因爲IPC機制的開銷比函數調用多,又因爲會涉及內核空間到用戶空間的上下文切換,因此,消息傳遞需要一定的週期,而單內核中簡單的函數調用沒有這些開銷。基於此,付之於實際的微內核系統讓大部分或者全部服務器位於內核,這樣,就可以直接調用函數,消除頻繁的上下文切換。Windows NT內核和MachMac OS X的組成部分)是微內核的典型實例。


Linux是一個單內核,也就是說,Linux內核運行在單獨的內核地址空間。不過Linux汲取了微內核的精華,其引以爲豪的是模塊化設計、搶佔式內核、支持內核線程以及動態裝載內核模塊的能力。不僅如此,Linux還避其微內核設計上性能損失的缺陷,讓所有的事情都運行在內核態,直接調用函數,無需消息傳遞。所以,Linux是模塊化的,多線程的以及內核本身可調度的操作系統。


Linux內核與Unix內核比較分析:

  • Linux支持動態加載內核模塊。儘管Linux也是單內核,可是允許在需要的時候動態的加載和卸載部分內核代碼。

  • Linux支持對稱多處理(SMP)機制。儘管許多Unix變體也支持SMP,但傳統的Unix並不支持這種機制。

  • Linux內核可以搶佔(preemptive)。與傳統Unix不同,Linux內核具有允許在內核運行的任務優先執行的能力。SolarisIRIX支持搶佔,大多數傳統Unix內核不支持搶佔。

  • Linux對線程支持的實現比較有意思:內核並不區分線程與進程。對於內核來說,所有的進程都一樣,只不過其中的一些共享資源而已。

  • Linux提供具有設備類的面向對象的設備模型,熱插拔事件,以及用戶空間和設備文件系統(sysfs)。

  • Linux忽略了一些被認爲是設計的很拙劣的Unix特性,像STREAMS,還忽略了那些實際上已經根本不會使用的過是標準。

  • Linux體現了自由這個詞的精髓。

不管LinuxUnix有多大的不同,Linux身上都深深的打上了Unix烙印。



參考資料:

Linux內核設計與實現》第二版



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章