首頁 > 後端開發 > C++ > 主體

作業系統開發(真相)

Mary-Kate Olsen
發布: 2024-09-19 18:17:11
原創
312 人瀏覽過

OS Development (The truth)

目錄

  • 簡介
  • 1.引導程式:開始一切
  • 2.進入核心:神奇發生的地方
  • 3.選擇您的語言
  • 4.安全:不要讓飛機墜毀
  • 5.最佳化速度
  • 6. 設定基本驅動程式
    • 6.1 視訊驅動程式
    • 6.2 鍵盤驅動
    • 6.3 I/O 驅動程式
  • 7.寫 Shell:使用者介面
  • 8.建立自訂檔案系統
  • 9.新增滑鼠驅動程式:點擊並移動
  • 10。建構一個簡單的 GUI
  • 11。處理視窗與事件
  • 12。建立記事本應用程式:從點擊到輸入
  • 13。最後的潤飾:讓它感覺像是作業系統

介紹

身為開發人員,從頭開始建立作業系統是最具挑戰性和最有價值的經驗之一。與高級應用程式開發不同,在高級應用程式開發中,幾乎所有內容都有一個庫,作業系統開發迫使您近距離工作,直接接觸硬件,手動管理內存,並控制機器運行方式的各個方面。

根據我的經驗,建立作業系統意味著深入了解彙編語言,與硬體搏鬥,並努力應對崩潰、重新啟動(特別是重新啟動)和長時間的調試會話。如果您認為偵錯引導程式很困難,請嘗試在沒有現代工具的情況下進行偵錯。作業系統的開發讓你多次質疑自己的人生選擇。

也就是說,讓我們將其全部分解,從引導程式到功能齊全的桌面環境,您可以在其中移動滑鼠並打開文字編輯器進行輸入。


1. 引導程式:開始

什麼是引導程式?

引導程式是任何作業系統開發之旅的第一步。當您的電腦開啟時,BIOS 接管並檢查您的硬件,然後將引導程式從磁碟載入到記憶體中。這個小程式的工作是讓 CPU 做好準備並將作業系統的核心載入記憶體。您必須用彙編語言編寫引導程序,因為在此階段您直接處理硬體。

當引導程式啟動時,CPU 處於16 位元實模式,這表示它只能尋址 1MB 記憶體。您需要做的第一件事是從磁碟加載核心並將其移動到記憶體。之後,引導程式將 CPU 切換到 32 位元保護模式,這就是樂趣開始的地方。切換模式需要設定全域描述符表(GDT)來管理記憶體段並啟用CPU控制暫存器中的保護啟用(PE)位元。如果你犯了這個錯誤,系統要嘛凍結,要嘛崩潰進入啟動循環,這種情況在我身上發生的次數比我願意承認的要多。

實模式與保護模式

實模式中,一切都是超級有限的-16位元暫存器,1MB記憶體訪問,沒有記憶體保護。這就是為什麼切換到保護模式如此重要。一旦進入保護模式,您的 CPU 就可以存取 32 位元暫存器、更大的記憶體定址以及多工處理和分頁(虛擬記憶體)等進階功能。引導程式就是為了讓這種轉變無縫發生。


2. 進入核心:神奇發生的地方

一旦 CPU 切換到保護模式,引導程式就會將控制權交給核心。核心是作業系統的核心,負責管理一切:硬體、記憶體、行程和系統資源。

核心啟動時,必須設定幾個關鍵系統:

  1. 分頁:這是一種記憶體管理方案,允許作業系統為每個進程提供自己的虛擬記憶體空間。如果沒有它,所有進程將共享相同的內存,這將導致災難。
  2. 中斷處理:核心需要處理中斷,中斷是來自硬體(如鍵盤或磁碟機)的訊號,表示某些事情需要立即關注。為此,您需要定義一個中斷描述符表(IDT),它將中斷映射到核心中的特定處理函數。
  3. 任務調度:在任何執行多個行程的作業系統中,核心需要一種方法來管理CPU時間。調度程序決定哪個程序獲得 CPU 時間以及何時獲得 CPU 時間,確保系統快速且有效率。

建立核心是一項漫長而複雜的任務,但它也是最有價值的任務之一。在這裡您可以看到作業系統的內部工作原理並控制機器行為的每個小細節。


3. 選擇您的語言

建立作業系統時,您必須為每個任務選擇正確的程式語言。 引導程式通常用組件編寫,因為您需要直接控制硬體。然而,一旦您處於保護模式並在核心上工作,大多數開發人員都會切換到 C,因為它為您提供低階控制,而無需在彙編中編寫所有內容。

有些開發人員使用C++進行核心開發,因為它提供了物件導向的功能,可以使管理複雜的系統變得更容易。然而,C++ 會帶來額外的開銷,而 C++ 中的記憶體管理在作業系統環境中可能會更加棘手。 C 為您提供系統程式設計所需的原始功能和簡單性。


4. 安全:不要讓飛機墜毀

在作業系統開發中,安全至關重要。與高級編程不同,在高級編程中,崩潰可能僅意味著錯誤訊息或應用程式關閉,而在作業系統開發中,崩潰通常意味著系統完全重新啟動。您直接使用內存,這意味著如果內存管理混亂,則可能會損壞系統資料、覆蓋重要結構或導致核心恐慌。

核心需要實現記憶體保護,以防止一個行程覆蓋另一個行程的記憶體。這是透過使用分頁來完成的,它將每個進程映射到自己的虛擬記憶體空間。如果你犯了這個錯誤,整個系統就會變得不穩定,你將需要花費數天的時間來尋找記憶體錯誤。相信我,我去過那裡。


5. 優化速度

速度是讓您的作業系統感覺反應迅速的關鍵因素。緩慢的核心意味著緩慢的系統,因此優化效能至關重要。以下是速度很重要的幾個關鍵領域:

  • 中斷處理:您應該設定硬體中斷,而不是不斷輪詢輸入(這會浪費 CPU 週期)。這樣,CPU 僅在有實際輸入時做出回應,例如按鍵或網路封包到達。
  • 任務調度:一個好的調度程序將有效地平衡進程之間的 CPU 時間,確保沒有進程佔用所有 CPU 時間而其他進程則挨餓。有許多不同的調度演算法可供選擇,例如循環基於優先權調度。
  • 延遲載入:不要一次將所有內容載入到記憶體中。實作需求分頁,其中只有實際使用的程式部分才會載入到記憶體中。這有助於節省記憶體並提高系統效能。

6. 設定基本驅動程式

現在核心已經運行,是時候建立驅動程式來與硬體互動了。驅動程式是作業系統和硬體之間的橋樑,允許作業系統與鍵盤、顯示器和磁碟機等裝置進行通訊。

6.1 視訊驅動

首先,您的作業系統可能會以文字模式啟動,在該模式下,您將字元直接列印到視訊記憶體(通常在位址 0xB8000)。這對於調試和基本輸出來說很好,但最終,您會想要轉向圖形使用者介面(GUI)。這需要一個視訊驅動程式來管理像素級控制、螢幕解析度和色彩深度。

設定視訊驅動程式是建立圖形作業系統的一大步,但它也是更複雜的任務之一,因為它涉及了解顯示硬體的工作原理以及管理每個畫面的大量資料。

6.2 鍵盤驅動

鍵盤驅動程式是互動式作業系統最重要的部分之一。當您按下某個按鍵時,鍵盤會向 CPU 發送掃描碼。鍵盤驅動程式的工作是將掃描代碼轉換為作業系統可以理解的字元或操作。這涉及為 IRQ1(鍵盤產生的硬體中斷)設定中斷處理程序。

一旦鍵盤驅動程式正常運作,您就可以開始建立更複雜的使用者介面,取得使用者的輸入並處理命令。

6.3 輸入/輸出驅動程式

I/O 驅動程式 可讓您的作業系統讀取和寫入磁碟。這對於載入程式、保存檔案和儲存資料等操作至關重要。起初,您可能會使用 BIOS 中斷與磁碟交互,但隨著作業系統的成熟,您會想要轉向更多

不依賴BIOS的高階I/O方法,例如直接與磁碟控制器通訊。


7. 寫 Shell:使用者介面

一旦你的基本驅動程式開始工作,就可以建立一個 shell – 讓使用者與作業系統互動的命令列介面 (CLI)。 shell 是使用者可以鍵入命令、執行程式以及與檔案系統互動的地方。

實現 shell 是令人興奮的一步,因為它是您的作業系統真正開始感受到互動性的第一個地方。您需要處理使用者輸入(來自鍵盤)、處理命令並執行程式。這也是您開始看到核心高效執行多任務和管理進程的能力的重要性的地方。


8. 建立自訂檔案系統

檔案系統 允許您的作業系統在磁碟上儲存和檢索資料。雖然您可以使用現有的檔案系統(例如 FAT 或 ext4),但建立自己的自訂檔案系統可以為您提供更多控制權,並且可能是一個有趣的挑戰。

基本檔案系統應該:

  • 在磁碟上分配空間用於新檔案。
  • 追蹤檔案名稱、檔案大小和元資料
  • 允許有效率地讀寫檔案。

隨著作業系統的發展,您還需要處理更進階的功能,例如:

  • 目錄:將檔案組織成層次結構。
  • 權限:控制誰可以讀取、寫入或執行檔案。
  • 碎片:處理分散在磁碟多個區域的檔案。

設計檔案系統很棘手,因為它涉及平衡效能、可靠性和易用性。設計不當的檔案系統可能會導致資料損壞、效能下降或浪費磁碟空間。


9. 新增滑鼠驅動程式:點擊並移動

現在您的作業系統已經有了 CLI 並且可以處理鍵盤輸入,是時候添加 滑鼠支援了。滑鼠驅動程式負責追蹤滑鼠的移動並將其轉換為螢幕上的操作,例如移動遊標或單擊按鈕。

建立滑鼠驅動程式涉及處理IRQ12、滑鼠產生的硬體中斷、處理行動資料。一旦安裝了滑鼠驅動程序,您就可以開始考慮建立圖形使用者介面(GUI)


10. 建構一個簡單的 GUI

圖形使用者介面 (GUI) 將您的作業系統從命令列介面轉變為看起來和感覺更像現代桌面環境的介面。在此階段,您需要建立使用者可以用滑鼠點擊的視窗、按鈕、選單和其他互動元素。

建立GUI 涉及管理圖形渲染(繪製視窗和圖示)、處理輸入事件(點擊、按鍵等),以及實作一個系統來管理多個視窗和應用程式。

首先,您的 GUI 可能非常基本-只有一個使用者可以與之互動的視窗。但隨著作業系統的成熟,您將需要添加更多進階功能,例如調整視窗大小、拖放功能和動畫。


11. 處理視窗和事件

一旦掌握了 GUI 的基礎知識,下一步就是建立一個用於管理視窗和事件的系統。這涉及一次處理多個窗口,每個窗口可能運行不同的應用程序,並確保每個窗口接收正確的輸入事件(如滑鼠單擊或鍵盤按下)。

Vous devrez également implémenter le ordre z de la fenêtre (quelle fenêtre est en haut), la la réduction/l'agrandissement et le le glissement. C'est là que les choses commencent à ressembler davantage à un environnement de bureau traditionnel.


12. Création d'une application Bloc-notes : du clic à la saisie

Pour rendre votre interface graphique plus fonctionnelle, vous souhaiterez créer des applications de base, comme une application Notepad. L'application Notepad est un simple éditeur de texte qui permet aux utilisateurs de saisir, modifier et enregistrer des fichiers. Créer une application comme celle-ci implique :

  • Gestion de la saisie de texte depuis le clavier.
  • Rendu du texte à l'écran.
  • Autoriser les opérations de base sur les fichiers comme ouvrir, enregistrer et fermer.

C'est un excellent exercice pour tout mettre en place : votre interface graphique, votre système de fichiers et votre gestion des entrées entrent tous en jeu ici. Une fois que votre application Bloc-notes fonctionne, vous disposerez des bases d'un système d'exploitation pleinement fonctionnel.


13. Touches finales : donner l'impression d'être un système d'exploitation

À ce stade, votre système d'exploitation est fonctionnel, mais il y a toujours de petits détails qui le rendent plus raffiné. Des choses comme :

  • Comptes d'utilisateurs et autorisations : permettre à plusieurs utilisateurs d'avoir leurs propres paramètres et fichiers.
  • Réseau : ajout de la prise en charge de TCP/IP pour que votre système d'exploitation puisse se connecter à Internet.
  • Appels système : Création d'une interface que les applications peuvent utiliser pour interagir avec le noyau.

Chaque petit détail que vous ajoutez rapproche votre système d'exploitation de la sensation d'un système complet. C'est un processus long et difficile, mais à la fin, vous aurez créé quelque chose de vraiment unique : un système d'exploitation construit à partir de zéro.

以上是作業系統開發(真相)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:dev.to
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!