OSDev Wiki——作業系統開發入門基礎(一)
本文翻譯自 OSDev.org
由於譯者水平有限,本文不免存在遺漏或錯誤之處。如有疑問,請查閱原文。
以下是譯文。
目錄
•1 Welcome•2 作業系統是什麼?•3 核心(kernel)是什麼?•4 shell
是什麼?•5 GUI 是什麼?
•5.1 桌面環境,視窗管理程式,元件庫
•5.2 論壇 GUI 相關的帖子
•6 為什麼要開發一個作業系統?•7 相關條目•7.1 文章
Welcome
歡迎加入到作業系統開發的行列,勇敢的開拓者們!
並不是所有人都會在這個領域取得“成功”,不少人甚至連作業系統開發的入門課都未透過。
不過,這或許並不會妨礙你更進一步,開創出下一個 Linux
或 Windows
?亦或是稍低一點的目標,MenuetOS
或 CP/M
?
無論你的目標為何,作業系統開發都是程式開發的巔峰,這是毋庸置疑的。不過,你並不孤獨。我們整個網站,包括網站論壇和該 Wiki,都是致力於作業系統開發的。
在這兒不僅僅是交流程式設計技巧,更是交流感情和友誼的地方。相信在學習過程中,你一定能與網路另一端的建立良好的友誼。
在作業系統開發中,想要取得“成功”,你該怎麼做呢?
首先,你應該閱讀一下 Getting Started 這篇文字。如果你打算使用 C/C++ 作為你的開發語言,那麼你需要構建 GCC Cross-Compiler。
而如果你偏愛其他語言,那麼你同樣得準備類似的工具(例如,編譯器)。這一切都得你自己付出精力。但是,用你喜歡的語言可能給你的工作帶來不少激勵和興奮。
祝你好運!
作業系統是什麼?
作業系統是一套軟體,控制對計算機系統的操作和資源。其主要功能包括:
•管理記憶體及其他系統資源。•實施安全管控和訪問控制策略。•排程和多程式與多執行緒。•啟動及關閉使用者程式,同時為這些使用者程式提供基本的系統服務。•提供基本的使用者介面和應用程式程式設計介面。
並不是所有的作業系統都提供所有這些功能。像 MS-DOS
這樣的單使用者系統並沒有程式排程功能,而像 eCOS
這樣的嵌入式系統則可能沒有使用者介面。
然而,作業系統不是:
•計算機硬體。•一個具體的應用程式如,字處理程式,Web 瀏覽器或遊戲。•一套工具(如在許多類 Unix
系統中廣泛使用的 GUN tools
)。•一套開發環境(儘管有些系統,比如 UCSD Pascal
、Smalltalk-80
自帶有直譯器和 IDE )。•一套圖形使用者介面(不少現代作業系統都整合有 GUI 介面)。
儘管大多數的作業系統在分發的時候都自帶有這樣或是那樣的工具,可這些工具本身並非是 OS 的必需元件。
一些作業系統如 Linux
,通常被封裝成不同的封包形式釋出, 不同的封包往往封裝有不同的工具套件和應用程式,在軟體組織方式也存在差異,這些不同的封裝的系統,一般稱為發行版(distributions)。
儘管如此,這些不同的發行版只是基於基本 OS 封裝有各自的工具套件而已,不應該被認為是不同型別的作業系統。
核心(kernel)是什麼?
作業系統核心是作業系統中使用者永遠無法看見的部分。
核心的基本功能是保證其他程式能正常執行。它負責處理硬體產生的事件(稱為中斷)、軟體產生的事件(系統呼叫)以及管理資源的訪問。
系統中斷硬體事件處理程式(中斷處理程式),舉例來說,就是記錄你按下的按鍵,並將它轉換成相應的字元儲存在緩衝區中,以便某些程式索取這些資料。
而系統呼叫則是由使用者級程式發起的,比如說開啟檔案,啟動其他程式的過程等等,都是在呼叫系統呼叫。每一個系統呼叫處理程式都會檢查使用者程式傳遞的引數是否合法,然後才進入系統內部,響應使用者程式請求。
大多數使用者程式(除了彙編程式)並不直接呼叫系統呼叫,而是使用標準庫,這些庫通常處理引數格式化和生成系統呼叫的任務(例如,C 函式 fopen()
最終是呼叫核心函式開啟檔案)。
另外,核心通常定義有一些抽象概念,比如檔案,程式,套接字,目錄等等。這些抽象概念用於記錄了上個會話的系統內部狀態,所以程式可以更加有效地處理新的操作會話。
shell 是什麼?
shell
是一個提供人機互動介面的特殊程式,通常整合到系統發行版中。從使用者角度來看,shell
往往因系統而異,在不同的系統上體現形式也不一樣(如:cmd 形式的命令列,檔案資源管理器等等);
不過,其主要功能不外乎以下幾點:
•允許使用者選擇一個程式啟動,同時可以選擇性地傳遞某些具體會話引數。•允許對本地儲存器進行一些瑣碎的操作,像列出目錄下的內容,跨系統檔案剪下和複製。
為了完成這些操作,shell
需要呼叫若干的系統呼叫,比如,“開啟檔案 x
;開啟檔案 y
,如果不存在就新建一個;讀取 X
的內容,寫入 Y
中,然後關閉 X
、Y
這兩個檔案,給標準輸出返回“操作完成”訊號 ”。
此外,shell
還可以被應用程式用來呼叫其他程式,靠其他程式來完成自身無法完成的工作(例如,生成“*.mp3”,取得某個程式的確切路徑等等)。
現代 shell
還具有不少其他額外的功能特性,
舉例如下:
•自動補全:按 TAB
鍵(或其他補全功能鍵),使用者輸入的字元會自動補全為有效的 shell 命令,檔名,目錄或其他內容。連續多次敲擊自動補全鍵,可列出當前所有可能的命令選項。•字元插入:使用者可以透過方向鍵在 shell
中移動游標位置。當游標位於一行命令中間時,此時便可將新的命令“插入”其中。•shell 命令歷史:透過 方向鍵
鍵和
鍵,使用者可以翻看之前輸入的命令列。•螢幕滾動:當輸出內容超過控制檯的行高時, shell
可以把輸出存入緩衝區中,以便使用者上下翻頁。•指令碼支援:一些 shell
具有訂製的指令碼語言,如 bash
,DOS
的批處理。•......
GUI 是什麼?
Graphical User Interface (GUI,圖形使用者介面),是作業系統最具視覺化的部分。其扮演的角色已然超出了一個簡單圖形繪製庫的範圍。GUI 的主要功能包括:
•捕獲使用者輸入事件(鍵盤,滑鼠等等)並將這些事件派遣給恰當的處理物件。•更新內部關於哪些內容需要顯示,顯示在哪個位置,螢幕哪個部分需要重新整理顯示的資訊。•更新螢幕的當前顯示內容,重新整理繪製必要的部分。•以自然、直觀的方式,響應使用者。
桌面環境,視窗管理程式,元件庫 當你在 KDE
或 Windows
開啟新的會話,那麼這便是一個桌面環境。
系統中負責組織眾多執行程式視窗,視窗縮放/關閉,視窗邊界,捲軸等等的,是視窗管理器。
最後,還需要有子系統負責繪製這些視窗元素,渲染螢幕顯示的文件等等,這便是我們常說的 元件庫。
不過,一些宣告式語言(例如,Mozilla 的 XUL ,Qt 的 QML)也可實現類似的功能。
論壇 GUI 相關的帖子
•Will you implement a GUI?•GUI design•Handling input events in GUI
為什麼要開發一個作業系統?
人們選擇開發一個 OS 的原因各異,但是,對於絕大多數開發者來說,可能有這幾條是共同的:
•獲得對機器完全地控制。
當在開發應用程式或其他使用者級程式時,開發者需要考慮其他人寫的程式碼,如作業系統,各種庫,其他程式等等。寫作業系統能讓人感到對機器的強有力控制。
•研究。
有相當一部分作業系統專案是家庭作業和研究專案。
想要在一年的期限內完成一個作業系統的作業,實在不是一個很好的想法,畢竟時間太緊張。而研究專案往往是為了改進、提高現有的作業系統。新手們經常犯的錯誤,往往是嚴重低估了從頭寫一個系統所需的時間。
•為了替代現在使用的系統。
或許是因為現有的系統無法滿足開發者的某些特定需求,或許是因為這些系統令人生厭(Linux 太過龐大,Windows 不夠穩定)。這可能是為了盈利目的,儘管這個週期將會十分漫長。
•因為開發作業系統是一個有趣的過程。
低階(語言)程式設計開發是一個充滿趣味和刺激的任務,所有的一切都需要你自己處理。
這似乎很困難,然而,正是因此而更加有趣。你可以知道所有這些是如何運作的,所有你程式內部的工作。
很可惜的是,不少作業系統專案都是不合理的條件下啟動的。
參見 Beginner Mistakes 列表。
相關條目
文章
•Required Knowledge•Beginner 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