- 從零開始寫Linux內核:一書學透核心原理與實現
- 海納
- 3893字
- 2025-04-09 18:37:35
1.1 操作系統概述
操作系統的出現、應用和發展是幾十年來計算機領域最重大的進展。它是從無到有、從簡單到復雜逐步發展起來的。在這個過程中,出現了很多關于操作系統的基本概念和重要理論。
本節將簡述操作系統中最核心的概念,隨著編碼的不斷推進,很多概念的細節將會越來越清晰,到那時,相信讀者會對本節提到的概念有更加深入的理解。
1.1.1 功能和架構
操作系統有兩個核心職責:一是對硬件進行管理和抽象;二是管理應用并且為它們提供服務。
從硬件設備的角度看,現代計算機系統由各種各樣的物理設備組成,例如內存、GPU、網卡等。操作系統的首要職責就是對這些設備進行管理,只有這樣,軟件才有可能通過GPU進行圖像渲染,通過網卡訪問互聯網。其次,操作系統還要對這些資源進行抽象,從而向應用開發者提供統一的接口,方便開發者訪問和使用硬件資源。例如,開發者在創建進程時,只需要面向統一、巨大而且連續的虛擬地址空間進行編程,在32位系統上,虛擬地址空間為4GB,開發者不需要知道物理內存具體有多大、是什么型號的、物理內存地址是否連續等硬件細節。
從應用的角度看,所有的用戶應用都受操作系統管理。當新啟動一個應用進程的時候,操作系統會為它準備進程控制塊、內核??臻g、進程頁表等軟硬件資源,然后對所有的應用進程進行統一的調度管理。當進程退出時,操作系統負責回收內存資源、銷毀頁表、通知與該進程有關的其他進程,從而實現對應用進程的管理。
另外,操作系統提供了各種不同功能的接口(人們稱之為系統調用),以方便應用程序訪問和使用各種資源。例如,應用程序可以通過write接口向屏幕上打印字符串。
由此可以推斷,一個最基本的操作系統至少包含以下4個部分。
1)進程管理:負責創建進程、為進程分配資源、管理進程的調度,以及在進程退出時銷毀進程關聯的資源。
2)內存管理:管理物理內存的分配和回收,創建虛擬內存,向應用程序提供分配和回收內存的接口。
3)輸入/輸出管理:負責顯示器、鍵盤、鼠標等輸入/輸出設備的管理,將信息輸入到計算機系統中,經過運算和處理以后再輸出給用戶。磁盤數據的讀入/讀出也是輸入/輸出管理的一部分。
4)文件系統:提供文件的增刪查改等功能。在Linux的設計哲學中,強調一切皆是文件,它將網絡、管道都抽象成了文件,所以文件系統在Linux中扮演著極其重要的角色。
除了這些核心的功能以外,現代系統中還有網絡系統、AI加速器等更多復雜的模塊。隨著我們對操作系統的認識逐漸加深,讀者將會很容易推理出這些系統是如何與操作系統的核心模塊交互的。
人們把進程管理、內存管理、輸入/輸出管理文件系統等核心模塊統稱為操作系統內核,而把網卡、顯卡等設備的管理模塊統稱為設備驅動。在操作系統的發展歷史中,內核的設計主要有兩種思路,分別是宏內核(Macrokernel)和微內核(Microkernel)。
宏內核是一種將大多數操作系統服務和驅動程序集成在內核空間中的設計。進程管理、內存管理、文件系統管理、設備驅動等組件都作為內核的一部分運行,具有直接訪問硬件的權限。
宏內核的系統服務緊密集成,內核中的各個模塊可以直接操作硬件資源,因為減少了用戶態和內核態之間的切換,處理速度快。但它同時也有一些缺陷。首先是安全性,任何內核模塊的錯誤都可能導致整個系統崩潰,尤其是來自第三方的設備驅動程序,其安全性有可能影響到內核的整體穩定性。其次是內核體積大,針對不同平臺的移植難度較高。
微內核的內核空間僅包含最基本的服務(如進程通信和地址空間管理)。文件系統、設備驅動等服務則位于用戶空間,通過消息傳遞機制與內核通信。相比宏內核,微內核只將最基本的功能保留在內核中,其余作為獨立的服務運行,而且各服務組件相互獨立,運行在用戶空間,通過定義良好的接口通信。內核與用戶服務運行在不同的地址空間,增強了安全性。
但這種設計也帶來了以下三個問題。一是,用戶態與內核態頻繁切換,導致消息傳遞延遲;二是實現復雜,消息傳遞機制和同步問題增加了系統復雜度;三是會導致與直接操作硬件有關的效率下降。
宏內核的典型代表是Linux,微內核的典型代表包括Minix和Windows。這兩種設計并不是絕對對立的,現代操作系統設計往往采用混合內核的方式,試圖結合兩者的優點。
1.1.2 操作系統的發展歷史
操作系統的發展歷史可以追溯到電子計算機的早期時代,主要包括以下幾個階段。
1)手工操作階段(20世紀40年代~20世紀50年代):在最早的電子計算機(如ENIAC,1946年誕生)出現時,還沒有現代意義上的操作系統。程序員需要手動設置開關和插拔線纜來輸入程序指令和數據,然后觀察輸出結果。這一時期使用穿孔卡片和磁帶存儲程序。
2)批處理系統(20世紀50年代~20世紀60年代):為了提高效率,出現了批處理系統。用戶事先準備好程序和數據,通過穿孔卡片或磁帶提交給操作員,由操作員批量處理。計算機自動執行這些作業,完成后通知用戶取回結果。這個時期的代表有IBM的OS/360。
3)分時系統(20世紀60年代):分時操作系統允許多個用戶通過終端同時連接到一臺計算機,每個用戶都感覺好像獨占了計算機資源。這是多任務處理和交互式計算的開端,UNIX(1969年在貝爾實驗室誕生)是此時期的標志性成果。
4)實時操作系統(20世紀60年代~20世紀70年代):針對特定應用(如工業控制和航空航天)的實時操作系統(RTOS)被開發出來,其強調對外部事件的快速響應,保證數據處理的及時性。
5)個人計算機操作系統(20世紀70年代~20世紀80年代):隨著個人計算機的普及,出現了多種個人計算機操作系統,如CP/M、Apple Macintosh的System 1(1984年),以及后來主導市場的Microsoft MS-DOS(1981年)和Windows(1985年首次發布圖形界面版本)。
6)圖形用戶界面(GUI)的興起(20世紀80年代):Apple Macintosh和隨后的Windows 3.x推動了圖形用戶界面的廣泛使用,使得計算機對用戶更加友好。
7)現代操作系統與網絡(20世紀90年代至今):Linux(1991年)作為開源操作系統迅速崛起,成為服務器和部分桌面計算機的選擇。Windows 95及后續版本進一步普及了網絡功能和個人計算機的多媒體能力。隨著互聯網的發展,操作系統開始集成更強大的網絡和安全性特性。
8)移動操作系統(21世紀初至今):隨著智能手機和平板電腦的興起,iOS(2007年)和Android(2008年)成為移動設備上的主流操作系統,開啟了移動計算的新紀元。
9)云計算與跨平臺操作系統(21世紀10年代至今):云計算技術的成熟促進了操作系統向云端的遷移,例如Chrome OS,它強調通過網絡應用來完成大部分計算任務。同時,跨平臺操作系統(如Windows 10和macOS Catalina)開始支持運行原本為其他平臺設計的應用程序。
10)物聯網(IoT)操作系統(21世紀10年代至今):面向物聯網設備的輕量級操作系統(如FreeRTOS、RTOS、mbed OS等)為智能家居、可穿戴設備等物聯網應用的發展奠定了基礎。
操作系統的發展持續受到技術進步、用戶需求變化和新應用場景的驅動,不斷向著更高的效率、更好的用戶體驗和更強的安全性方向演進。
從操作系統的發展歷史中可以看出,Linux并不是一個憑空出現的偉大發明,它是基于歷史上的各種優秀實踐不斷演化而來的。早期的Linux和Minix有著密切的關系,事實上Linux最初就是在Minix操作系統的基礎上開發出來的。
Minix是由荷蘭計算機科學家Andrew Tanenbaum教授在1987年開發的一個操作系統,主要用于教學和研究目的。Minix是一個非常小巧的操作系統,只有幾千行代碼,但是其設計與實現思路非常精妙和先進。因此,Minix成為當時操作系統領域內的一個重要研究對象,也吸引了很多人的關注和研究。直到現在,Minix系統仍然在不斷地演進。作為一個優秀的微內核系統,Minix不僅具有研究價值,也有很重要的實用價值。
Linus Torvalds在1991年開始開發Linux操作系統的時候,初衷是想創建一個類似于UNIX的操作系統,以便進行編程和學術研究。當時,Linus使用的是一臺386處理器的PC,并且他已經接觸過Minix操作系統。因此,Linus選擇了Minix的設計和實現思路作為Linux的基礎,并采用了Minix的文件系統、進程調度等基本功能,同時,Linus還根據自己的需求和想法,對Minix的代碼進行了改進和優化,以使其更加適合自己使用??梢哉f早期的Linux和Minix之間具有非常緊密的關系。
隨著時間的推移,Linux內核經歷了許多版本的更新,每個版本都引入了一些新的功能和改進,以提高Linux的性能、穩定性和安全性。
在Linux發展的早期階段,有幾個重要的版本,它們的發布時間和相關特性如下所示。
1)Linux 0.01(1991年):這是第一個非公開發布的Linux版本,由Linus Torvalds在1991年9月發布。它只有幾千行代碼,實現了UNIX操作系統的基本功能。
2)Linux 0.12(1992年):是Linux內核的第一個公開發布版本。這個版本引入了文件系統、交換分區和進程調度等基本功能。本書也將以這個版本為目標,一步步地實現它。
3)Linux 0.95(1993年):引入了虛擬內存管理和TCP/IP協議棧等功能。這使得Linux可以更好地適應網絡環境,并提高了系統的性能和可靠性。
4)Linux 1.0(1994年):一個具有里程碑意義的版本。它引入了對多處理器系統和動態加載內核模塊的支持,同時加入了許多新的驅動程序和工具。這使得Linux可以更好地適應企業級服務器等領域的需求。
5)Linux 2.0(1996年):是一個比較成熟和穩定的版本。這個版本引入了SMP(Symmetric Multiprocessing,對稱多處理)和更多硬件設備(如SCSI和USB)的支持,同時加入了許多新的驅動程序和工具。
6)Linux 3.0(2011年):盡管版本號跳躍較大,但此版本主要是為了紀念Linux誕生20周年,同時也引入了一些新的特性,進行了一些功能改進。
7)Linux 4.0(2015年):新增了對新的CPU架構的支持,以及能更好地支持電源管理與容器技術(如Docker)。
8)Linux內核5.0(2019年):此版本繼續提升硬件支持,引入了多項安全增強措施,并優化了對現代硬件和云環境的支持。
隨著時間的推移,Linux逐漸成為一款功能強大、靈活、安全和高效的操作系統,并得到越來越多開發者和用戶的支持。Linux已經成為世界上最流行的操作系統之一,被廣泛應用于服務器、超級計算機、移動設備、嵌入式系統等領域。
了解了操作系統和Linux的基礎知識以后,接下來就著手開發Linux內核。
- pcDuino開發實戰
- Containerization with LXC
- Linux系統架構與運維實戰
- Linux網絡操作系統與實訓(第三版)
- 混沌工程:復雜系統韌性實現之道
- Windows Server 2019 Administration Fundamentals
- 網絡操作系統教程:Windows Server 2016管理與配置
- 嵌入式實時操作系統μC/OS原理與實踐
- Windows 7應用入門與技巧
- Linux命令行大全(第2版)
- 新編電腦辦公(Windows 10+ Office 2013版)從入門到精通
- 分布式高可用架構之道
- Linux 從入門到項目實踐(超值版)
- 統信UOS應用開發進階教程
- Linux內核修煉之道