OSDev Wiki——作業系統開發入門基礎(一)

StrokMitream發表於2021-08-26

OSDev Wiki——作業系統開發入門基礎(一)


本文翻譯自 OSDev.org

由於譯者水平有限,本文不免存在遺漏或錯誤之處。如有疑問,請查閱原文

以下是譯文。


目錄

1 Welcome2 作業系統是什麼?3 核心(kernel)是什麼?4 shell 是什麼?5 GUI 是什麼?

5.1 桌面環境,視窗管理程式,元件庫

5.2 論壇 GUI 相關的帖子

6 為什麼要開發一個作業系統?7 相關條目

7.1 文章


Welcome

歡迎加入到作業系統開發的行列,勇敢的開拓者們!

並不是所有人都會在這個領域取得“成功”,不少人甚至連作業系統開發的入門課都未透過。

不過,這或許並不會妨礙你更進一步,開創出下一個 LinuxWindows ?亦或是稍低一點的目標,MenuetOSCP/M

無論你的目標為何,作業系統開發都是程式開發的巔峰,這是毋庸置疑的。不過,你並不孤獨。我們整個網站,包括網站論壇和該 Wiki,都是致力於作業系統開發的。

在這兒不僅僅是交流程式設計技巧,更是交流感情和友誼的地方。相信在學習過程中,你一定能與網路另一端的建立良好的友誼。

在作業系統開發中,想要取得“成功”,你該怎麼做呢?

首先,你應該閱讀一下 Getting Started 這篇文字。如果你打算使用 C/C++ 作為你的開發語言,那麼你需要構建 GCC Cross-Compiler

而如果你偏愛其他語言,那麼你同樣得準備類似的工具(例如,編譯器)。這一切都得你自己付出精力。但是,用你喜歡的語言可能給你的工作帶來不少激勵和興奮。

祝你好運!

作業系統是什麼?

作業系統是一套軟體,控制對計算機系統的操作和資源。其主要功能包括:

管理記憶體及其他系統資源。實施安全管控和訪問控制策略。排程和多程式與多執行緒。啟動及關閉使用者程式,同時為這些使用者程式提供基本的系統服務。提供基本的使用者介面和應用程式程式設計介面。

並不是所有的作業系統都提供所有這些功能。像 MS-DOS 這樣的單使用者系統並沒有程式排程功能,而像 eCOS 這樣的嵌入式系統則可能沒有使用者介面。 然而,作業系統不是:

計算機硬體。一個具體的應用程式如,字處理程式,Web 瀏覽器或遊戲。一套工具(如在許多類 Unix 系統中廣泛使用的 GUN tools)。一套開發環境(儘管有些系統,比如 UCSD PascalSmalltalk-80自帶有直譯器和 IDE )。一套圖形使用者介面(不少現代作業系統都整合有 GUI 介面)。

儘管大多數的作業系統在分發的時候都自帶有這樣或是那樣的工具,可這些工具本身並非是 OS 的必需元件。

一些作業系統如 Linux,通常被封裝成不同的封包形式釋出, 不同的封包往往封裝有不同的工具套件和應用程式,在軟體組織方式也存在差異,這些不同的封裝的系統,一般稱為發行版(distributions)。

儘管如此,這些不同的發行版只是基於基本 OS 封裝有各自的工具套件而已,不應該被認為是不同型別的作業系統。

核心(kernel)是什麼?

作業系統核心是作業系統中使用者永遠無法看見的部分。 核心的基本功能是保證其他程式能正常執行。它負責處理硬體產生的事件(稱為中斷)、軟體產生的事件(系統呼叫)以及管理資源的訪問。

系統中斷硬體事件處理程式(中斷處理程式),舉例來說,就是記錄你按下的按鍵,並將它轉換成相應的字元儲存在緩衝區中,以便某些程式索取這些資料。

系統呼叫則是由使用者級程式發起的,比如說開啟檔案,啟動其他程式的過程等等,都是在呼叫系統呼叫。每一個系統呼叫處理程式都會檢查使用者程式傳遞的引數是否合法,然後才進入系統內部,響應使用者程式請求。

大多數使用者程式(除了彙編程式)並不直接呼叫系統呼叫,而是使用標準庫,這些庫通常處理引數格式化和生成系統呼叫的任務(例如,C 函式 fopen() 最終是呼叫核心函式開啟檔案)。

另外,核心通常定義有一些抽象概念,比如檔案,程式,套接字,目錄等等。這些抽象概念用於記錄了上個會話的系統內部狀態,所以程式可以更加有效地處理新的操作會話。

shell 是什麼?

shell是一個提供人機互動介面的特殊程式,通常整合到系統發行版中。從使用者角度來看,shell 往往因系統而異,在不同的系統上體現形式也不一樣(如:cmd 形式的命令列,檔案資源管理器等等);

不過,其主要功能不外乎以下幾點:

允許使用者選擇一個程式啟動,同時可以選擇性地傳遞某些具體會話引數。允許對本地儲存器進行一些瑣碎的操作,像列出目錄下的內容,跨系統檔案剪下和複製。

為了完成這些操作,shell 需要呼叫若干的系統呼叫,比如,“開啟檔案 x ;開啟檔案 y,如果不存在就新建一個;讀取 X 的內容,寫入 Y 中,然後關閉 XY這兩個檔案,給標準輸出返回“操作完成”訊號 ”。

此外,shell 還可以被應用程式用來呼叫其他程式,靠其他程式來完成自身無法完成的工作(例如,生成“*.mp3”,取得某個程式的確切路徑等等)。

現代 shell 還具有不少其他額外的功能特性,

舉例如下:

自動補全:按 TAB 鍵(或其他補全功能鍵),使用者輸入的字元會自動補全為有效的 shell 命令,檔名,目錄或其他內容。連續多次敲擊自動補全鍵,可列出當前所有可能的命令選項。字元插入:使用者可以透過方向鍵在 shell 中移動游標位置。當游標位於一行命令中間時,此時便可將新的命令“插入”其中。shell 命令歷史:透過 方向鍵 鍵和 鍵,使用者可以翻看之前輸入的命令列。螢幕滾動:當輸出內容超過控制檯的行高時, shell 可以把輸出存入緩衝區中,以便使用者上下翻頁。指令碼支援:一些 shell 具有訂製的指令碼語言,如 bashDOS 的批處理。......

GUI 是什麼?

Graphical User Interface (GUI,圖形使用者介面),是作業系統最具視覺化的部分。其扮演的角色已然超出了一個簡單圖形繪製庫的範圍。GUI 的主要功能包括:

捕獲使用者輸入事件(鍵盤,滑鼠等等)並將這些事件派遣給恰當的處理物件。更新內部關於哪些內容需要顯示,顯示在哪個位置,螢幕哪個部分需要重新整理顯示的資訊。更新螢幕的當前顯示內容,重新整理繪製必要的部分。以自然、直觀的方式,響應使用者。

桌面環境,視窗管理程式,元件庫 當你在 KDEWindows 開啟新的會話,那麼這便是一個桌面環境。 系統中負責組織眾多執行程式視窗,視窗縮放/關閉,視窗邊界,捲軸等等的,是視窗管理器。

最後,還需要有子系統負責繪製這些視窗元素,渲染螢幕顯示的文件等等,這便是我們常說的 元件庫。

不過,一些宣告式語言(例如,Mozilla 的 XUL ,Qt 的 QML)也可實現類似的功能。

論壇 GUI 相關的帖子

Will you implement a GUI?GUI designHandling input events in GUI

為什麼要開發一個作業系統?

人們選擇開發一個 OS 的原因各異,但是,對於絕大多數開發者來說,可能有這幾條是共同的:

獲得對機器完全地控制。

當在開發應用程式或其他使用者級程式時,開發者需要考慮其他人寫的程式碼,如作業系統,各種庫,其他程式等等。寫作業系統能讓人感到對機器的強有力控制。

研究。 有相當一部分作業系統專案是家庭作業和研究專案。

想要在一年的期限內完成一個作業系統的作業,實在不是一個很好的想法,畢竟時間太緊張。而研究專案往往是為了改進、提高現有的作業系統。新手們經常犯的錯誤,往往是嚴重低估了從頭寫一個系統所需的時間。

為了替代現在使用的系統。

或許是因為現有的系統無法滿足開發者的某些特定需求,或許是因為這些系統令人生厭(Linux 太過龐大,Windows 不夠穩定)。這可能是為了盈利目的,儘管這個週期將會十分漫長。

因為開發作業系統是一個有趣的過程。

低階(語言)程式設計開發是一個充滿趣味和刺激的任務,所有的一切都需要你自己處理。

這似乎很困難,然而,正是因此而更加有趣。你可以知道所有這些是如何運作的,所有你程式內部的工作。

很可惜的是,不少作業系統專案都是不合理的條件下啟動的。

參見 Beginner Mistakes 列表。

相關條目

文章

Required KnowledgeBeginner Mistakes

References

[1] OSDev.org: https://wiki.osdev.org/Main_Page
[2] 原文: https://wiki.osdev.org/Introduction
[3] 1 Welcome: #1
[4] 2 作業系統是什麼?: #2
[5] 3 核心(kernel)是什麼?: #3
[6] 4 shell 是什麼?: #4
[7] 5 GUI 是什麼?: #5
[8] 5.1 桌面環境,視窗管理程式,元件庫: #5.1
[9] 5.2 論壇 GUI 相關的帖子: #5.2
[10] 6 為什麼要開發一個作業系統?: #6
[11] 7 相關條目: #7
[12] 7.1 文章: #7.1
[13] 網站論壇: http://forum.osdev.org/
[14]  Getting Started: https://wiki.osdev.org/Getting_Started
[15]  GCC Cross-Compiler: https://wiki.osdev.org/GCC_Cross-Compiler
[16] Will you implement a GUI?: http://forum.osdev.org/viewtopic.php?t=8783
[17] GUI design: http://forum.osdev.org/viewtopic.php?t=9432
[18] Handling input events in GUI: http://forum.osdev.org/viewtopic.php?t=9448
[19] Beginner Mistakes: https://wiki.osdev.org/Beginner_Mistakes
[20] Required Knowledge: https://wiki.osdev.org/Required_Knowledge
[21] Beginner Mistakes: https://wiki.osdev.org/Beginner_Mistakes


相關文章