我上操作系統課(大二)的第就問我的老師,學完了這門課可以自己實現一個操作系統了嗎?老師說:”你可以基本掌握操作系統中要處理的主要問題,但是即使實現簡單的五臟俱全的操作系統還需要掌握很多很多東西,而且前提是你已經有很不錯的代碼能力。“回到題目上來,我們要實現一個簡單的操作系統,需要解決的是哪些問題?這個問題我相信翻開任何一本操作系統書都可以得到答案,一般都是操作系統書的前五,六章內容(章基本是操作系統概念及發展歷史)。
包括:
- 進程管理
- 存儲管理
- 文件系統
- 輸入/輸出
如果想寫個操作系統,除了理論知識外,動手之前先看看操作系統源代碼,Linux的代碼都是開源的,可以先學習學習。不過對于我們這種初學者千萬不要看的Linux內核代碼,因為那是很多人的杰作,可能一輩子都看不完。先看看國內同濟大學趙炯基于0.11的《Linux完全注釋》,即使只看懂30%也至會讓自己懂很多之前不知道的東西。
理論類的書很少有提到Bootload問題的,就是加電之后從哪里開始執行的部分。僅僅是這個步驟也需要花不少時間去了解CPU知識,匯編語言知識等,相當不容易。不話說回來,這部分如果能處理好之后會發現組成原理,匯編語言,微機原理的知識被自己運用到了,成就感巨大。這部分內容,可以參看MIT的課程6.828 Operating System Engineering的課程,Google一下就能搜到不少大牛關于這門課的博客。如果英語不太好我記得華中科技大學有一個叫32位操作系統實踐的課,資料都放到網上了,看起來很不錯。
過了這一關,用《深入理解計算機系統》加上《現代操作系統》看一下虛擬存儲器的內容,這兩本書這部分說得都很棒。虛擬存儲器的概念貫穿所有,如果能弄懂,對很多方面都有很大的幫助,不僅僅是操作系統這塊。有了虛擬存儲器概念之后對于鏈接,加載等知識理解就會深刻許多。 不過,這部分內容也需要對硬件部分有所了解,又是一坑。
之 后回到進程上來之后,終于可以把工作重心從硬件部分轉移過來了。但是我們又將面對進程創建,進程調度,進程通信三大問題,既然是簡單實現,就先不考慮線程 的事。算法書中會給很多,不過這些算法都是有一定的局限性,比如調度算法,對應的調度算法優劣差異很大,至于如何抉擇就看個人需求。不過話說回來,操作系 統里的”算法“和ACM里的算法在難度上差很多,還是比較容易實現的。
內容太多了,就不完全展開了,后面就看自己“耐力”了,寫操作系統是需要堅持很長實踐+大量知識積累的。有些問題還涉及到哲學的觀點,這里推薦上海交大鄒恒明教授的《操作系統之哲學原理》。除了理論方面的書,現在市面上也有直接教如何實現一個操作系統的,比如《Orange'S:一個操作系統的實現》和《30天自制操作系統》(僅有的幾本“XX天XX”而不是爛書的書),起步階段跟著這些書來還是很不錯的。總之,實現基本的功能也許可以做到。實現功能強大,魯棒性強的操作系統極難。不過在此過程中學到了很多很多東西。無論能否實現屬于自己的操作系統,在此過程中收獲的知識是一筆寶貴的財富。