本書遵循早期權威的、完整的關於UNIX系統4.3BSD和4.4BSD版本的設計和實現的描述,這些UNIX系統是由加州大學伯克利分校開發的。自從伯克利在1994年發佈最終版本以來,幾個團隊一直在開發BSD。本書詳細介紹了FreeBSD,這個系統擁有最大的開發人員團體且發行最為廣泛。儘管FreeBSD發行版本在其基本系統中包含了近1000個實用程式,在其ports集合中包含了近25 000個可選實用程式,但本書幾乎完全集中在內核上。
類UNIX系統
類UNIX系統包括:傳統的供應商系統,如Solaris和HP-UX;基於Linux的發行版本,如Red Hat、Debian、Suse和Slackware;基於BSD的發行版本,如FreeBSD、NetBSD、OpenBSD和Darwin。它們可以在從智慧手機到最大的超級電腦的各種電腦上運行。它們是大多數多處理器、圖形和向量處理系統選擇的作業系統,並被廣泛用於分時這一最初目的。作為Internet上提供網路服務(從FTP到WWW)的最常用平臺,它們是有史以來開發的最具可攜性的作業系統。這種可攜性既歸功於它們的實現語言C [Kernighan & Ritchie, 1989](它本身就是一種廣泛移植的語言),又歸功於系統的優雅設計。
自1969年創始以來[Ritchie & Thompson, 1978],UNIX系統在幾個分分合合的支流中不斷發展。最初的開發人員繼續在AT&T貝爾實驗室開發第9版和第10版UNIX,以及UNIX第9版的後繼版本。與此同時,AT&T在將UNIX System V與Sun Microsystems的基於BSD的SunOS合併以生產Solaris之前,授權將UNIX System V作為產品。第9版UNIX、System V和Solaris都受到了加州大學伯克利分校電腦系統研究小組(CSRG)推出的伯克利軟體發行版本的強烈影響。儘管Linux作業系統是獨立於其他UNIX變體開發的,但它實現了UNIX介面。因此,在其他基於UNIX的平臺上開發的應用程式很容易移植到Linux上運行。
伯克利軟體發行版本(BSD)
BSD系統是第一個基於UNIX系統並引入許多重要功能的發行版本。這些重要功能包括:
按需分頁的虛擬記憶體支援。
硬體、I/O系統的自動配置。
快速、可恢復的檔案系統。
基於通訊端的進程間通信(IPC)原語。
TCP/IP的相關實現。
伯克利發行版本進入了許多供應商的UNIX系統,並被許多其他供應商的開發團隊在內部使用。TCP/IP網路通訊協定套件在4.2BSD和4.3BSD中的實現以及這些系統的應用,在推動TCP/IP網路通訊協定套件成為世界標準方面發揮了關鍵作用。甚至像微軟這樣的非UNIX供應商也在自己的Winsock IPC介面中採用了伯克利通訊端設計。
BSD的發佈對POSIX(IEEE std1003.1)作業系統介面標準和相關標準也有很大的影響。這在一些特性上尤為明顯,如可靠信號、作業控制、每個進程的多個訪問組以及目錄操作的常式,都是從BSD中改編後應用於POSIX的。
早期的BSD版本包含UNIX許可證代碼,因此要求接收者擁有AT&T原始程式碼許可證才能獲得和使用BSD。1988年,伯克利把它的發行版本分為AT&T授權的和可自由再發行的代碼。可自由再發行的代碼是單獨授權的,任何人都可以獲得、使用和重新分發。1994年伯克利發佈的最後一個可自由再發行的4.4BSD-Lite2版本包含了幾乎整個內核以及所有重要的庫和實用程式。
NetBSD和FreeBSD兩個小組萌芽於1993年,並開始支持和分發由伯克利開發的免費可再發行與構建的系統。NetBSD小組強調可攜性和極簡主義的方法,將系統移植到近60個平臺上,他們決心保持系統的精簡以易於相容嵌入式應用程式。FreeBSD小組強調最大限度地支援PC體系結構,推動其系統易於安裝,並向盡可能廣泛的用戶進行推廣。
1995年,OpenBSD組從NetBSD組中分離出來,開發了一個強調安全性的發行版本。2003年,Dragonfly組從FreeBSD組中分離出來,開發了一種羽量級的機制來支援多處理的發行版本。多年來,BSD發行版本之間處於良性競爭狀態,許多想法和大量代碼之間經常互通有無。
本書內容
本書介紹FreeBSD 11內核的內部結構以及實現FreeBSD系統功能所涉及的概念、資料結構和演算法,從系統調用層向下(從介面到內核,再到硬體本身)涵蓋FreeBSD的內容。該內核包括進程管理、內核安全、虛擬記憶體、I/O系統、檔案系統、通訊端IPC機制和網路通訊協定實現等系統模組。除了與終端介面、系統啟動有關的內容,系統調用層之上的知識,例如與庫、Shell、命令列、程式設計語言和其他使用者介面有關的內容都不在本書範圍之內。本書沿襲了Organick在編寫Multics作業系統書籍時首次採用的組織結構[Organick, 1975],是對現代作業系統的深入研究。
在涉及特定硬體時,本書參考了Intel 32位元體系結構和類似的AMD 64位元體系結構。由於FreeBSD加強了在這些體系結構上的開發,它們是獲得FreeBSD最全面支援的體系結構,因此十分便於參考。
電腦專業人士閱讀指南
FreeBSD被廣泛應用於全球許多公司的核心基礎體系結構。由於構建過程佔用空間較小,它在嵌入式程式中的應用場景也越來越多。FreeBSD的授權條款不要求對發生變更或功能增強的系統進行發佈,而Linux則要求以原始程式碼形式提供對內核的所有更改和增強。因此,需要控制其智慧財產權發佈的公司會使用FreeBSD構建產品。
本書主要針對使用FreeBSD系統工作的專業人員。技術人員和銷售支援人員可以瞭解該系統的能力和局限性,應用程式開發人員可以學習如何有效地和系統進行交互,經驗較少的系統管理員可以學習如何使用FreeBSD內核進行維護、調優和系統組態,系統程式師可以學習如何擴展、增強系統以及與系統交互。
不論是作業系統的開發者、系統程式師、UNIX應用程式開發人員、系統管理員還是沒有相關經驗的新手,都可以從本書中學習作業系統的相關知識。在閱讀本書的同時可以結合系統原始程式碼一起學習,這樣有助於理解得更透徹。本書既不是UNIX程式設計手冊,也不是用戶教程,如果熟悉某些版本的UNIX系統(參見Stevens[1992])和C程式設計語言(參見Kernighan & Ritchie[1989])的使用將會非常有幫助。FreeBSD手冊全面介紹了FreeBSD的創建、操作和程式設計[FreeBSD Mall, 2004; FreeBSD.org, 2014]。PC-BSD發行版本提供了FreeBSD安裝包,旨在使桌上型電腦和筆記型電腦用戶能夠輕鬆安裝和使用[Lavigne,2010;PC-BSD.org,2014]。
作業系統課程用書指南
本書適合用作參考書,為作業系統基礎課程的初級教材提供背景知識。本書不應用作作業系統入門教材,讀者應當已經瞭解過諸如“記憶體管理”“進程調度”“I/O系統”[Silberschatz等,2012]“網路通訊協定”[Comer,2000; Stallings,2000;Tanenbaum,2010]等術語,這些對於理解後面的某些章節會很有幫助。
本書可與FreeBSD系統的代碼一起使用,以用於更高級的作業系統課程。 學生作業內容可以包括對關鍵系統元件(如調度程式、分頁守護程式、檔案系統、執行緒信號、各種網路層、I/O管理等)的更改或替換。學生需要掌握如何從正在運行的內核中載入、替換和卸載模組,這樣無須反復編譯和重啟系統,從而提升實驗效率。通過使用真實的作業系統,學生可以直接測試其更改的效果。由於經歷了長達35年的代碼評審並且嚴格遵循編碼規範,FreeBSD內核比大多數相似的軟體專案更加乾淨、模組化、易於理解和修改。
每章的末尾都有習題,習題分為三個類別:不帶星號的習題可以直接從書中找到答案;帶有一個星號的習題需要根據書中介紹的概念進行推理,並給出解題步驟;帶有兩個星號的習題表示主要的設計項目或未解決的研究問題。
章節結構
本書主要討論作業系統的哲學、設計和實現的細節。通常來說,我們對這些內容的討論會從系統調用級別開始,然後才討論內核。書中的圖表用來闡明資料結構和控制流程,類似於用C語言的偽代碼來闡明演算法。
本書分為五部分,主要內容如下:
第一部分,概述。前三章主要介紹理解作業系統和本書其他部分內容所需的背景知識。第1章概述系統的發展歷史,強調系統的研究方向。第2章描述系統提供的服務,並概述內核的內部組織,討論系統開發過程中做出的設計決策。第3章說明系統調用如何執行,並詳細描述內核的一些基本服務。
第二部分,進程。第4章通過描述進程的結構,調度執行執行緒的演算法(這些執行緒構成了進程),以及系統中為確保駐留在內核中的資料結構的一致性訪問而設計的同步機制,為之後的章節奠定基礎。第5章介紹整個內核使用的安全性框架,並詳細介紹用於控制進程以安全獲取系統資源的方式,以及進程間互訪的安全性措施。第6章詳細討論虛擬記憶體管理系統。
第三部分,I/O系統。第7章介紹I/O的系統介面,並描述用來支援該介面的設施的結構。之後的4章詳細介紹I/O系統的主要內容。第8章描述Intel和AMD系統的I/O體系結構,並介紹如何管理I/O子系統,以及內核最初如何映射,後來又如何管理所連接設備的接入與斷開。第9章詳細介紹實現原始本地檔案系統的資料結構和演算法(該檔案系統直接與應用程式交互),以及如何將本地檔案系統與第8章中描述的設備介面相連接。第10章介紹Zettabyte檔案系統(已從OpenSolaris作業系統添加到FreeBSD)。第11章分別從伺服器端和用戶端角度介紹新的4.2版本的網路檔案系統。
第四部分,進程間通信。第12章描述在相關/不相關進程之間提供通信的機制。第13章和第14章緊密相關,因為後者使用了前者中說明的功能,例如協定中使用的UDP、TCP和SCTP等。
第五部分,系統運行。第15章從進程級別的角度描述從內核初始化到使用者登錄的系統初始化過程。
建議讀者按照以上各章的順序進行閱讀,但第一部分以外的其他部分彼此獨立,可以分開閱讀。第15章應該最後閱讀,但對於有經驗的讀者,單獨閱讀也是有幫助的。
本書的最後是術語表。每一章都包含參考文獻,其中引用了相關的材料。
致謝
我們要特別感謝Matt Ahrens(Delphix),感謝他對ZFS的工作原理提供了寶貴的意見,感謝他通過無數封電子郵件回答了我們關於ZFS如何工作以及為何要做出某些特定設計決策的問題。
我們也要感謝以下人員,感謝他們對內核的各個方面進行綜述,他們在這些方面都有著深入的研究。感謝John Baldwin(FreeBSD專案)在鎖、調度和虛擬記憶體方面的工作,感謝Alan Cox(萊斯大學)在虛擬記憶體方面的工作,感謝Jeffrey Roberson(EMC)在ULE調度器方面的工作,感謝Randall Stewart(Adara Networks)在SCTP實現方面的工作。
我們同時感謝以下人員,他們都閱讀並評價了本書各章的初稿:Eric Allman(加州大學伯克利分校),Jonathan Anderson(紐芬蘭紀念大學),David Chisnall(劍橋大學),Paul Dagnelie(Delphix),Brooks Davis(SRI國際),Pawe Jakub Dawidek(Wheel Systems),Peter Grehan(FreeBSD項目),Scott Long(Netflix),Jake Luck,Rick Macklem(FreeBSD項目),Ilias Marinos(劍橋大學),Roger Pau Monné(Citrix),Mark Robert Vaughan Murray,Edward Tomasz Napieraa(FreeBSD項目),Peter G. Neumann(SRI國際),Rui Paulo,Luigi Rizzo(義大利比薩大學),Margo Seltzer(哈佛大學),Keith Sklower(加州大學伯克利分校),Lawrence Stewart(斯威本科技大學),Michael Tuexen(明斯特應用科學大學),Bryan Venteicher(NetApp),Erez Zadok(石溪大學),Bjoern A. Zeeb(FreeBSD項目)。
我們還要感謝目前已退休的具有25年經驗的資深編輯Peter Gordon。儘管我們拖延了好幾年,但他依然相信我們有能力完成這本書。同樣要感謝我們的新編輯Debra Williams,她見證了本項目的完成,並在我們完成終稿後加快了出版速度。感謝Addison-Wesley出版集團和Pearson教育的所有專業人員,他們幫助我們完成了本書:執行編輯John Fuller,製作編輯Mary Kesel Wilson,封面設計師Chuti Prasertsith,文字編輯Deborah Thompson,校對員Melissa Panagos。最後,我們要感謝Jaap Akkerhuis的貢獻,感謝他為BSD類書籍設計了troff宏。
本書採用James Clark所實現的pic、tbl、eqn和groff等程式進行編寫。索引是由Jon Bentley和Brian Kernighan編寫的索引程式所產生的awk腳本生成的[Bentley & Kernighan, 1986]。大部分的版式是用xfig創建的,圖形佈局和未排滿行的消除是用groff宏處理的,但是孤行的消除以及偶數頁面底部的製作都必須手動完成。