身為開發人員,從頭開始建立作業系統是最具挑戰性和最有價值的經驗之一。與高級應用程式開發不同,在高級應用程式開發中,幾乎所有內容都有一個庫,作業系統開發迫使您近距離工作,直接接觸硬件,手動管理內存,並控制機器運行方式的各個方面。
根據我的經驗,建立作業系統意味著深入了解彙編語言,與硬體搏鬥,並努力應對崩潰、重新啟動(特別是重新啟動)和長時間的調試會話。如果您認為偵錯引導程式很困難,請嘗試在沒有現代工具的情況下進行偵錯。作業系統的開發讓你多次質疑自己的人生選擇。
也就是說,讓我們將其全部分解,從引導程式到功能齊全的桌面環境,您可以在其中移動滑鼠並打開文字編輯器進行輸入。
引導程式是任何作業系統開發之旅的第一步。當您的電腦開啟時,BIOS 接管並檢查您的硬件,然後將引導程式從磁碟載入到記憶體中。這個小程式的工作是讓 CPU 做好準備並將作業系統的核心載入記憶體。您必須用彙編語言編寫引導程序,因為在此階段您直接處理硬體。
當引導程式啟動時,CPU 處於16 位元實模式,這表示它只能尋址 1MB 記憶體。您需要做的第一件事是從磁碟加載核心並將其移動到記憶體。之後,引導程式將 CPU 切換到 32 位元保護模式,這就是樂趣開始的地方。切換模式需要設定全域描述符表(GDT)來管理記憶體段並啟用CPU控制暫存器中的保護啟用(PE)位元。如果你犯了這個錯誤,系統要嘛凍結,要嘛崩潰進入啟動循環,這種情況在我身上發生的次數比我願意承認的要多。
在實模式中,一切都是超級有限的-16位元暫存器,1MB記憶體訪問,沒有記憶體保護。這就是為什麼切換到保護模式如此重要。一旦進入保護模式,您的 CPU 就可以存取 32 位元暫存器、更大的記憶體定址以及多工處理和分頁(虛擬記憶體)等進階功能。引導程式就是為了讓這種轉變無縫發生。
一旦 CPU 切換到保護模式,引導程式就會將控制權交給核心。核心是作業系統的核心,負責管理一切:硬體、記憶體、行程和系統資源。
核心啟動時,必須設定幾個關鍵系統:
建立核心是一項漫長而複雜的任務,但它也是最有價值的任務之一。在這裡您可以看到作業系統的內部工作原理並控制機器行為的每個小細節。
建立作業系統時,您必須為每個任務選擇正確的程式語言。 引導程式通常用組件編寫,因為您需要直接控制硬體。然而,一旦您處於保護模式並在核心上工作,大多數開發人員都會切換到 C,因為它為您提供低階控制,而無需在彙編中編寫所有內容。
一些開發人員使用C 進行核心開發,因為它提供了物件導向的功能,可以使管理複雜系統變得更容易。然而,C 語言會帶來額外的開銷,而 C 語言的記憶體管理在作業系統環境中可能會更加棘手。 C 為您提供系統程式設計所需的原始功能和簡單性。
在作業系統開發中,安全至關重要。與高級編程不同,在高級編程中,崩潰可能僅意味著錯誤訊息或應用程式關閉,而在作業系統開發中,崩潰通常意味著系統完全重新啟動。您直接使用內存,這意味著如果您搞亂內存管理,則可能會損壞系統資料、覆蓋重要結構或導致核心恐慌。
核心需要實現記憶體保護,以防止一個行程覆蓋另一個行程的記憶體。這是透過使用分頁來完成的,它將每個進程映射到自己的虛擬記憶體空間。如果你犯了這個錯誤,整個系統就會變得不穩定,你將需要花費數天的時間來尋找記憶體錯誤。相信我,我去過那裡。
速度是讓您的作業系統感覺反應迅速的關鍵因素。緩慢的核心意味著緩慢的系統,因此優化效能至關重要。以下是速度很重要的幾個關鍵領域:
現在核心已經運行,是時候建立驅動程式來與硬體互動了。驅動程式是作業系統和硬體之間的橋樑,允許作業系統與鍵盤、顯示器和磁碟機等裝置進行通訊。
首先,您的作業系統可能會以文字模式啟動,在該模式下,您將字元直接列印到視訊記憶體(通常在位址 0xB8000)。這對於調試和基本輸出來說很好,但最終,您會想要轉向圖形使用者介面(GUI)。這需要一個視訊驅動程式來管理像素級控制、螢幕解析度和色彩深度。
設定視訊驅動程式是建立圖形作業系統的一大步,但它也是更複雜的任務之一,因為它涉及了解顯示硬體的工作原理以及管理每個畫面的大量資料。
鍵盤驅動程式是互動式作業系統最重要的部分之一。當您按下某個按鍵時,鍵盤會向 CPU 發送掃描碼。鍵盤驅動程式的工作是將掃描代碼轉換為作業系統可以理解的字元或操作。這涉及為 IRQ1(鍵盤產生的硬體中斷)設定中斷處理程序。
一旦鍵盤驅動程式正常運作,您就可以開始建立更複雜的使用者介面,取得使用者的輸入並處理命令。
I/O 驅動程式 可讓您的作業系統讀取和寫入磁碟。這對於載入程式、保存檔案和儲存資料等操作至關重要。起初,您可能會使用 BIOS 中斷與磁碟交互,但隨著作業系統的成熟,您會想要轉向更多
不依賴BIOS的高階I/O方法,例如直接與磁碟控制器通訊。
一旦你的基本驅動程式開始工作,就可以建立一個 shell – 讓使用者與作業系統互動的命令列介面 (CLI)。 shell 是使用者可以鍵入命令、執行程式以及與檔案系統互動的地方。
實現 shell 是令人興奮的一步,因為它是您的作業系統真正開始感受到互動性的第一個地方。您需要處理使用者輸入(來自鍵盤)、處理命令並執行程式。這也是您開始看到核心高效執行多任務和管理進程的能力的重要性的地方。
檔案系統 允許您的作業系統在磁碟上儲存和檢索資料。雖然您可以使用現有的檔案系統(例如 FAT 或 ext4),但建立自己的自訂檔案系統可以為您提供更多控制權,並且可能是一個有趣的挑戰。
基本檔案系統應該:
隨著作業系統的發展,您還需要處理更進階的功能,例如:
設計檔案系統很棘手,因為它涉及平衡效能、可靠性和易用性。設計不當的檔案系統可能會導致資料損壞、效能下降或浪費磁碟空間。
現在您的作業系統已經有了 CLI 並且可以處理鍵盤輸入,是時候添加 滑鼠支援了。滑鼠驅動程式負責追蹤滑鼠的移動並將其轉換為螢幕上的操作,例如移動遊標或單擊按鈕。
建立滑鼠驅動程式涉及處理IRQ12、滑鼠產生的硬體中斷、處理行動資料。一旦安裝了滑鼠驅動程序,您就可以開始考慮建立圖形使用者介面(GUI)。
圖形使用者介面 (GUI) 將您的作業系統從命令列介面轉變為看起來和感覺更像現代桌面環境的介面。在此階段,您需要建立使用者可以用滑鼠點擊的視窗、按鈕、選單和其他互動元素。
建立GUI 涉及管理圖形渲染(繪製視窗和圖示)、處理輸入事件(點擊、按鍵等),以及實作一個系統來管理多個視窗和應用程式。
首先,您的 GUI 可能非常基本-只有一個使用者可以與之互動的視窗。但隨著作業系統的成熟,您將需要添加更多進階功能,例如調整視窗大小、拖放功能和動畫。
一旦掌握了 GUI 的基礎知識,下一步就是建立一個用於管理視窗和事件的系統。這涉及一次處理多個窗口,每個窗口可能運行不同的應用程序,並確保每個窗口接收正確的輸入事件(例如滑鼠單擊或鍵盤按下)。
您還需要實現視窗 z 排序(哪個視窗位於頂部)、最小化/最大化 和 拖曳。這就是事情開始感覺更像傳統桌面環境的地方。
為了讓您的 GUI 更實用,您需要建立基本應用程序,例如 記事本 應用程式。記事本應用程式是一個簡單的文字編輯器,允許使用者鍵入、編輯和儲存檔案。建立這樣的應用程式涉及:
這是將所有內容組合在一起的一個很好的練習:你的 GUI、你的檔案系統和你的輸入處理都在這裡發揮作用。一旦你有了一個可以運行的記事本應用程序,你就擁有了一個功能齊全的作業系統的基礎知識。
此時,您的作業系統已正常運行,但總有一些小細節讓它感覺更加精緻。諸如此類:
您新增的每個小細節都會讓您的作業系統更接近一個完整的系統。這是一個漫長而富有挑戰性的過程,但到最後,您將創建出真正獨特的東西 - 一個從頭開始構建的作業系統。
以上是作業系統開發(真相)的詳細內容。更多資訊請關注PHP中文網其他相關文章!