第一章 作業系統整體概述

田宇發表於2015-04-15

這一章屬於理論知識介紹,讓讀者從巨集觀的角度瞭解什麼是作業系統,一個日常生活中的作業系統會由哪幾部分組成。使讀者先從整體上對作業系統有個大概的認知。然後,介紹編寫一個作業系統所需要的知識。最後是關於本書作業系統的簡介。

我知道對於一本實踐型別的書籍,應該儘快讓讀者動手實踐。但是,沒有理論作為指導思想的話,這個作業系統其實走不了多遠。而且,隨著記憶的淡去,對一些概念的理解也會越來越模糊。考慮到這些因素,先用當下成熟的技術,重新詮釋這些模糊的概念後,再開始我們的實踐之旅。

PS:由於是在創作初期,文章可能會有錯誤、內容遺漏、闡述的不到位或者讀者想看而我沒有寫到的內容,希望大家多指點(留言或者發資訊給我都可以)。
考慮到以上原因,希望大家能夠關注或者推薦本書,讓更多的人學習到,並避免錯過之前內容的更新與補充

1.1 什麼是作業系統

何為作業系統?其實作業系統這個概念很寬泛;不論是辦公和生活使用的各類作業系統,還是機械工業生產製造使用的儀器儀表,都是含有作業系統的,哪怕只有一條指令的微控制器,也可以叫做嵌入式作業系統。從這個意義上理解,可以把作業系統和硬體區分開。要麼是隻有硬體電路的裸機,要麼是含有作業系統的硬體電路(這裡的硬體電路指含有處理器的可程式設計電路)。

對於只有一條指令的微控制器,將其稱之為作業系統,未免顯得這個作業系統有些太簡單了,以至於給人們的感覺,不像一個作業系統。在人們眼裡,作業系統應該是會有一個功能強大高效執行的核心、萬能的驅動程式、絢麗的操作介面和舒適簡潔的操作方式,以及方便實用的工具組成。可是在當年,作業系統只是一個連硬碟都沒有;甚至是,只有一些簡單的邏輯閘電路組成的怪物。其實作業系統也是有發展史的。

從作業系統的發展史來看。先從單任務系統,到批處理系統,再到後來的分時作業系統、實時作業系統、嵌入式作業系統,以及現在最流行的雲系統。作業系統隨著時代的發展,硬體的不斷更新換代。作業系統的功能會因為它的應用場景不同,而具有不同的特點。但它的根本目的依然是——為了方便人們對硬體裝置的互動和使用。

PS:由於是在創作初期,文章可能會有錯誤、內容遺漏、闡述的不到位或者讀者想看而我沒有寫到的內容,希望大家多指點(留言或者發資訊給我都可以)。
考慮到以上原因,希望大家能夠關注或者推薦本書,讓更多的人學習到,並避免錯過之前內容的更新與補充

1.2 作業系統結構

對於一款功能完善,方便易用的作業系統來說,它也是由一套龐大的結構組成的。

它的整體結構如下圖所示:

enter image description here 圖1-1

從圖1-1可以很明顯的看出來,作業系統分為核心層與應用層。核心層主要是由:引導啟動、記憶體管理、異常中斷處理、程式管理、裝置驅動、檔案系統等模組組成;而系統API庫和應用程式則屬於應用層的範疇。之所以將核心層和應用層分開,是因為核心層主要負責控制硬體裝置,分配系統資源,保持系統的穩定性,為應用層提供健全的介面支援等;應用層主要負責人性化的人機互動操作,絢麗的表現效果等更貼近人們生活的抽象表達。下面我們將對各個模組逐一進行介紹 。

  • 引導啟動

引導啟動是指在電腦上電經過BIOS自檢後,到跳轉至核心程式執行前,這中間執行的一段或幾段程式,這段程式主要用於電腦硬體的檢測和一些引數的配置,然後將這些內容提交給核心,核心對這些內容進行分析,並對核心自身進行配置。圖1-1中將引導啟動模組與其他核心層模組用橫線隔開,是考慮到引導啟動模組只是為了輔助核心啟動,而並非真正屬於核心。當進入核心後,載入程式就不再執行了。如果把核心比作衛星的話,那麼載入程式就相當於運載火箭,衛星進入軌道後,火箭就完成了它的使命。

曾經引導啟動程式分為兩部分——Boot和Loader。現在把這兩部分功能合二為一,統稱為BootLoader。

目前比較流行的引導啟動程式有:Grub,Lilo,Uboot等程式。他們的功能都比較強大,可以通過終端命令列與其進行簡單的互動,給我們控制核心的載入和使用提供了方便。

  • 記憶體管理

記憶體管理單元主要是為了將實體記憶體有效的管理起來,給其他模組提供記憶體(連續的或非連續的)、有效的地址變換和對映。

像Linux記憶體管理單元的夥伴演算法,算是一種穩定成熟的記憶體管理演算法,可以長時間保持記憶體的穩定分配,防止記憶體碎片過多。

還有記憶體線性地址空間的紅黑樹管理演算法,既兼顧搜尋時間損耗又兼顧插入時間損耗。這兩個時間損耗的區別是:搜尋時間損耗是將原有的線性搜尋轉換為樹狀搜尋,這樣會大大縮短搜尋的時間損耗。而插入時間損耗是將新建立的節點結構插入到樹狀結構中,但是,紅黑樹的特點是節點插入樹中後,會調整樹的高度或者說是深度。如果調整的波及範圍很廣的話,勢必會浪費時間。因此Linux選擇紅黑樹這種近似平衡樹來代替之前的AVL樹(絕對平衡樹)也是出於這方面的考慮。

  • 異常中斷處理

異常處理主要是指處理器執行程式時候產生的問題,比如說:除零,段溢位,頁錯誤,無效指令,除錯錯誤等等。這些異常有的是可以恢復的,有的是不可以恢復的,具體要根據錯誤型別和程式邏輯進行相應的處理。

中斷處理主要是指處理器接收到硬體裝置發來的中斷請求訊號等待處理器進行應答,並作出相應的處理。這部分內容和外圍的硬體裝置關係比較密切。它的處理效率會影響整體的執行速度,所以通常中斷處理會被分為中斷上部和中斷下部。中斷上部要求快速響應中斷,在取得必要的資料和資訊後,立刻恢復中斷現場,使處理器可以再次接收中斷訊號。中斷下部被用來處理剩下的中斷內容,像:資料解析、調整驅動程式狀態等更耗時的內容。為了讓更緊迫的程式優先執行,中斷下部還可以將處理內容放到一個程式裡去處理,這樣就可以讓更高優先順序的程式得到快速執行。

  • 程式管理

說道程式一定會有人想問程式和程式的區別,程式是靜靜的躺在檔案系統裡的二進位制程式碼,屬於非執行狀態。一旦把這個程式載入到處理器內執行就變成了程式。程式是程式的執行狀態,所以它會比程式多出很多在管理層面的東西。

提到程式管理功能主要的就是程式排程策略,一個好的程式排程策略會提高程式的執行效率和反應速度。在Linux裡從O1排程策略,到電梯排程策略,再到現在的CFS排程策略,逐漸的讓程式執行的越來越平均,越來越快。

程式管理的另一主要部分就是程式間通訊了,程式間通訊有很多種,如:SIGNAL訊號,管道,共享記憶體,訊號量等等,這些通訊機制各有特點,互相彌補不足。

  • 裝置驅動

隨著硬體裝置的不斷增多,花樣齊全,與之對應的裝置驅動程式也漸漸的佔據了作業系統的很大一部分空間。為了方便驅動人員的開發和使用,不管是Linux還是Windows都為驅動程式提供了一套或者幾套成熟的驅動框架供程式設計師使用。為了方便驅動程式的除錯和即插即用的靈活性以及給核心空間減輕容量負擔,漸漸的將驅動程式以模組的形式,動態的掛載到核心空間中。從而做到即插即用,這樣一來,大大減小了核心空間程式碼的佔用量。

裝置驅動程式會與記憶體管理、中斷處理、檔案系統以及程式管理共同協作。為了讓硬體裝置給應用程式提供介面,裝置驅動程式幾乎呼叫了核心層的所有資源,這也是開發作業系統的目的——方便人們與裝置互動。

  • 檔案系統

檔案系統是用於將機械硬碟的一部分扇區組織成一個方便管理的結構化單元。這裡的扇區也可以是記憶體塊,這樣就組成了一個RAMDisk(記憶體式硬碟)。這樣的一個記憶體式硬碟,與普通的機械硬碟的扇區相比,單單在讀寫檔案的速度上,就已經不是一個數量級上了。這種記憶體式硬碟的缺點是掉電資料丟失,但是與它的優點相比,這個缺點是完全可以克服的,像Linux的sys檔案系統,就是在RAMDisk中建立的。

檔案系統的種類也是紛繁複雜的,像上面提到的sys檔案系統,還有大家耳熟能詳的FAT類檔案系統,以及Linux的EXT類檔案系統,他們對扇區的組織形式各有特色,但都是為了給原生作業系統提供方便快捷的使用而設計的。

  • 系統API 庫

系統API庫介面有很多標準,比如Linux遵循的POSIX標準。對於不同的介面標準,其定義和封裝的函式實現是不一樣的。不管怎麼說,最終都是為了給應用程式提供簡單快捷便於使用的介面。

  • 應用程式

應用程式包括我們自己安裝的軟體和系統提供的軟體和服務。

在眾多應用程式中,比較特殊的一個應用程式就是視窗管理器。視窗管理器用於對圖形介面視窗的管理,包括:視窗的位置佈局、滑鼠鍵盤的訊息投遞、活動視窗仲裁等等。視窗的位置佈局負責調整視窗的比例、大小、最大化、最小化、關閉視窗等一系列與視窗的顯示效果有關的功能。鍵盤滑鼠的訊息投遞負責將接收到的鍵盤滑鼠訊息,通過視窗管理器對活動視窗的仲裁,然後再將訊息發往到活動視窗。活動視窗仲裁負責根據當前滑鼠的使用情況,選擇出正在使用的視窗作為活動視窗。

PS:由於是在創作初期,文章可能會有錯誤、內容遺漏、闡述的不到位或者讀者想看而我沒有寫到的內容,希望大家多指點(留言或者發資訊給我都可以)。
考慮到以上原因,希望大家能夠關注或者推薦本書,讓更多的人學習到,並避免錯過之前內容的更新與補充

1.3 寫作業系統需要的知識

作業系統作為與硬體裝置緊密相連的軟體程式,編寫作業系統所需要的知識,自然而然也會涉及軟體和硬體兩方面。

  • 硬體方面

首先,要根據我們的硬體電路掌握其處理器及其外圍硬體電路的組成。更通俗一點說,就是處理器和外圍電路是怎麼連線的。瞭解這些,應該就知道處理器如何對外圍硬體裝置進行控制及通訊了。對於ARM這類片上系統,每個晶片和外圍硬體電路的連結方法非常靈活,所以這一部分內容必須要掌握。但是,對於通用的PC平臺,處理器和外圍硬體電路的連結方法是基本是固定的,因此寫一個PC機的作業系統在外圍硬體電路的連線上,顯得沒有ARM片上系統平臺那麼重要。

其次,既然對外圍電路的連線清晰後,下一步就是閱讀外圍硬體裝置的晶片手冊。外圍硬體裝置的晶片手冊,它會詳細講解該晶片的硬體特性和通訊方式,以及晶片內部的暫存器功能,還有對暫存器的控制方法。在這一點上不管是什麼硬體平臺,外圍硬體裝置的晶片手冊都是同等的重要,不瞭解這部分內容,就無法知道如何與其進行通訊。對於系統開發人員,我們更關注的是如何與外圍硬體裝置通訊,怎麼控制他們的暫存器狀態。至於硬體手冊裡,對電路的連結和工作環境溫度等硬體特性指標,屬於硬體工程師關注的內容,對我們不太重要,一般情況下不必太關注。

所以,在硬體方面掌握處理器和外圍硬體裝置的晶片手冊以及外圍電路的連結,這樣在硬體方面基本就可以應付了。處理器手冊對控制系統執行,帶來了良好的解釋說明及技術支援;外圍硬體裝置的晶片手冊被用於編寫驅動程式。

  • 軟體方面

對於軟體方面,只要熟練運用匯編語言和C語言就足夠編寫作業系統了。

組合語言用於對處理器進行配置及控制。比如:配置處理器狀態,程式狀態切換,中斷和異常處理,裝置埠I/O操作等等一些必須對暫存器進行操作的功能,或者是對效能要求比較苛刻的場景。

C語言基本就是編寫作業系統的主要開發語言,它以簡單高效,使用靈活深受底層開發人員的喜愛。同時對於組合語言的巢狀和相互間的呼叫,也非常方便,只要根據C語言遵循的標準方法就能夠實現這些功能。

除了對開發語言的熟練使用意外,作業系統作為所有資源的管理者,一些高效靈活的演算法也是必不可少的。從基礎的連結串列結構,到樹狀結構,再到圖狀結構,根據不同的場景需求,都會出現在作業系統內。除了這些演算法以外,還有很多靈活的程式設計技巧。像核心異常處理程式的錯誤對照表,其原理是提前根據程式容易出錯的地方,寫出錯誤處理函式,並記錄出錯地址和錯誤處理地址,當錯誤發生時處理器會自動捕獲錯誤地址,作業系統可以根據錯誤地址跳轉到對應的處理地址處執行。這個過程需要對程式的執行地址進行巧妙的設計,運用連結指令碼劃分出程式的錯誤處理對照表。

綜上所述,寫一個作業系統需要的知識並不多,只需要組合語言和C語言並且能夠了解硬體電路圖和硬體晶片手冊就可以了。但是,為了讓作業系統執行的又快又穩,其中還需要不少高效的演算法,既兼顧空間開銷又兼顧效能損耗。所以,寫一個作業系統不難,難的是用巧妙的方法讓他執行的更高效更人性化。

PS:由於是在創作初期,文章可能會有錯誤、內容遺漏、闡述的不到位或者讀者想看而我沒有寫到的內容,希望大家多指點(留言或者發資訊給我都可以)。
考慮到以上原因,希望大家能夠關注或者推薦本書,讓更多的人學習到,並避免錯過之前內容的更新與補充

1.4 本書作業系統簡介

在瞭解作業系統的結構組成以及寫作業系統需要的知識後,這一節將介紹本書作業系統。

本書作業系統將Linux系統作為主要參考物件,其他作業系統為輔,寫出一個作業系統雛形,並使該作業系統執行在物理平臺上。這樣做的好處在於,既可以對學習程式碼量巨大的Linux核心有所幫助;又可以方便讀者在此作業系統的基礎上動手實踐,舉一反三。而且,用物理平臺代替虛擬平臺執行作業系統,會大大增加讀者的成就感和對作業系統的理解能力,並且能排除虛擬平臺與物理平臺的差異問題。下面將本作業系統分為引導啟動、核心層、應用層三部分,並進行逐一介紹。

  • 引導啟動

引導啟動程式將使用NASM組合語言編寫,實現U盤引導啟動,檔案系統識別,系統核心載入,獲得記憶體容量,獲得及設定顯示模式,處理器執行模式切換,頁表配置等功能,以實現從啟動到核心的跳轉,併為核心準備相應的硬體資訊和執行環境。這裡涉及的關鍵技術包括:BIOS中斷呼叫,VBE功能獲得和設定,FAT12檔案系統結構解析,E820記憶體地址分佈,U盤與磁碟的區別,處理器體系結構分析等。

  • 核心層

核心層部分,算是作業系統的重頭戲。正如上文中提到的,本系統將參考Linux核心,完成一個功能相對齊全的核心雛形。其中不乏涉及編譯和連結功能,用於將程式劃分出不同的程式碼空間。而且,核心配有記憶體管理模組,中斷/異常處理模組,程式管理模組,多核通訊模組,檔案系統模組,外部硬體裝置驅動等一些系統核心的重要組成部分。使之成為一個可以正常工作且功能完整的系統核心,並遵循POSIX介面標準,給應用層提供通用的程式設計介面。

  • 應用層

在應用層,實現了視窗管理器和一些常用的系統命令。視窗管理器將參考TWM(一款Linux下的輕量級視窗管理器)實現一個功能簡單的輕量級視窗管理器,具備管理視窗布局,滑鼠鍵盤資料傳送,焦點控制等功能。系統命令將會使用核心層提供的系統呼叫介面,實現切換目錄,建立檔案,執行程式,顯示目錄,關機等常用系統命令。

綜上所述,雖然本書作業系統參考了Linux系統,但是,並非直接對Linux系統進行裁剪而成的!只是因為這樣會方便讀者學習和過度,就像當年的Linux參考UNIX一樣,必須先有個健全的系統雛形,才能承載我們無邊無際的夢想。

PS:由於是在創作初期,文章可能會有錯誤、內容遺漏、闡述的不到位或者讀者想看而我沒有寫到的內容,希望大家多指點(留言或者發資訊給我都可以)。
考慮到以上原因,希望大家能夠關注或者推薦本書,讓更多的人學習到,並避免錯過之前內容的更新與補充

相關文章