你目前正在閱讀的的文章目的是幫助你回答一個問題比較簡單,但非常重要的問題:你真的準備開發作業系統?對一些愛好者來說實際上是高要求,浪費時間,同時回報太晚的工作。許多業餘作業系統項目最終抵達一條死胡同,慢慢被它的創造者遺棄,因為他們不能足夠理解方向在哪裡,並且所寫的代碼設計不良,也不能有效維護,或者當需要花費大量時間開始小小的malloc() 工作時就不知所措而屈服了。
•我將帶來下一代計算革命:簡單地說:不會。答案長點就是:把自己視為一個小的研究團隊。你可以讓一些東西更有序,當然這只是在小規模的情況下。沒有大規模的支持,你的產品不會大規模分銷。是的,你不能為了吸引更多的觀眾而模擬一個現有的作業系統。
•我想精通一門程式語言,需要一些挑戰性的練習:有些人試圖通過作業系統開發來學習一種新的程式語言,認為為了真正理解語言需要挑戰。這也不是一個好主意。
———-首先,通過作業系統開發之外的世界學習編程比通過作業系統開發學習語言更簡單些,你不應該高估自己承受挫折和壓力的的能力。
———-其次,由於是新的語言,你會犯更多的錯誤,而且低層開發比應用程式層的那些錯誤更難調試。如果是應用程式層,你可以通過小巧的工具,比如GDB和Valgrindthose來幫助你。
———-第三,因為你不會真正學習到程序語言本身,而只是學習到它的一個子集。 整個標準庫不能使用,除了一些像C一樣工作的語言之外,許多程序語言的特點是需要一個有時你不能提供的實時支持。舉例來說:C + +異常和虛函數表,C# 和Java的垃圾收集器( garbage collectors )和實時指針檢查, Pascal Object的動態數組和字符串… 這裡和這裡都有更多細節。
總之,編寫代碼是個很難的事情。當你編寫代碼的時候,受代碼所限你並不能真正學會那種程式語言。不要這樣做。
•實現一個新內核複雜的可怕,但有一條更容易的道路。我就將採用Linux原始碼,並且調整到直到我得到一個我需要的作業系統, 這不會那麼難:可能我是第一個通過展示main.c 文件將你引入Linux原始碼的人。你的第一個任務是定位實際的主要函數位置。你的第二個任務是理解每個提到的函數位置,理解它應該做什麼。你的第三個任務是花時間理解這一切。
正如你現在應該明白,離開了豐富的知識,要修改一個現成的,老的代碼庫真的很難很難。 代碼重複使用是一個非常崇高的目標,它有許多優點,但現在你必須明白,這不會讓你的生活變得更簡單,而是讓它變得更壞,因為你不但要了解整個內核開發,而且代碼庫的所有細節你都要看。
•我不想對Linux/Windows/Mac OS X中的X詳加敘述, 這些完全需要重新做:所有的現代作業系統都有自己的怪異模式,特別是桌面更是體現之一,這是毫無疑問的。另一方面,如果對他們的抱怨相對較小,你真的應該考慮貢獻補丁以修復相關項目,如果這個方法失敗就只有重寫失敗的組件。
•我正在尋找一份令人興奮的工作:比照. 我將帶來下一代計算革命: 除非你在一個作業系統研究室就職,否則你很難從你編寫的作業系統獲得金錢,因為很長一段時間它沒有得到實際應用。(這可能會維持很長一段時間)。
•我想實驗新的作業系統: 你有關於作業系統自己的想法,並且你在現有作業系統市場中找不到?業餘作業系統開發可能是一種嘗試方法,你可以實現你的想法,看看是否它在實踐中也能使用。
•我現在在語言方面很有經驗,並且正在尋找編程挑戰,或者想知道我的電腦最低水平怎樣:作業系統開發確實在很大程度上都能做到。 ,你將學習怎樣在比文字顯示設備調試軟體更難的情況下調試軟體, 學習到在沒有標準庫或者任何形式的輔助下怎樣做,為什麼有這麼多人對這個X86的架構,它在你的電腦運作良好,因為來自供應商的文檔太糟了。
•我一直都在作業系統上工作,知道它的代碼庫好,但卻有許多抱怨:如果處理這些抱怨將意味著重大變化,那種軟體不兼容,你可能除了付出別無選擇,雖然本文中描述的方式對作業系統開發不是一個完全有效的途徑(另一途徑當然比從零開始編寫一個全新的作業系統更有價值)。
•我想直接打補丁或者並行部分可對作業系統的改變實在太大:可以肯定的一點是在啟動一個新項目是最佳選擇。如果你認為你也需要這樣,那麼歡迎來到俱樂部。
•我正在尋找一個激動人心的業餘愛好:當然,這取決於你怎樣定義「激動」,但如果你準備充分,作業系統開發可以說是地球上最令人興奮的業餘愛好之一 。這有點類似於養育子女或種植植物: 當然,這很慢,有時它觸及你的神經,讓你感覺非常吃力不討好。但這會讓成功的感覺更好。另外,自己可以完全控制電腦的行為,擁有對硬體的絕對權力是極其有樂趣的。
除了問題階段,為了在這條路上獲得成功,這裡是一些你必須知道或者快速學習的事情:
•通用計算機科學:你必須熟悉並能流利地處理二進位和十六進位數字,布爾邏輯,數據結構(數組,連接,哈希表等),和排序算法。
•計算機系統結構:你應該知道的桌上型電腦全部內部組織。 詞句 ALU(算術邏輯單元),中斷,內存和PCI總線和DMA(直接內存訪問)對你應該不會神秘。更多自動化機制像TLB(旁路轉換緩衝多級緩存,或分支預測的知識長遠來說是非常寶貴的資產,一旦你試圖為性能而優化代碼。
•編譯器和可執行文件的內部:你必須大致知道在預處理,編譯,和連接二進位生成步驟中間要發生什麼,並且能找到需要在它的說明中控制的工具鏈。你還應該了解連結器腳本和可執行文件的內部結構。
•彙編語言:你必須知道彙編語言是什麼,它怎樣工作,你必須能夠簡單地編寫彙編程序(玩玩堆棧和寄存器,彙編語言:你必須知道彙編語言是什麼,它怎樣工作,你必須能夠簡單地編寫彙編程序(玩玩堆棧和寄存器,加減數,如果實現類似分支)。你可以用其他程式語言編寫作業系統的大部分,但有時你需要完成一些代碼片段組合工作。
•C或C++:即使您打算使用另一種程式語言來編寫的作業系統,但是為了理解網絡上的代碼你需要了解C或者C++,因為你會看到作業系統原始碼或者其它作業系統開發教程。
•您的系統程式語言:無論你計劃用C#,Java,彙編,BASIC,C語言,C++,Pascal,Erlang或REBOL編寫你的作業系統,你應該非常熟悉它。 其實,你甚至應該訪問它的內部結構描述。比如,你應該知道怎樣從彙編代碼中調用一個用你選擇的語言編寫的一個函數,你的語言需要什麼類型的實時支持,以及怎樣實現它。
(以上清單來自OSdev wiki,可以根據個人經驗調整。 )
這部分嚮導「你準備好了嗎?」結束了。如果你完成了這一點,恭喜你!你應該有正確的心態和足夠的知識,以開始業餘作業系統開發冒險。下一篇文章將解釋如何為你的作業系統項目設定的目標和期望,如果你真的想善終這真的是很重要的一步。